Отправка JSON через POST в NSURLRequest - PullRequest
10 голосов
/ 13 сентября 2011

У меня проблема с отправкой JSON на сервер с REST API.Вот код, который я использую:

NSString *jsonPostBody = [NSString stringWithFormat:@"'json' = '{\"user\":{\"username\":"
                          "\"%@\""
                          ",\"password\":"
                          "\"%@\""
                          "}}'",
                          [username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                          [password stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];       
NSData *postData = [jsonPostBody dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *apiPathParams = [NSString stringWithFormat:@"%@",
                           @"getUser"
                           ];

NSURL *url = [NSURL URLWithString:[[apiPath retain] stringByAppendingString:apiPathParams]];    
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                   timeoutInterval:180.0];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postData];
NSString* postDataLengthString = [[NSString alloc] initWithFormat:@"%d", [postData length]];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:postDataLengthString forHTTPHeaderField:@"Content-Length"];
[self internalRequest:request];

Вот как бы выглядел API, если бы это была HTML-форма:

<form method="post" action="someAPI-URL">
<input name="json" value="{"user":...}" />
</form>

Вот так выглядят мои данные POST, когдая добавляю его в запрос:

json={"user":{"username":"someUser","password":"somePassword"}}

По причине, по которой я не знаю, данные POST не поступают на сервер.Я сделал что-то не так с форматированием dataString?Как именно я должен отформатировать мою dataString так, чтобы она соответствовала String, а форма, как показано выше, доставляла бы на сервер?

Любая помощь будет высоко оценена.

PS Я бы предпочел не использовать ASIHttpRequestТак как я принял проект от кого-то другого, все остальные запросы работают нормально, кроме этого пост-запроса.Таким образом, изменение всей этой массы на другую инфраструктуру соединений может занять очень много времени.

Вот исходный код метода InternalRequest

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self];
NSMutableDictionary *di = [NSMutableDictionary dictionaryWithObject:[[NSMutableData alloc] init] forKey:@"receivedData"];   
[di setObject:[NSString stringWithFormat:@"%i",identifier] forKey:@"identifier"];
if (delegate == nil) 
{ 
    delegate = self;         
}
[di setObject:delegate forKey:@"delegate"];

CFDictionaryAddValue(connectionToInfoMapping, connection, di)

Ответы [ 4 ]

18 голосов
/ 02 ноября 2011

, так как вы пытаетесь отправить HTTP-заголовок POST, например

json={"user":{"username":"%@","password":"%@"}} * * 1004

этот пример полностью подходит для того, чтобы привести в замешательство.

Это смесь application/x-www-form-urlencoded для всего тела и application/json для значения.

Может быть, способ решить эту проблему:

Возможно, вам потребуется настроить этот HTTP-заголовок:

 [request setValue:@"application/x-www-form-urlencoded" 
forHTTPHeaderField:@"Content-Type"];

из-за кодировки JSON-части (значения) тела HTTP:

[request setHTTPBody:[[jsonPostBody stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]
                      dataUsingEncoding:NSUTF8StringEncoding 
                   allowLossyConversion:YES]];    

, где stringByAddingPercentEscapesUsingEncoding - цель c jabberwocky для эквивалента PHP urlencode.

НТН

0 голосов
/ 18 ноября 2015

Вы можете проверить различные заголовки и параметры формы, используя Chrome Advanced Rest Client .Итак, перед написанием кода вы можете узнать, как веб-сервис ведет себя с помощью этого инструмента.

0 голосов
/ 15 сентября 2011

Имеет ли этот веб-сервис веб-клиент, который вы можете использовать в своем браузере и тестировать. Я рекомендую вам, если у них уже есть веб-клиент, попробуйте использовать Mozilla Firefox с плагином firebug и проверить, какие данные и заголовки отправляются на сервер с запросом, также можно увидеть строку json на вкладке данных поста.

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

По какой причине вы пытаетесь создать свой собственный json, я не знаю, но я рекомендую вам использовать стороннюю библиотеку, такую ​​как JSON Framework. Также я рекомендую вам использовать библиотеку ASIHttpRequest для http-запросов. Это делает все легко.

Но, во-первых, вы должны быть уверены, что тип сообщения, какие параметры, заголовки, тип и данные ...

0 голосов
/ 13 сентября 2011

Я думаю, что вы должны использовать JSON Framework и преобразовать jsonPostBody в его JSON-представление перед отправкой.Проверьте этот принятый ответ , он показывает, как построить запрос.

...