2011-10-30 20 views
16

Próbuję znaleźć sposób, za pomocą AFNetworking, ustawić nagłówek Content-Type na aplikację/json i POST z JSON w ciele. Metody, które widzę w dokumentacji (postPath i requestWithMethod), pobierają słownik parametrów, który, jak zakładam, jest zakodowany w standardowej składni formularza. Czy ktoś wie o sposobie instruowania agenta AFHTTPClient, aby używał JSON-a dla ciała, czy też muszę sam go napisać?Księgowanie JSON jako treść żądania POST za pomocą AFHTTPClient

Odpowiedz

23

Poszedłem dalej i sprawdziłem najnowsze AFNetworking od ich master branch. Po wyjęciu z pudełka udało mi się uzyskać pożądane zachowanie. Spojrzałem i wygląda na ostatnią zmianę (6 października), więc możesz po prostu wyciągnąć najnowszą.

napisałem poniższy kod, aby złożyć zamówienie:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:8080/"]]; 
[client postPath:@"hello123" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil] 
     success:^(id object) { 
      NSLog(@"%@", object); 
     } failure:^(NSHTTPURLResponse *response, NSError *error) { 
      NSLog(@"%@", error); 
     }]; 
[client release]; 

pod moim pełnomocnika widzę surowego żądanie:

POST /hello123 HTTP/1.1 
Host: localhost:8080 
Accept-Language: en, fr, de, ja, nl, it, es, pt, pt-PT, da, fi, nb, sv, ko, zh-Hans, zh-Hant, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, en-GB, ca, hu, vi, en-us;q=0.8 
User-Agent: info.evanlong.apps.TestSample/1.0 (unknown, iPhone OS 4.3.2, iPhone Simulator, Scale/1.000000) 
Accept-Encoding: gzip 
Content-Type: application/json; charset=utf-8 
Accept: */* 
Content-Length: 21 
Connection: keep-alive 

{"k2":"v2","k1":"v1"} 

od źródła AFHTTPClient widać, że kodowanie JSON jest domyślnie na podstawie line 170 i line 268.

+11

Huh, nie zdawałem sobie sprawy JSON została ustawiona na domyślne kodowanie. To błąd (kodowanie formularzy URL zawsze było moim zamiarem domyślnym, nie jestem pewien, jak to się stało). @EricAndres: Zwróćcie uwagę na to i ustawcie kodowanie parametrów na JSON ręcznie, z 'self.parameterEncoding = AFJSONParameterEncoding;' w kodzie. – mattt

+0

Niesamowite, dziękuję za odpowiedź. Wypróbuję ustawienie self.parameterEncoding później, gdy dostanę szansę. –

+0

hmm ... json nie był domyślnym kodowaniem, ale NVP było (od początku 2013) – stackOverFlew

13

Dla mnie json nie był domyślnym kodowaniem. Można ręcznie ustawić go jako domyślny kodowania jak ten:

(za pomocą kodu Evana)

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:8080/"]]; 

[client setParameterEncoding:AFJSONParameterEncoding]; 

[client postPath:@"hello123" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil] 
     success:^(id object) { 
      NSLog(@"%@", object); 
     } failure:^(NSHTTPURLResponse *response, NSError *error) { 
      NSLog(@"%@", error); 
     }]; 
[client release]; 

kluczowa część:

[client setParameterEncoding:AFJSONParameterEncoding]; 
+1

Dziękuję bardzo! Masz rację, brakowało '[client setParameterEncoding: AFJSONParameterEncoding];'. Ponadto wydaje się, że jest to również wymagane, ponieważ faktycznie działa z NSDictionary: '[rejestr klientaHTTPOperationClass: [klasa AFJSONRequestOperation]];' – thedp

+0

Dziękuję bardzo. Ratujesz mój dzień! – kb920

Powiązane problemy