Отправка 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. Таким образом, перед кодированием вы могли бы знать, как веб-служба ведет себя с помощью этого инструмента.