Проблема с получением JSON с AFNetworking - PullRequest
19 голосов
/ 06 февраля 2012

Я пытаюсь получить некоторые данные JSON с помощью AFNetworking.

Мой серверный компонент (PHP / ZendFramework) выдает следующий ответ:

>curl -i http://test.local:8080/public/appapi/testaction/format/json
HTTP/1.1 200 OK
Date: Mon, 06 Feb 2012 10:37:20 GMT
Server: Apache
X-Powered-By: PHP/5.3.8
Content-Length: 35
Content-Type: application/json
{"entries":"test","abcxxx":"test2"}

Я пытаюсь использовать следующий код для извлечения данных JSON:

NSString *baseurl = @"http://test.local:8080";

NSString *path = @"/public/appapi/testaction/format/json";

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseurl]];
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];
[client setAuthorizationHeaderWithUsername:@"myusername" password:@"mypassword"];

[client getPath:path parameters:nil success:^(__unused AFHTTPRequestOperation *operation, id JSON) {

    //NSLog(@"sjson: %@", [JSON valueForKeyPath:@"entries"]);
    NSLog(@"sjson: %@", JSON);        
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error Code: %i - %@",[error code], [error localizedDescription]);
}];

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

2012-02-06 11:22:39.800 App[3642:15803] sjson: <6a736f6e 466c6963 6b724170 69287b22 6d657468 6f64223a 7b225f63 6f6e7465 6e74223a 22666c69 636b722e 74657374 2e656368 6f227d2c 2022666f 726d6174 223a7b22 5f636f6e 74656e74 223a226a 736f6e22 7d2c2022 6170695f 6b657922 3a7b225f 636f6e74 656e7422 3a223336 32306666 32343265 37323336 34633135 32373031 31353438 62393335 3066227d 2c202273 74617422 3a226f6b 227d29>

Любая подсказка о том, что я делаю неправильно, будет принята с благодарностью :) Я попытался получить доступ к API Twitter, и это прекрасно работает ...

Ответы [ 4 ]

34 голосов
/ 06 февраля 2012

Это сбивает с толку, и я пытался выяснить, как лучше правильно документировать / разработать, но вам нужно установить заголовок Accept для запроса на application/json.

Регистрация AFJSONRequestOperation говорит: «Любой запрос, который поступает, я рассмотрю и обработаю, если это запрос JSON». Чтобы намекнуть, что запрос является JSON, нужно либо установить соответствующий заголовок Accept, либо добавить .json в качестве расширения. Прямо сейчас запрос проходит через список классов операций, но он попадает только на AFHTTPRequestOperation, который имеет тип объекта ответа NSData (что вы видите в журнале).

Извините за путаницу!

20 голосов
/ 13 апреля 2012

Вот три строки, которые мне пришлось добавить, чтобы приложение отправляло и получало JSON:

 httpClient.parameterEncoding = AFJSONParameterEncoding;
 [httpClient setDefaultHeader:@"Accept" value:@"application/json"];
 [httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
11 голосов
/ 09 февраля 2013

если вы используете настраиваемый заголовок принятия, как и я, AFNetworking не распознает, что вы запрашиваете json, как объяснил Мэтт.один из способов - просто преобразовать данные в объект json в вашем блоке завершения:

^(AFHTTPRequestOperation *operation, id JSON)
{
   id payload = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONWritingPrettyPrinted error:nil];

   NSLog(@"Fetched: %@", payload);
}
0 голосов
/ 23 декабря 2015

У меня была та же проблема, но после того, как я добавил заголовок Accept, что-то вроде ответа @ Tylerc230, запрос начал сбой, потому что полученный формат "text/html" не соответствовал ожидаемому типу контента, поэтому я добавил @"text/html" вacceptableContentTypes функция AFJSONRequestOperation.m.

...