Публикация JSON в качестве тела запроса POST с использованием AFHTTPClient - PullRequest
16 голосов
/ 30 октября 2011

Я пытаюсь найти способ, используя AFNetworking, установить заголовок Content-Type равным application / json и POST с JSON в теле. Методы, которые я вижу в документации (postPath и requestWithMethod), используют словарь параметров, который, я полагаю, закодирован в синтаксисе стандартной формы. Кто-нибудь знает способ проинструктировать AFHTTPClient использовать JSON для тела, или мне нужно написать запрос самостоятельно?

Ответы [ 2 ]

23 голосов
/ 30 октября 2011

Я пошел дальше и проверил последнюю версию AFNetworking из их главной ветви .Из коробки мне удалось получить желаемое поведение.Я посмотрел, и это похоже на недавнее изменение (6 октября), так что вам, возможно, просто нужно потянуть последние.

Я написал следующий код для выполнения запроса:

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

Под моим прокси я вижу необработанный запрос:

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

Из источника AFHTTPClient вы можетеобратите внимание, что кодировка JSON используется по умолчанию на основе строка 170 и строка 268 .

13 голосов
/ 17 марта 2013

Для меня json НЕ была кодировкой по умолчанию.Вы можете вручную установить его в качестве кодировки по умолчанию, например:

(используя код Эвана)

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

критическая часть:

[client setParameterEncoding:AFJSONParameterEncoding];
...