Issue with retrieving JSON with AFNetworking

12,351

Solution 1

This is confusing, and something I've been trying to figure out how to properly document / design better, but you need to set your Accept header for the request to application/json.

Registering AFJSONRequestOperation says "any request that comes through, I'll look at and handle if it is a JSON request". The way you hint that a request is JSON is to either set the appropriate Accept header, or add .json as the extension. Right now, the request is going through the list of operation classes, but it only catches on AFHTTPRequestOperation, which has a response object type of NSData (what you're seeing in the log).

Sorry about the confusion!

Solution 2

Here are the 3 lines I had to add to get my app to send and receive JSON:

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

Solution 3

if you're using a custom accept header, like i am, AFNetworking won't recognize that you're requesting json, like mattt explained. one way around this is to simply convert the data into a json object in your completion block:

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

   NSLog(@"Fetched: %@", payload);
}
Share:
12,351
Goeran
Author by

Goeran

If you want to know - ask :)

Updated on June 06, 2022

Comments

  • Goeran
    Goeran about 2 years

    I am trying to retrieve some JSON data with AFNetworking.

    My server component (PHP/ZendFramework) delivers the following response:

    >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"}
    

    I try to use the following code to retrieve this json data:

    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]);
    }];
    

    When running in the simulator the console shows the following output:

    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>
    

    Any hint on what I am doing wrong would be greatly appreciated :) I tried accessing the Twitter API and that works perfectly fine...

  • Goeran
    Goeran over 12 years
    Thanks mattt! This really helped - now it works like a charm!
  • William Entriken
    William Entriken almost 12 years
    Adding this line [httpClient setDefaultHeader:@"Accept" value:@"application/json"]; is giving me "An appropriate representation of the requested resource --- could not be found on this server". Is there another part of this?
  • Tylerc230
    Tylerc230 almost 12 years
    Sounds to me like the server isn't serving JSON.
  • Sendoa
    Sendoa almost 11 years
    I couldn't change the servers response headers because I don't have access to it. The server was responding with "text/html" instead of "application/json". Your suggestion works like a charm. Thanks!!!
  • Sendoa
    Sendoa almost 11 years
    If you don't have access to your server to change the response headers you can try the solution proposed by Ben H further down: id payload = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONWritingPrettyPrinted error:nil]; It worked for me.
  • jianpx
    jianpx almost 11 years
    please refers to here you should register class and set proper accept header.
  • abbood
    abbood almost 11 years
    same here.. however I find it a little frustrating that all the classes using my rest client will have to call this json deserializing code.. i was hoping i could all lump all this config stuff into my REST singelton class