NSURLRequest не может обрабатывать тело HTTP, когда метод не является POST?
Всякий раз, когда я устанавливаю тело в изменяемом запросе с помощью метода, установленного на что-либо, кроме POST, тело не включается в запрос, и я получаю ошибку kCFErrorDomainCFNetwork 303 (kCFErrorHTTPParseFailure), когда сервер отвечает. Изменение метода на POST - это все, что требуется, чтобы запрос прошел без ошибок. Есть ли способ привязать тело к другим методам, или мы застряли с POST для всего?
Это код представления:
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:assembleURL]];// cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:45.0];
#if (SERVER_TARGET_ARGS_ALLOWED==1)
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[req setHTTPMethod:ServerMessageMethods[operation]]; //value is @"POST" or other method name
#endif
//run the payload into a JSON
SBJsonWriter *json = [[SBJsonWriter alloc] init];
NSString *encodedPayload = [json stringWithObject:payload];
encodedPayload = [NSString stringWithFormat:@"%@", [encodedPayload stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *dataPayload = [encodedPayload dataUsingEncoding:NSUTF8StringEncoding];
[req setHTTPBody:dataPayload];
NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];
Ответы
Ответ 1
Я попытался найти более свежие сведения об этом, но было старое сообщение о точной проблеме, о которой вы говорили: http://lists.apple.com/archives/cocoa-dev/2004/May/msg01847.html
В основном, они упоминают, что это ошибка в коде. К сожалению, мне жаль, что я не могу найти что-то более недавнее, что подтверждает это.
Код, который я использовал, ASIHTTPRequest, и он может определенно выполнять запросы PUT, так как они используют набор кода более низкого уровня для создания HTTP-сообщений и не полагаться на NSMutableUrlRequest
.
Кроме того, я нашел другое сообщение в блоге, посвященное проблеме, и то, что вам нужно поставить для запроса PUT. http://iphonedevelopment.blogspot.com/2008/06/http-put-and-nsmutableurlrequest.html
сообщение в блоге:
При использовании NSMutableURLRequest для выполнения запроса HTTP PUT добавьте следующую строку кода (req - это NSMutableURLRequest):
[req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
Вот и все. Если вы добавите эту строку кода, ваши запросы PUT будут работать нормально.
Ответ 2
Помните ли вы установить заголовки Content-Length
/Transfer-Encoding
и Content-Type
? Я не думаю, что Content-Length
автоматически вводится для вас, а это значит, что сервер будет считать его 0.
Дополнительная информация: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
Ответ 3
здесь
+(NSString*)simpleCurl:(NSString*)urlStr withBody:(NSString*)post{
// NSLog(urlStr);
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
// NSLog([url description]);
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
[req setHTTPMethod:@"POST"];
[req setValue:@"close" forHTTPHeaderField:@"Connection"];
[req setValue:@"utf-8;q=0.7,*;q=0.7" forHTTPHeaderField:@"Accept-Charset"];
[req setValue:@"gzip,deflate" forHTTPHeaderField:@"Accept-Encoding"];
[req setValue:@"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" forHTTPHeaderField:@"User-Agent"];
[req setValue:@"Application/Json, text/html, application/xhtml+xml, */*" forHTTPHeaderField:@"Accept"];
[req setHTTPMethod:@"POST"];// or PUT
NSString *postString = post;
[req setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
NSData *res = [NSURLConnection sendSynchronousRequest:req returningResponse:NULL error:NULL];
NSString* html=[[NSString alloc] initWithData:res encoding:NSUTF8StringEncoding];
return html;
}