Как прочитать простую строку из запроса POST в AFNetworking (без JSON)

Я использую AFNetworking для связи с сервером через POST, который отвечает простой строкой, содержащей нужную мне информацию. Я использую следующий код:

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST: MY_URL
   parameters: MY_PARAMETERS
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //do something
      }
      failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //etc.
      }];

Однако кажется, что AFNetworking ожидает, что каждый ответ будет в формате JSON, потому что я получаю эту ошибку, когда выполняю свой запрос:

Error Domain = NSCocoaErrorDomain Code = 3840 «Операция не может быть завершена. (Ошибка Cocoa 3840.)» (текст JSON не начинался с массива или объекта, а параметр разрешения фрагментов не установлен.) UserInfo = 0x1566eb00 {NSDebugDescription = текст JSON не начинался с массива или объекта, и параметр, разрешающий фрагменты, не установлен.}

Как я могу сообщить AFNetworking, что ответ не является объектом JSON? Я видел кое-что, связанное с AFHTTPClient, но, похоже, оно больше не является частью AFNetworking.


person Haiku Oezu    schedule 09.01.2014    source источник


Ответы (3)


Вы можете указать AFHTTPRequestOperationManager или AFHTTPSessionManager, как обрабатывать ответ, например. перед вызовом POST можно сделать следующее:

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

Затем в вашем блоке success вы можете преобразовать NSData в строку:

NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

Сказав это, вы, возможно, захотите подумать о преобразовании вашего веб-сервиса для возврата ответа JSON, поскольку таким образом гораздо проще анализировать (и различать действительный ответ и некоторую ошибку сервера).

person Rob    schedule 09.01.2014
comment
Замечательно, это как раз то, что мне было нужно - person Haiku Oezu; 09.01.2014

  NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

вы можете получить детали описания ответа, как показано ниже

 NSLog(@"JSON: %@", [responseObject description]);
person codercat    schedule 09.01.2014

Гораздо лучше было бы создать подкласс AFHTTPResponseSerializer и переопределить его.

func responseObject (для ответа: URLResponse?, данные: данные?, ошибка: NSErrorPointer) -> Любой?

Там вы можете разобрать ответ, привести его к нужному типу и вернуть.

person Timur Suleimanov    schedule 15.06.2018