Отправка 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, как показано выше, доставляло бы серверу?

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

P.S. Я бы предпочел не использовать 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)

Ответ 1

поскольку вы пытаетесь отправить заголовок 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 является объектным c jabberwocky для эквивалента PHP urlencode.

НТН

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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