Отправка JSON в качестве тела POST-запроса с использованием AFHTTPClient

#objective-c #ios #afnetworking

#цель-c #iOS #afnetworking

Вопрос:

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

Ответ №1:

Я пошел дальше и проверил последнюю версию 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.

Комментарии:

1. Ха, я не понимал, что JSON был установлен в качестве кодировки по умолчанию. Это ошибка (я всегда намеревался использовать кодировку формы URL по умолчанию; я не уверен, как это произошло). @EricAndres: Пожалуйста, обратите на это внимание и установите кодировку параметра в JSON вручную, с self.parameterEncoding = AFJSONParameterEncoding; помощью вашего кода.

2. Потрясающе, спасибо за ответ. Я попробую настроить self.parameterEncoding позже, когда у меня будет такая возможность.

3. хм … json не был кодировкой по умолчанию, но NVP был (по состоянию на начало 2013 года)

Ответ №2:

Для меня 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];
 

Комментарии:

1. Большое вам спасибо! Вы были правы, [client setParameterEncoding:AFJSONParameterEncoding]; отсутствовал. Но, кроме того, кажется, что это также необходимо для того, чтобы он действительно работал с NSDictionary: [client registerHTTPOperationClass:[AFJSONRequestOperation class]];

2. Большое вам спасибо. Ты спасаешь мой день!!