Подтвердить что ты не робот

Проблема с извлечением JSON с AFNetworking

Я пытаюсь получить некоторые данные 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 и это работает отлично...

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

 httpClient.parameterEncoding = AFJSONParameterEncoding;
 [httpClient setDefaultHeader:@"Accept" value:@"application/json"];
 [httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];

Ответ 3

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

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

   NSLog(@"Fetched: %@", payload);
}

Ответ 4

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