2014-10-06 60 views
-2

我试图发布到iOS中的网络服务器,但我收到了404错误。我工作人员能够从不同的系统发布在一个字符串的地址和数据:试图发送POST请求到iOS中的URL

http://xxx.xxx.xxx.xxx/api/message?salu=mr&firstname=john&lastname=smith&[email protected]&country=usa&zipcode=99999&checkbox=y&messagelist=message&q1=1&q2=2&q3=3&q4=4&q5=5

我试图做同样的在Xcode下面的代码:

NSString *body = [NSString stringWithFormat:@"message?salu=mr&firstname=john&lastname=smith&[email protected]&country=usa&zipcode=99999&checkbox=y&messagelist=message&q1=1&q2=2&q3=3&q4=4&q5=5"]; 

NSData *data = [body dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
NSString *postLength = [NSString stringWithFormat:@"%d", [data length]]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xx.xxx.xxx.xxx/api"]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPBody:data]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

NSURLResponse *response; 
NSError *err; 
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
NSString *reply = [[NSString alloc] initWithBytes:[responseData bytes] length:[responseData length] encoding:NSASCIIStringEncoding]; 
NSLog(@"requestReply: %@", reply);  

,并从上面的NSLog '回复' 的最后几行是:

<b> Description: </b>HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. &nbsp;Please review the following URL and make sure that it is spelled correctly. 
     <br><br> 

     <b> Requested URL: </b>/api<br><br> 

</body> 

但是,我能够用下面的代码,在那里我收到预期的数据放在同一个地址执行“GET”:

NSMutableURLRequest *request2 = [[NSMutableURLRequest alloc] init]; 
[request2 setURL:[NSURL URLWithString:@"http://xx.xxx.xxx.xxx/api/message"]]; 
[request2 setHTTPMethod:@"GET"]; 

NSURLResponse *requestResponse; 
NSData *requestHandler = [NSURLConnection sendSynchronousRequest:request2 returningResponse:&requestResponse error:nil]; 

NSString *requestReply = [[NSString alloc] initWithBytes:[requestHandler bytes] length:[requestHandler length] encoding:NSASCIIStringEncoding]; 
NSLog(@"requestReply: %@", requestReply); 

所以Web服务器在运行,它出现问题就出在我发布的方式。有谁知道我做错了什么?

+0

无关,但一般应该避免'sendSynchronousRequest'。使用异步请求。此外,虽然你已经为测试目的硬编码身体,但当你开始更加动态地构建身体时,不要忘记做必要的百分比转义(例如[本答案的第1点] (http://stackoverflow.com/a/26153527/1271826))。或者使用像[AFNetworking](https://github.com/AFNetworking/AFNetworking)这样的框架来为你处理这些细节。 – Rob 2014-10-06 14:43:23

+0

感谢您的帮助,我会记住这样做。 – jdeckman 2014-10-06 15:07:02

回答

2
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xx.xxx.xxx.xxx/api"]]; 

你不注意到你应该叫NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xx.xxx.xxx.xxx/api/message"]];

/消息是路径的一部分,而不是请求体。

并期待使用一些现成的框架,比如AFNetworking。

+0

嗨,是啊我摆弄这个早些时候,但是当我包括'消息'作为路径的一部分,我得到的消息'没有HTTP资源找到... – jdeckman 2014-10-06 15:03:01

1

您已将请求的URL的最后一个路径组件message取出,并将其放入请求的正文中。因此,更换:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xx.xxx.xxx.xxx/api"]]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xx.xxx.xxx.xxx/api/message"]]; 

而且,替代:

NSString *body = [NSString stringWithFormat:@"message?salu=mr&firstname=john&lastname=smith&[email protected]&country=usa&zipcode=99999&checkbox=y&messagelist=message&q1=1&q2=2&q3=3&q4=4&q5=5"]; 

有:

NSString *body = [NSString stringWithFormat:@"salu=mr&firstname=john&lastname=smith&[email protected]&country=usa&zipcode=99999&checkbox=y&messagelist=message&q1=1&q2=2&q3=3&q4=4&q5=5"]; 
+0

嗨我试过这个,但然后我得到错误'没有HTTP资源找到...',它承认没有它的地址。 – jdeckman 2014-10-06 15:04:35

+0

请用'NSURLResponse'对象的完整'NSLog'来更新你的问题(这实际上是一个'NSHTTPURLResponse'对象)。当我们只有消息片段时,很难远程诊断问题,而不是完整的NSURLResponse对象。除此之外,我可能会建议你通过类似[Charles](http://charlesproxy.com)的方式同时观看'POST'和'GET'尝试,并确保URL是相同的,并且你的'POST'呈现在它的任何地方都没有'?'。 – Rob 2014-10-06 17:49:21

+0

嗨,感谢您的回复。我看着查尔斯,这两个地址都显示相同的POST和GET,其中给出了:'http://xxx.xxx.xxx.xxx/api/message。随着POST我得到一个404错误,但GET工作正常。我真的很困惑,为什么这个地址在POST上不被识别,但在GET上。 – jdeckman 2014-10-06 19:21:19