AFNetworking POST zu REST webservice
Kurze Hintergrundgeschichte, unsere früheren Entwickler verwendet ASIHTTPRequest, um POST-Anfragen und abrufen von Daten aus unserem webservice. Aus unbekannten Gründen diesem Teil unseres app aufgehört zu arbeiten. Schien wie eine gute genug Zeit, um für die Zukunft gerüstet und gehen mit AFNetworking. REST webservice läuft auf dem CakePHP framework.
Kurz gesagt, ich bin nicht der Empfang der request-response-string mit AFNetworking.
Ich weiß das webservice funktioniert, weil ich bin in der Lage, erfolgreich die post-Daten und erhalten Sie die richtige Antwort mit curl:
curl -d "data[Model][field0]=field0value&data[Model][Feld1]=field1value" https://example.com/api/class/function.plist
Pro die früheren Entwickler die Anweisungen, die ich kam mit die folgenden.
#import "AFHTTPRequestOperation.h"
…
- (IBAction)loginButtonPressed {
NSURL *url = [NSURL URLWithString:@"https://example.com/api/class/function.plist"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:[usernameTextField text] forHTTPHeaderField:@"data[User][email]"];
[request setValue:[passwordTextField text] forHTTPHeaderField:@"data[User][password]"];
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"operation hasAcceptableStatusCode: %d", [operation.response statusCode]);
NSLog(@"response string: %@ ", operation.responseString);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error: %@", operation.responseString);
}];
[operation start];
}
Ausgabe:
Betrieb hasAcceptableStatusCode: 200
der Antwort-string: eine leere plist-Datei
Lösungsversuch 1:
AFNetworking-Post-Request
die vorgeschlagene Lösung verwendet eine Funktion von AFHTTPRequestOperation genannt operationWithRequest. Jedoch, wenn ich versuche, die genannten Lösung bekomme ich eine Warnung " - Klasse die Methode '+operationWithRequest:Abschluss:' nicht gefunden (return type defaults to 'id'"
Lösungsversuch 2: NSURLConnection. Ausgabe: ich bin in der Lage, drucken Sie die Erfolg-log-Nachrichten, aber nicht die Antwort-string.
*update - gibt leere plist.
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSString *httpBodyData = @"data[User][email][email protected]&data[User][password]=awesomepassword";
[httpBodyData dataUsingEncoding:NSUTF8StringEncoding];
[req setHTTPMethod:@"POST"];
[req setHTTPBody:[NSData dataWithContentsOfFile:httpBodyData]];
NSHTTPURLResponse __autoreleasing *response;
NSError __autoreleasing *error;
[NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error];
//*update - returns blank plist
NSData *responseData = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"responseData %@",str);
if (error == nil && response.statusCode == 200) {
//Process response
NSLog(@"success");//returns success code of 200 but blank
NSLog(@"resp %@", response );
} else {
//Process error
NSLog(@"error");
}
- Hallo, Pouria, haben Sie versucht, mit NSURLConnection zu senden, die eine synchrone Anfrage?
- Lösungsversuch 2: ist, wie ich versucht NSURLConnection.
- Hast du alles auf der server-Seite einrichten, richtig? Wie Erweiterung der Parsen, die layouts für die Antwort und die Aussicht für Sie? Es scheint eher ein server-problem als ein client.
- Ich landete bei der Lösung dieses. Ich bin gerade auf der Arbeit und jetzt wird nach updates später.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese sind wesentlich (stripping die Bedingungen, die ich gemacht habe, für meinen eigenen Gebrauch) Linien, endete die Befriedigung meiner Anfrage an den web service. Danke für die Vorschläge @8vius und @mattt !
AFHTTPClient -HTTPRequestOperationWithRequest:success:failure:
.alloc init
-ingAFHTTPRequestOperation
ist immer gehen, um Ihnen eineAFHTTPRequestOperation
.Verwenden
AFHTTPClient -postPath:parameters:success:failure:
übergeben Ihre Parameter (verschachtelte dictionaries/arrays sind in Ordnung). Wenn Sie erwarten, dass eine plist zurück, sicher sein, dass der client registriertAFPropertyListRequestOperation
.In jedem Fall
setValue:forHTTPHeaderField:
ist nicht das, was Sie hier wollen. HTTP-Header sind für die Angabe von Informationen über die Anfrage selbst; die Daten sind Teil des request-Bodys an.AFHTTPClient
automatisch konvertiert die Parameter in einem query-string fürGET
- requests oder einer HTTP-body fürPOST
, et al.