#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. Большое вам спасибо. Ты спасаешь мой день!!