Ik ben bezig met een iOS app te porten naar Android. Nu is dit een van de weinige keren dat ik bezig ben met Android, en heb ik dus nog niet veel ervaring met het opzetten van een connectie naar een webserivce.
Mijn iOS code is als volgt:
De bovenstaande code maakt gebruik van AFNetworking plugin en werkt perfect op iOS. Nu probeer ik dezelfde POST te doen op Android, maar ik krijg de authenticatie niet werkend. Ik maak gebruik van KSoap2, maar als er andere of betere suggesties zijn dan hoor ik het graag.
Mijn huidige code wat niet werkt:
Als ik deze code run in de simulator of op mijn Android device krijg ik de melding in de debugger:
org.ksoap2.transport.HttpResponseException: HTTP request failed, HTTP status: 401
Er zit dus ergens iets niet goed met de autheticatie lijkt me. Iemand enig idee hoe ik dit het beste kan oplossen? Ik hoef in principe niet KSoap2 te gebruiken, dus als er andere plugins zijn die beter werken of makkelijker zijn hoor ik het graag!
Mijn iOS code is als volgt:
Objective-C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| NSString *soapMsg = [NSString stringWithFormat: @"<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ns=\"http://www.schneider-electric.com/common/dataexchange/2011/05\">" @"<soap:Header/>" @"<soap:Body>" @"<ns:GetValuesRequest>" @"<ns:GetValuesIds>" @"<ns:Id>%@</ns:Id>" @"</ns:GetValuesIds>" @"</ns:GetValuesRequest>" @"</soap:Body>" @"</soap:Envelope>", ewsId]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:KUrl]]; [request addValue: @"application/soap+xml; charset=utf8" forHTTPHeaderField:@"Content-Type"]; [request addValue:[NSString stringWithFormat:@"%@", KUrl] forHTTPHeaderField:@"SOAPAction"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[soapMsg dataUsingEncoding:NSUTF8StringEncoding]]; NSURLCredential *credential = [NSURLCredential credentialWithUser:KTestUsername password:kTestPassword persistence:NSURLCredentialPersistenceForSession]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [operation.securityPolicy setAllowInvalidCertificates:YES]; [operation.securityPolicy setValidatesDomainName:NO]; [operation setCredential:credential]; |
De bovenstaande code maakt gebruik van AFNetworking plugin en werkt perfect op iOS. Nu probeer ik dezelfde POST te doen op Android, maar ik krijg de authenticatie niet werkend. Ik maak gebruik van KSoap2, maar als er andere of betere suggesties zijn dan hoor ik het graag.
Mijn huidige code wat niet werkt:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| String METHOD_NAME = "GetValues"; String SOAP_ACTION = constants.getSOAP_URL() + METHOD_NAME; SoapObject request = new SoapObject(constants.getNAMESPACE(), METHOD_NAME); request.addProperty("Id", ewsId); //Setup authorization Element usernameElement = new Element().createElement(constants.getNAMESPACE(), "Username"); usernameElement.addChild(Node.TEXT, constants.getSOAPUSERNAME()); Element passwordElement = new Element().createElement(constants.getNAMESPACE(), "Password"); passwordElement.addChild(Node.TEXT, constants.getSOAPPASSWORD()); Element header = new Element().createElement(constants.getNAMESPACE(), "AuthHeader"); header.addChild(Node.ELEMENT, usernameElement); header.addChild(Node.ELEMENT, passwordElement); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); //envelope.dotNet = true; envelope.setOutputSoapObject(request); envelope.headerOut = new Element[]{header}; //Also tried this didn't work :( /* List<HeaderProperty> headerList = new ArrayList<HeaderProperty>(); String auth = constants.getSOAPUSERNAME() + ":" + constants.getSOAPPASSWORD(); headerList.add(new HeaderProperty("Authorization", Base64.encode(auth.getBytes()))); */ HttpTransportSE transport = new HttpTransportSE(constants.getSOAP_URL()); transport.debug = true; try { //transport.call(SOAP_ACTION, envelope, headerList); transport.call(SOAP_ACTION, envelope); Log.d("XML", transport.requestDump); Log.d("XML", transport.responseDump); return "Soap successfull!"; } catch(Exception e) { Log.d("ERROR", "Error during soap action: " + e.toString()); return "Error!"; } |
Als ik deze code run in de simulator of op mijn Android device krijg ik de melding in de debugger:
org.ksoap2.transport.HttpResponseException: HTTP request failed, HTTP status: 401
Er zit dus ergens iets niet goed met de autheticatie lijkt me. Iemand enig idee hoe ik dit het beste kan oplossen? Ik hoef in principe niet KSoap2 te gebruiken, dus als er andere plugins zijn die beter werken of makkelijker zijn hoor ik het graag!