Как выполнить запрос GET в кодировке JSON с помощью AFNetworking-2.0?

Я пытаюсь использовать шаблон, аналогичный на этот пост, в котором описывается выполнение PUT/POST для RESTful API, но для GET.

Мой исходный код выглядит почти так же, за исключением того, что я использовал ключевое слово GET:. Я быстро обнаружил, что вместо отправки тела JSON вместо URL-адреса кодируются параметры. Это не упоминается в документации класса AFJSONSerializer. Вы должны перейти к документации суперкласса (AFHTTPSerializer) и прочитать его свойства, где вы найдете о HTTPMethodsEncodingParametersInURI. По умолчанию этот набор заполняется HEAD, GET и DELETE. Итак, для этих типов запросов сериализатор JSON, по-видимому, возвращается к своему родительскому классу для поведения?

Итак, я собрал следующий код:

AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
manager.securityPolicy.allowInvalidCertificates = YES;
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet set];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername: currentUser() password: currentPassword()];
[manager
    GET: @"https://172.16.214.214:44321/trees"
    parameters: [NSDictionary dictionary]
    success:^(NSURLSessionDataTask* task, id responseObject){
        NSLog(@"Response: %@", responseObject);}
    failure:^(NSURLSessionDataTask* task, NSError* error){
        NSLog(@"Error: %@", error);}];

Строка, которая устанавливает HTTPMethodsEncodingParametersInURI = [NSSet set], предназначена для того, чтобы позволить мне получить параметры в кодировке JSON, как я хотел, и для GET. К сожалению, я ничего не вижу на сервере, когда использую это, и получаю следующее в своей консоли ошибок:

2013-12-10 10:11:14.149 myValve[957:60b] Error: Error Domain=NSURLErrorDomain Code=-1005 "The
network connection was lost." UserInfo=0x17e5d4b0
{NSErrorFailingURLStringKey=https://172.16.214.214:44321/trees,
NSErrorFailingURLKey=https://172.16.214.214:44321/trees, NSLocalizedDescription=The network
connection was lost., NSUnderlyingError=0x17e53240 "The network connection was lost."}

Чего мне еще не хватает?


person Travis Griggs    schedule 10.12.2013    source источник
comment
Хотел бы я, чтобы это был ответ @Rob. Ссылка помогла понять, почему фреймворк, вероятно, ее не поддерживает. Спасибо.   -  person Travis Griggs    schedule 21.12.2013
comment
Я разместил это как ответ. Я просто не хотел, чтобы казалось, что я приписываю себе превосходные ответы других людей. Точно так же я всегда не решаюсь опубликовать ответ, который можно прочитать как «не делай этого». смешной.   -  person Rob    schedule 21.12.2013


Ответы (2)


Обоснование поведения AFNetworking здесь, вероятно, наиболее кратко объяснено в вопросе о переполнении стека, HTTP GET с телом запроса . Один из этих ответов цитирует Рэя Филдинга:

... Другими словами, любое сообщение HTTP-запроса может содержать тело сообщения и, следовательно, должно анализировать сообщения с учетом этого. Однако семантика сервера для GET ограничена таким образом, что тело, если оно есть, не имеет семантического значения для запроса. Требования к синтаксическому анализу отделены от требований к семантике метода.

Итак, да, вы можете отправить тело с помощью GET, и нет, это никогда не полезно.

спецификация HTTP/1.1 определяет GET для получения любой информации (в виде сущность) идентифицируется Request-URI и не предполагает включения информации в тело запроса. Так что использование тела в GET запросе технически может быть и не запрещено, но в лучшем случае нестандартно. Решение AFNetworking не поддерживать его не совсем удивительно.

Таким образом, вы можете не захотеть помещать JSON в тело для GET запросов. Обычно можно добавить параметры к URL-адресу. Если вы хотите отправить JSON в теле запроса, выполните POST.

person Rob    schedule 20.12.2013

Похоже, он не может подключиться к серверу, вы пытались позвонить за пределами iOS?

Для справки, я обычно делаю запрос JSON следующим образом:

NSURL *url = @"https://172.16.214.214:44321/trees";
NSData* data = [NSData dataWithContentsOfURL: url];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
person christopher_h    schedule 10.12.2013