当方法不是POST时,NSURLRequest无法处理HTTP正文?

时间:2010-08-12 14:58:17

标签: iphone cocoa nsurlrequest

每当我在一个可变请求上设置一个正文,方法设置为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];

3 个答案:

答案 0 :(得分:14)

我尝试了解有关它的最新信息,但有一篇关于您所谈论的确切问题的旧帖子: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请求就可以了。

答案 1 :(得分:0)

您是否记得设置Content-Length / Transfer-EncodingContent-Type标头?我不认为Content-Length是自动放入的,这意味着服务器会认为它是0。

更多信息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

答案 2 :(得分:-1)

这里是

+(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;

}