Alamofire 字符 0 周围的值无效 |斯威夫特 4

Posted

技术标签:

【中文标题】Alamofire 字符 0 周围的值无效 |斯威夫特 4【英文标题】:Alamofire Invalid value around character 0 | Swift 4 【发布时间】:2018-11-08 14:32:56 【问题描述】:

所以我反复收到此错误:

“字符 0 周围的值无效。”

我已经用尽了所有方法来调试它。基本上,API 在 Postman 中运行良好,但在代码中却严重失败。邮递员是本地设置的,因此我不能在这里分享。无论如何,这是我的代码:

        let headers = ["Content-Type": "application/json",
                       "Accept": "application/json"]
        let params = ["userId":"98", "candidateId":"4"]

        Alamofire.request(url, method: .post, parameters: params, encoding:
            JSONEncoding.default, headers: headers).response  response in

                if let data = response.data 
                    do 
                        let json = try JSONSerialization.jsonObject(with: data, options: [.allowFragments]) as? [String: Any]
                        completion(json , nil)
                     catch 
                        completion(nil, response.error)
                    
                else
                    completion(nil, response.error)
                
        

我尝试过 responseString、responseJSON & response 和 JSONSerialization 我已经使用了带有 .allowFragments、.mutableContainers 和 .mutableLeaves 的选项,但没有用。我什至尝试给它标题,尽管邮递员调用不包括标题,但又一次失败了。我该怎么办,请帮忙。下面是响应对象的快照:

这是我这样做后得到的responseString:

String(data: data, encoding: .utf8)

& 这是我删除 .allowFragments 时的错误:

Error Domain=NSCocoaErrorDomain Code=3840 "JSON 文本没有开始 带有数组或对象以及允许未设置片段的选项。” UserInfo=NSDebugDescription=JSON 文本不是以数组开头或 允许未设置片段的对象和选项。

邮递员电话快照:

【问题讨论】:

发送标头Content-Type: application/jsonAccept-Type: application/json 我做了但无济于事 打印 reponseString 并检查它是否真的是 JSON,或者您是否缺少参数/标题。 responseString 得到了什么? 再一次,responseString (或 String(data: data, encoding: .utf8) 是什么?另外,.mutableContainers & .mutableLeaves 不应该在 Swift 中使用。如果你使用 String,Swift 数组的 Swift 字典, 它们已经是可变的。.allowFragments 用于验证特定的 JSON:单个 String(当顶层是字符串,而不是数组/字典时)。 【参考方案1】:

问题在于你的标题

let headers = ["Content-Type": "application/json",
                "Accept-Type": "application/json"]

Accept-Type 不是有效的 HTTP 标头。你需要的是Accept

let headers = ["Content-Type": "application/json",
                     "Accept": "application/json"]

【讨论】:

【参考方案2】:

就我而言:

更改内容类型标头
 headers = [
        "Content-Type": "application/json",
        "Authorization" : "Token"
    ]

 headers    = [
            "Content-Type": "application/x-www-form-urlencoded",
            "Authorization" : "Token"
        ]

成功了!

【讨论】:

【参考方案3】:

好像这个问题很久以前就已经发布了,但我很早就遇到了这个问题。因此,我将留下一些解决方案,希望对面临此错误的人有所帮助。

我将列出一些可以修复错误的解决方案:

    检查标头并识别来自服务器的响应

这可能会导致出现此错误,因为有时服务器响应 jsonxml 或只是 x-www-form-urlencoded 所以您必须仔细查看响应类型,我们必须创建标头以匹配这些类型。

例如:

[JSON 数据]let header: HTTPHeaders = ["Content-Type": "application/json"]

[x-www-form-urlencoded]let header: HTTPHeaders = ["Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"]

    这个真的很简单也很棘手,它是你的端点有时我们错过了这个地方,无效或丢失的端点也可能出现这个错误,就我而言,我错过了这一点。

嗯,我希望这个小信息可以帮助和我面临同样问题的人,加油。

【讨论】:

以上是关于Alamofire 字符 0 周围的值无效 |斯威夫特 4的主要内容,如果未能解决你的问题,请参考以下文章

错误:错误域 = NSCocoaErrorDomain 代码 = 3840“字符 0 周围的值无效。” UserInfo=NSDebugDescription=字符 0 周围的值无效。

Code=3840 “字符 0 周围的值无效。”

错误域 = NSCocoaErrorDomain 代码 = 3840 “字符周围的值无效

Alamofire 的身份验证不断失败

NSDebugDescription=字符 0 周围的值无效。- JSON 错误

字符0,NSJSONSerialization周围的值无效