gowalla/AFNetworking — Issue #108: Encoding problem in AFHTTPClient requestWithMethod:path:parameters:
Author: youboox
Created: 2011-11-10 15:48:18+00:00
State: open

Hi,

I want to post a request with JSON inside the body request such as this :

params : {
"auth_token" = abcd;
postits = (
{
"category_id" = 0;
"danoner_id" = 1;
text = text1;
},
{
"category_id" = 0;
"danoner_id" = 2;
text = "tex t2";
}
);
}

The requestWithMethod:path:parameters: produce this queryString :

postits=%28%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%22category_id%22%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%22danoner_id%22%20%3D%201%3B%0A%20%20%20%20%20%20%20%20text%20%3D%20text1%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%22category_id%22%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%22danoner_id%22%20%3D%202%3B%0A%20%20%20%20%20%20%20%20text%20%3D%20%22tex%20t2%22%3B%0A%20%20%20%20%7D%0A%29&auth_token=abcd

Actually it's because the description method applied to a NSArray produces \n and white space between each { character :

AFURLEncodedStringFromStringWithEncoding([key description], self.stringEncoding)

The problem is that WEBRick server doesn't understand all these spaces and carriage return inside the JSON.

I managed to get rid of the problem by using JSONKit to encode the parameters :

NSString *queryString = [parameters JSONString];

Then i get what i expected :

{"postits":[{"category_id":"0","danoner_id":1,"text":"text1"},{"category_id":"0","danoner_id":2,"text":"tex t2"}],"auth_token":"abcd"}

I have several question :

1) Why you are trying to encode the parameters yourself using AFURLEncodedStringFromStringWithEncoding ? Why not using JSONKit ?

2) Is there some situation where my modification can break ? Is there another way to get a valid JSON with requestWithMethod:path:parameters: ?

Thanks,
Vincent