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

Iphone 当方法不是POST时,NSURLRequest无法处理HTTP正文?,iphone,cocoa,nsurlrequest,Iphone,Cocoa,Nsurlrequest,每当我在一个可变请求上设置一个主体,并且方法设置为除POST之外的任何内容时,该主体都不包括在请求中,当服务器应答时,我会收到一个KCFerrorRDomaincfNetwork错误303(kCFErrorHTTPParseFailure)。将方法更改为POST是请求无误通过所需的全部。是否有任何方法可以将一个主体附加到其他方法上,或者我们是否坚持使用POST 这是提交代码: NSMutableURLRequest *req = [NSMutableURLRequest requestWithU

每当我在一个可变请求上设置一个主体,并且方法设置为除POST之外的任何内容时,该主体都不包括在请求中,当服务器应答时,我会收到一个KCFerrorRDomaincfNetwork错误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];

您是否记得设置
内容长度
/
传输编码
内容类型
标题?我不认为
内容长度
是自动为您输入的,这意味着服务器将假定它为0


更多信息:

我试图找到更多关于它的最新信息,但有一篇关于你所谈论的确切问题的旧帖子:

基本上,他们提到这是代码中的一个bug。可悲的是,我希望我能找到更新的东西来证实这一点

我一直在使用的代码是,而且它肯定可以执行PUT请求,因为它们使用较低级别的代码集来创建HTTP消息,并且不依赖于
NSMutableUrlRequest

此外,我还发现了另一篇博客文章,讨论了这个问题以及put请求需要放置什么

博文: 使用NSMutableURLRequest执行HTTP PUT请求时,添加以下代码行(req是NSMutableURLRequest):

就这些。如果添加这行代码,PUT请求将正常工作

给你

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

}

我只是想知道这是如何解释它只适用于POST而不适用于其他操作的?你认为它可能是为一个操作设置的,而不是为另一个操作设置的吗?@christophercotton它可能是自动设置的,但我不知道;但是,未定义的
内容长度
可能解释了服务器从不读取请求正文的原因。如果使用HTTP/1.1的分块编码,则不需要使用内容长度。NSURLConnection应该为您透明地处理所有这些。是的,我对内容长度有一个问题,关于PDF,但我想我会与大家分享。我不明白,这应该如何解决这个问题?在2016年仍然存在
+(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;