2012-03-27 12 views
27

Próbuję opublikować dane w serwisie PHP.
Jestem zaznajomiony z robieniem tego w html za pomocą zapytania $ .post, ale jestem bardzo zakłopotany próbując tego w celu C. Próbowałem kilku blogów & pytań znalezionych na stackoverflow.Przesyłanie danych w Objective C przy użyciu Json

I wreszcie wpadł na następujący kod:

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]; 

ja też próbowałem:
NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest: wniosek delegata: self];

Moja usługa internetowa tworzy nowego użytkownika na poczcie i zwraca identyfikator użytkownika. Oba pomyślnie nawiązują połączenie z serwisem internetowym (tworzony jest nowy identyfikator użytkownika), ale nie wysyłają danych, tzn. Pusty użytkownik jest tworzony za każdym razem.
Proszę mi powiedzieć, czy czegoś brakuje.

Dzięki.

Moje inne próby:

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]; 

I wreszcie rozwiązał problem: wreszcie zorientowali się, co się stało. Użyłem adresu URL http://mypath?params=123. Nie przesłałem całego adresu URL (nigdy go nie potrzebowałem w innych językach). Ale tutaj musiałem dać htt: //mypath/index.php params = 123

+0

jest Twój serwer działa poprawnie? –

+0

Tak, bardzo .. Jak wspomniałem w moim pytaniu, robię to bardzo skutecznie za pomocą jquery. Także w tym przypadku przy użyciu celu C serwer odpowiada identyfikatorem użytkownika, po prostu nie akceptuje danych, które opublikowałem. – Praneeta

+0

Jeśli utworzę słownik taki jak NSMutableDictionary * parms = [Słownik NSMutableDictionary]; [parms setObject: [tekst e-mail] forKey: @ "Email"]; [parms setObject: [imię tekstu] forKey: @ "FirstName"]; [parms setObject: [nazwisko tekstu] dlaKey: @ "LastName"]; czy istnieje sposób przekonwertowania go na NSData i opublikowania go? Czy to działa lepiej, zamiast publikować ciąg JSON? – Praneeta

Odpowiedz

0

Spróbuj ten

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

Niestety, ten sam wynik. – Praneeta

3

mam uruchomić swój kod, a po stronie serwera otrzymywać wszystkie wiadomości.

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"} 

i postępuj kod, jeśli jsonRequest zawiera znaki spoza ASCII The [jsonRequest length] będzie źle.

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

Zamiast tego można użyć strlen.

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

lub

[jsonRequest dataUsingEncoding:NSUTF8StringEncoding]; 
+0

również z jakiegoś powodu mój kod po stronie serwera nie lubi moich opublikowanych danych, przyjrzę się temu jutro. Dziękuję za potwierdzenie, że mój kod publikuje dane. – Praneeta

+0

** jeśli JSON ma znak spoza ASCII [długość jsonRequest] będzie niepoprawny. ** - Tak, to jest duże zmartwienie! dziękuję za informację - właśnie spędziłem 2 dni na debugowaniu złej prośby ... wszystko wyglądało dobrze z iPada, gdzie otrzymywałem surowy JSOn, a następnie wysyłanie usługi za pomocą innego klienta, który wszystko działało ... JSOn wyglądał świetnie, użyć wireshark, aby zobaczyć, że rzeczywiste dane otrzymywane w WS zostały skrócone –

+0

@looyao Próbowałem obydwu podanych opcji, ale ustawiam ten sam błąd. Czy mógłbyś mi pomóc? Dane próbuję wysłać to { "prefferedName": "eivFEGX5pXWBGoqNNtF3og ==", "nameOnCard": "eivFEGX5pXWBGoqNNtF3og ==", "macID": "m2/ZIJ5pUB37EnF3tmvdtOnozUeOk + iAM82i2Z0nDEFVsc69vqUXNltN6R2dj7nz", "expiryDateMonth": "XAcdf3HTEn3pb2TlWQKHHA ==" , "appVersion": "e6NpxcXU34gHeOyowJbWFQ ==", "cardNumber": "7qYGPbnqgAMwMJ2GoCEGF4neQanULztzvblT873xj4o ="} –

38

myślę, że będzie lepiej przy użyciu klasy NSJSONSerialization takiego:

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

Korzystanie ze słownika, a następnie przekształcenie go do JSON jest to łatwiejsze niż tworzenie go jak ciąg.

Powodzenia!

[SWIFT 3,0] (aktualizacja)

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

Dzięki, zorientowali się, co było nie tak. Użyłem http: // mypath? Params = 123 jako mojego adresu URL. Nie przesłałem całego adresu URL (nigdy go nie potrzebowałem w innych językach). Ale tutaj musiałem dać htt: //mypath/index.php? Params = 123 – Praneeta

+0

Dzięki. Ale czy istnieje sposób, aby wygenerować słownik "tmp" po prostu w złożonym obiekcie Json. wygenerować odpowiedni dict jest znudzony..ex: {"user": {"id": "18888888888", "pass": "12345678", ...}, "animal": {"code": {"id" : 1, "code": 123456}, "key": true}}, aby wygenerować dyktowanie, które nudzi mnie. – frank

+3

Nie działało dla mnie dopóki nie dodano nagłówka: '[request 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

Miałem podobny problem z żądaniem JSON. Nie wiem dlaczego, ale dodając User-Agent: iOS naprawił mój problem. –

Powiązane problemy