2012-03-27 9 views
27

Ich versuche, Daten an einen PHP-Webdienst zu senden.
Ich bin vertraut tun dies in HTML mit Abfrage $ .post, aber ich bin sehr ratlos versucht dies in Ziel C. Ich habe versucht, mehrere Blogs & Fragen auf Stackoverflow gefunden.Veröffentlichen Sie Daten in Objective C mit JSON

Ich kam schließlich mit dem folgenden Code auf:

NSString *jsonRequest = [NSString stringWithFormat:@"{\"Email\":\"%@\",\"FirstName\":\"%@\"}",user,fname]; 
NSLog(@"Request: %@", jsonRequest); 

NSURL *url = [NSURL URLWithString:@"http:myurl..."]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]; 

[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPBody: requestData]; 

NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 

ich auch versucht:
NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest: Anfrage Delegat: self];

Mein Webdienst erstellt einen neuen Benutzer für den Post und gibt die Benutzer-ID zurück. Beide führen den Webdienstaufruf erfolgreich durch (eine neue Benutzer-ID wird erstellt), jedoch werden die Daten nicht hochgeladen, d. H. Es wird jedes Mal ein leerer Benutzer erstellt.
Bitte sagen Sie mir, wenn ich etwas vermisse.

Danke.

Meine andere Versuche:

NSMutableURLRequest *request = 
[[NSMutableURLRequest alloc] initWithURL: 
[NSURL URLWithString:@"myUrl.. "]]; 

[request setHTTPMethod:@"POST"]; 

NSString *postString = @"[email protected]&FirstName=Test"; 

[request setValue:[NSString 
        stringWithFormat:@"%d", [postString length]] 
forHTTPHeaderField:@"Content-length"]; 

[request setHTTPBody:[postString 
         dataUsingEncoding:NSUTF8StringEncoding]]; 

[[NSURLConnection alloc] 
initWithRequest:request delegate:self]; 

Ich löste schließlich das Problem: schließlich herausgefunden, was falsch war. Ich benutzte http://mypath?params=123 als meine URL. Ich habe nicht die komplette URL (nie in anderen Sprachen gebraucht). Aber hier musste ich htt geben: //mypath/index.php params = 123

+0

wird Ihr Server richtig funktioniert? –

+0

ja sehr viel .. Wie ich in meiner Frage erwähnt habe, mache ich das sehr erfolgreich mit jquery. Auch in diesem Fall, wenn Objective C verwendet wird, antwortet der Server mit einer Benutzer-ID, er akzeptiert nur die von mir geposteten Daten nicht. – Praneeta

+0

Wenn ich ein Wörterbuch wie NSMutableDictionary erstellen * parms = [NSMutableDictionary Wörterbuch]; [parms setObject: [E-Mail-Text] forKey: @ "Email"]; [parms setObject: [Vorname text] forKey: @ "FirstName"]; [parms setObject: [Nachname Text] forKey: @ "Nachname"]; würde es eine Möglichkeit geben, es in NSData zu konvertieren und es zu posten? Würde das besser funktionieren, anstatt einen JSON-String zu posten? – Praneeta

Antwort

0

Versuchen Sie dieses

NSData *requestData = [jsonRequest dataUsingEncoding:NSUTF8StringEncoding]; 
+0

Sorry, aber das gleiche Ergebnis. – Praneeta

3

ich Ihren Code ausgeführt haben, und Server-Seite alle Meldung.

POST/HTTP/1.1 
Host: linux-test 
User-Agent: demoTest/1.0 CFNetwork/548.1.4 Darwin/11.3.0 
Content-Length: 44 
Accept: application/json 
Content-Type: application/json 
Accept-Language: en 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

{"Email":"[email protected]","FirstName":"test"} 

Und folgen Code, wenn jsonRequest Nicht-ASCII-Zeichen enthält, wird die [jsonRequest length] falsch sein.

NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]; 

Sie können stattdessen strlen verwenden.

NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:strlen([jsonRequest UTF8String])]; 

oder

[jsonRequest dataUsingEncoding:NSUTF8StringEncoding]; 
+0

gut aus irgendeinem Grund meine Server-Seite Code mag meine veröffentlichten Daten nicht, ich werde in das morgen schauen. Vielen Dank für die Bestätigung, dass mein Code Daten posten kann. – Praneeta

+0

** Wenn der JSON Nicht-ASCII-Zeichen hat, wird die [jsonRequest length] falsch sein. ** - ja, das ist ein großer Gotcha! Danke für die Info - Ich habe gerade 2 Tage Debugging eine schlechte Anfrage .. alles sah gut aus dem iPad, wo ich die rohe JSOn bekam, dann posten den Dienst mit einem anderen Client, der alles funktioniert ... JSOn sah gut aus, hatte mit wireshark zu sehen, die tatsächlichen Daten empfangen an der WS wurde kurz geschnitten –

+0

@looyao Ich habe versucht, beide Optionen, die Sie gab immer noch ich setze gleichen Fehler. Können Sie mir bitte eine Idee helfen? Daten, die ich bin versucht zu senden { "prefferedName": "eivFEGX5pXWBGoqNNtF3og ==", "nameOnCard": "eivFEGX5pXWBGoqNNtF3og ==", "MAC-ID": "m2/ZIJ5pUB37EnF3tmvdtOnozUeOk + iAM82i2Z0nDEFVsc69vqUXNltN6R2dj7nz", "expiryDateMonth": "XAcdf3HTEn3pb2TlWQKHHA ==" , "appVersion": "e6NpxcXU34gHeOyowJbWFQ ==", "cardNumber": "7qYGPbnqgAMwMJ2GoCEGF4neQanULztzvblT873xj4o ="} –

38

Ich glaube, Sie besser dran, die NSJSONSerialization Klasse wie folgt verwenden würde:

NSDictionary *tmp = [[NSDictionary alloc] initWithObjectsAndKeys: 
        email, @"Email", 
        fname, @"FirstName", 
        nil]; 
NSError *error; 
NSData *postdata = [NSJSONSerialization dataWithJSONObject:tmp options:0 error:&error]; 
[request setHTTPBody:postData]; 

ein Wörterbuch verwenden und dann deren Umwandlung ist es einfacher, JSON, als es die Schaffung wie eine Schnur.

Viel Glück!

[SWIFT 3.0] (Update)

let tmp = ["email": email, 
      "FirstName": fname] 
let postData = try? JSONSerialization.data(withJSONObject: tmp, options: .prettyPrinted) 
request.httpBody = postData 
+0

Danke, habe herausgefunden, was los war. Ich habe http: // mypath? Params = 123 als meine URL verwendet. Ich habe nicht die komplette URL (nie in anderen Sprachen gebraucht). Aber hier musste ich geben htt: //mypath/index.php? Params = 123 – Praneeta

+0

Dank.aber gibt es eine Möglichkeit, wie wir das 'tmp' Wörterbuch einfach generieren können, in einem komplexen JSON-Objekt. generiere das entsprechende dict ist langweilig..ex: {"user": {"id": "18888888888", "passiere": "12345678", ...}, "animal": {"code": {"id" : 1, "code": 123456}, "key": true}} um das dict zu erzeugen, das mich gelangweilt macht. – frank

+3

Funktioniert nicht für mich, bis Kopfzeile: '[Anfrage SetValue: @" Application/Json "forHTTPHeaderField: @" Content-Type "];' – danielrosero

0
NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"%@posts", SeverURL]]; 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setRequestMethod:@"POST"]; 
[request addRequestHeader:@"content-type" value:@"application/json"]; 
[request addRequestHeader:@"User-Agent" value:@"iOS"]; 

request.allowCompressedResponse = NO; 
request.useCookiePersistence = NO; 
request.shouldCompressRequestBody = NO; 
request.delegate=self; 
NSString *json=[[self prepareData] JSONRepresentation];//SBJSON lib, convert a dict to json string 
[request appendPostData:[NSMutableData dataWithData:[json dataUsingEncoding:NSUTF8StringEncoding]]]; 

[request startSynchronous]; 
+0

Ich hatte ein ähnliches Problem mit der JSON-Anfrage. Ich weiß nicht warum, aber User-Agent hinzufügen: iOS hat mein Problem behoben. –

Verwandte Themen