我真的需要帮助才能创建成功的帖子请求。
我正在尝试使用NSURLConnection
将用户信息发送到服务器,然后我跟着this tutorial**
我的问题是发布请求似乎没有失败,但没有请求服务器。这是我的代码:
-(void)sendMyRequest
{
NSString *myJSONString = [[NSString alloc] initWithData:myJSONData encoding:NSUTF8StringEncoding];
NSData *postData = [myJSONString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:signupBaseURLString]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if(conn)
NSLog(@"connection successful"); //it is what is printed
else
NSLog(@"connection failed");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"data received"); //it is what is printed
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"connection failed with error %@", error);
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"connection did finish loading"); //it is what is printed
}
根据NSLog
输出'conn'成功,调用(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
和(void)connectionDidFinishLoading:(NSURLConnection *)connection
委托方法,不调用错误委托方法。这就是为什么我不知道错误是什么或是否有任何错误,如果没有,为什么我的请求没有交付。你能帮帮我吗,我做错了什么?提前谢谢。
** the tutorial中有一行我没有使用的代码:[request setValue:@”application/x-www-form-urlencoded” forHTTPHeaderField:@”Current-Type”];
我没有使用,因为我不理解setValue
参数“application / x-www - 形式进行了urlencoded”。这可能是必要的,如果你可以告诉我这是什么,我真的很感激。
更新我在NSData
中转换了didReceiveData
对象NSString *myString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
当我打印它时,我的输出非常奇怪,介绍“Apache Tomcat / 7.0。 62 - 错误报告H1 {font-family:Tahoma,Arial,sans-serif; color:white; background-color:#525D76; font-s ize:22px;} ...“。但是在输出结束时它显示服务器拒绝了此请求,因为请求实体所采用的方法所请求的资源不支持的格式但是我确定服务器需要字符串并且我尝试以字符串格式发布但是setHTTPBody方法强迫我发送NSData,所以我正在做的是将myJSONString转换为NSData然后发送它。问题可能在这里引起,但我不知道还能做什么。我找不到直接发送NSString的方法。我如何直接发布NSString类型?
答案 0 :(得分:1)
我很高兴你弄清楚你的数据格式有什么问题。也就是说,你应该修复的代码仍然存在相关问题。
使用NSURLConnection和NSURLSession时,服务器端错误不一定报告为错误。连接成功,因为服务器实际上是返回数据,而不是您期望的数据。
要检测这些类型的服务器端错误,您应该实现connection:didReceiveResponse:并检查服务器返回的HTTP状态代码。如果不是200(OK),请以适合您特定应用的任何方式处理它。这也是您获取以后可能需要的各种信息的唯一机会,例如HTTP标头值,这些信息存储在NSHTTPURLResponse对象中。
(当然,如果你得到的数据不是预期的格式,那么即使你有一个200状态代码并且请求似乎成功了,也把它当作一个错误处理。)
答案 1 :(得分:0)
您必须在info.plist文件中添加一些代码。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
您可以从链接下方获取更多信息。
http://iosdevtips.co/post/121756573323/ios-9-xcode-7-http-connect-server-error
答案 2 :(得分:0)
在sendMyRequest
方法中添加以下行解决了我的问题。
[request setValue:@”application/x-www-form-urlencoded” forHTTPHeaderField:@”Current-Type”];
[request setValue:@”application/json” forHTTPHeaderField:@”Content-Type”];
[request setValue:@”application/json” forHTTPHeaderField:@”Accept”];