【问题标题】:NSURLConnection failed without errorNSURLConnection 失败且没有错误
【发布时间】:2016-03-07 14:02:41
【问题描述】:

我真的需要帮助才能创建成功的发布请求。

我正在尝试使用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-form-urlencoded”。这可能是必要的,如果你能告诉我这是关于什么的,我真的很感激。

更新我在didReceiveData 中转换了NSData 对象,就像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 类型?

【问题讨论】:

  • 如何将所有数据附加在一起(在connection: didReceiveData: 中接收)并在connectionDidFinishLoading: 中打印?如果出现错误,您的服务器可能会回复特殊响应
  • 让我试试这个,我会告诉你结果如何。
  • 我将NSData 对象保存在didReceiveData 中,然后在connectionDidFinishLoading: 中尝试将其转换为JSON 格式时出现Domain=NSCocoaErrorDomain Code=3840 "Invalid value在字符 0 附近。” 但我不知道这是否有帮助。
  • 将其转换为 NSString,而不是 JSON。您的答案可能不是 JSON(因为它似乎不是)
  • 我有类似的问题,问题是关于服务器端的。检查您的服务器可能没有处理您发送的数据。

标签: ios objective-c json nsurlconnection


【解决方案1】:

很高兴您发现您的数据格式出了什么问题。也就是说,您可能应该修复代码的相关问题。

使用 NSURLConnection 和 NSURLSession,服务器端错误不一定报告为错误。连接成功是因为服务器实际上正在返回数据,而不是您期望的数据。

要检测这些类型的服务器端错误,您应该实现 connection:didReceiveResponse: 并检查服务器返回的 HTTP 状态代码。如果不是 200(OK),请以对您的特定应用程序有意义的任何方式处理它。这也是您获取稍后可能需要的各种信息的唯一机会,例如存储在 NSHTTPURLResponse 对象中的 HTTP 标头值。

(当然,如果您返回的数据不是预期的格式,也将其作为错误处理,即使您收到 200 状态码并且请求似乎成功。)

【讨论】:

    【解决方案2】:

    你必须在 info.plist 文件中放一些代码。

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    

    您可以通过以下链接获取更多信息。

    http://iosdevtips.co/post/121756573323/ios-9-xcode-7-http-connect-server-error

    【讨论】:

      【解决方案3】:

      sendMyRequest 方法中添加以下行解决了我的问题。

      [request setValue:@”application/x-www-form-urlencoded” forHTTPHeaderField:@”Current-Type”];
      [request setValue:@”application/json” forHTTPHeaderField:@”Content-Type”];
      [request setValue:@”application/json” forHTTPHeaderField:@”Accept”];
      

      【讨论】:

        猜你喜欢
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        相关资源
        最近更新 更多