Swift 项目中的 AFNetorking ——“错误:请求失败:不可接受的内容类型:文本/html”

Posted

技术标签:

【中文标题】Swift 项目中的 AFNetorking ——“错误:请求失败:不可接受的内容类型:文本/html”【英文标题】:AFNetorking in Swift project -- "Error: Request failed: unacceptable content-type: text/html" 【发布时间】:2014-10-16 15:47:09 【问题描述】:

我正在将 AFNetworking 与 CocoaPods 实现到一个 Swift 项目中。我习惯用 Ruby 编程,而且我对 ios 开发非常陌生。 Cocoapods 很难在我的项目中正常工作,但我现在可以成功访问 AFNetworking 库。

我想要做的是用 POST 打一个表单,然后得到一个“text/html”的响应,我可以解析它,这样我就可以判断它是否保存。这不是 API 本身,而是 InfusionSoft 生成的表单。用户将输入一个电子邮件地址,我会将其发送到 API 进行存储。这是我正在使用的代码:

let manager = AFHTTPRequestOperationManager()
            var parameters = ["inf_form_xid": "MY_ACCESS_ID",
                      "inf_form_name": "Webform in Content App",
                      "infusionsoft_version": "1.34.0.35",
                      "inf_field_email": self.emailTextField.text]

    manager.POST( "https://ns166.infusionsoft.com/app/form/process/REALLYLONGUNIQUEID",
    parameters: parameters,
    success:  (operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
        println("JSON: " + responseObject.description)
    ,
    failure:  (operation: AFHTTPRequestOperation!,error: NSError!) in
        println("Error: " + error.localizedDescription)
    )

我收到的错误是来自 AFNetworking 的响应:

Error: Request failed: unacceptable content-type: text/html

最后,我想在允许用户继续使用应用程序之前验证它是否已被服务器保存。

非常感谢任何帮助。

【问题讨论】:

Request failed: unacceptable content-type: text/html using AFNetworking 2.0 的可能重复项 @mattt 谢谢,但我正在寻找 Swift 而不是 OBJ-C 的东西 还是同一个问题。使用的语言并不是那么重要。这确实是 AFNetworking 的 API 的问题。 @mattt 但我仍然遇到我期望来自 POST 请求的文本/html 但 AFNetworking 说这是不可接受的问题。我需要添加 text/html 为可接受的 【参考方案1】:

您必须为响应添加允许的内容类型。

你可以为 json 内容做到这一点:

 manager.responseSerializer.acceptableContentTypes = NSSet(objects: "application/json")

编辑

如果您使用的是 AFNetworking 2.0,来自AFNetworking wiki:

“默认情况下,AFHTTPRequestOperationManager 和 AFHTTPSessionManager 有 JSON 序列化器。”

因此,您或许应该尝试像这样更改管理器中的响应序列化程序:

manager.responseSerializer = AFHTTPResponseSerializer()

【讨论】:

我期待 text/html 作为响应。如果我使用您的建议,但将“application/json”换成“text/html”,它仍然无法正常工作。我实际上得到了一个不同的错误错误:无法完成操作。 (可可错误 3840。) 此错误表示您的响应内容格式不正确。例如在 JSON 中,如果 JSON 无效,您将收到此错误。那么你能用你期望的响应内容来编辑你的问题吗? 当我向 manager.responseSerializer 提出您的建议时,我收到了以下回复: 检查您的标头响应,是否有charset 标头?如果没有尝试添加它:charset=UTF-8. 或尝试在您的成功回复中执行此操作:println((NSString(data: responseObject, encoding: NSUTF8StringEncoding)))【参考方案2】:

这意味着您的服务器正在发送“text/html”而不是已经支持的类型。您可以将可接受的内容类型添加为“text/html”或确保您从服务器端正确发送 json 格式。通过默认情况下,afnetworking 的内容类型是目标 c 中的 json。不知道 swift。 参考:Request failed: unacceptable content-type: text/html using AFNetworking 2.0

【讨论】:

我期待文本/html。不幸的是,AFNetworking 期待 JSON 并且正在等待响应。【参考方案3】:

我不确定 swift 但在目标 c 中,在搜索答案后,我遇到了对我非常有效的解决方案。 下面是代码sn-p:

AFHTTPRequestOperationManager *operation = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];

AFJSONResponseSerializer *jsonResponseSerializer = [AFJSONResponseSerializer serializer];

NSMutableSet *jsonAcceptableContentTypes = [NSMutableSet setWithSet:jsonResponseSerializer.acceptableContentTypes];
[jsonAcceptableContentTypes addObject:@"text/plain"];
jsonResponseSerializer.acceptableContentTypes = jsonAcceptableContentTypes;
operation.responseSerializer = jsonResponseSerializer;

【讨论】:

以上是关于Swift 项目中的 AFNetorking ——“错误:请求失败:不可接受的内容类型:文本/html”的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 项目中使用 Objective C 类中的 Swift 类

在 Swift 项目中使用 Objective C 类中的 Swift 类

Swift 项目中的版本控制

目标 C 项目中的 Xcode 8.3 Swift 版本错误 (SWIFT_VERSION)

如何使用 Swift 对我的项目中的 Foreach 循环中的“金钱”值求和? [关闭]

在 AVPlayer [Swift] 中播放 MPMediaItemCollection 中的项目