【问题标题】:Request failed: unacceptable content-type: text/plain using AFNetworking 2.0请求失败:不可接受的内容类型:使用 AFNetworking 2.0 的文本/纯文本
【发布时间】:2014-06-14 13:26:31
【问题描述】:

我在使用 AFNetworiking 2 的请求时遇到问题。

我的 sharedInstance 类方法中有我的 AFHTTPSessionManager 自定义 sharedInstance

sharedInstance.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:3];
sharedInstance.responseSerializer.acceptableContentTypes = [sharedInstance.responseSerializer.acceptableContentTypes setByAddingObject:@"text/plain"];
sharedInstance.responseSerializer.acceptableContentTypes = [sharedInstance.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];

这是因为我的服务器以文本/纯文本响应(仅在错误时 - 成功时它以 json 响应)

但即使我发送 POST 方法时,我也会收到此错误:

failure: error: Error Domain=NSCocoaErrorDomain Code=3840 
"The operation couldn’t be completed. (Cocoa error 3840.)" 
(JSON text did not start with array or object and option to allow fragments not set.)
UserInfo=0x175e6970 {NSDebugDescription=JSON text did not start with array or object
and option to allow fragments not set., NSUnderlyingError=0x175e59b0 "Request failed:
internal server error (500)"}

我已阅读问题:thisthis 以及网络上的其他内容,但没有好的答案。有什么想法吗?

【问题讨论】:

    标签: ios objective-c ios7 afnetworking-2


    【解决方案1】:

    对于OC,我是这样解决的

    AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = nil;
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      使用 swift 试试这个

      manager.responseSerializer.acceptableContentTypes = nil
      

      【讨论】:

        【解决方案3】:

        令人惊讶的是,这个问题没有完整的答案,而@blackbox 非常接近。

        首先,正如@blackbox所说,作为500 Internal Server Error的服务器响应,可能默认显示为text/htmltext/plain,它不被AFNetworking 2接受AFJSONResponseSerializer;它只接受等于 JSON 的 MIME 类型(例如 application/json)。

        因此,为了解决这个问题,在failure 块中,您可以检测到此类错误并显示相关的错误消息。

        【讨论】:

          【解决方案4】:

          昨天刚刚经历了类似的事情!

          这就是我所做的。

          转到您的 afnetworking 课程,然后转到 AFURLResponseSerializer.m。

          找到这个方法,然后确保它有 NSJSONReadingAllowFragments。

          + (instancetype)serializer {
              return [self serializerWithReadingOptions:(NSJSONReadingOptions)NSJSONReadingAllowFragments];
          }
          

          尝试再次运行它,您可能会得到另一个错误,字符 0 周围的值无效。

          所以是的,你的服务器很牛,它提供垃圾 json。

          你可以检查一下!

          所以在你失败的可能性中:

          NSLog("%@", operation.responseString);
          

          大多数服务器都会在回复中说成功与否,反正我的也是。

          所以像下面这样在 responseString 中搜索 Success。

          (失败:)

           if ([operation.responseString containsString:@"SUCCESS"]) {                 
          //true success
          } else {              
          NSLog(@"Error: %@", error);
          //true failure
          }
          

          【讨论】:

            【解决方案5】:

            内部服务器错误(500)基本上意味着您的服务器无法成功处理此请求,而是出错。 (您可能希望在此处公开部分服务器代码以获得更多帮助)。 根据您的问题,我了解到如果出现错误,服务器将以文本/纯文本形式回答。 我想您的代码会引发此错误(JSON 文本不是以数组开头...),因为即使在 500 错误的情况下,您也试图将响应解析为 JSON(预计不会发生错误)。

            您可能希望共享其余的客户端代码。 纠正服务器端问题会有所帮助,但不会导致错误情况下的正确客户端代码逻辑。

            如果您需要访问Http错误代码,请看这里:is there an easy way to get the http status code in the failure block from AFHTTPClient?

            可能与您的问题类似:AFNetworking 2.0: NSLocalizedDescription=Request failed: unacceptable content-type: text/html

            【讨论】:

              【解决方案6】:

              试试这样的:

              AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:url]];
              manager.responseSerializer = [AFJSONResponseSerializer serializer];
              manager.requestSerializer = [AFJSONRequestSerializer serializer];
              

              【讨论】:

                猜你喜欢
                • 2016-09-27
                • 1970-01-01
                • 1970-01-01
                • 2014-01-15
                • 2018-05-11
                • 2013-10-07
                • 1970-01-01
                • 2015-02-12
                • 1970-01-01
                相关资源
                最近更新 更多