it-swarm.com.ru

Отправка JSON через POST в NSURLRequest

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

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, как показано выше, чтобы доставить на сервер?

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

Постскриптум Я бы предпочел не использовать 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)
10
Maverick1st

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

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

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

Это смесь 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 является Objective C jabberwocky для PHP эквивалентного urlencode.

НТН

18
klaus

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

0
Youssef

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

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

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

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

0
Omer Faruk KURT

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

0
zeeawan