【问题标题】:Alamofire invalid value around character 0字符 0 周围的 Alamofire 无效值
【发布时间】:2015-11-28 02:54:03
【问题描述】:
Alamofire.request(.GET, "url").authenticate(user: "", password: "").responseJSON() {
    (request, response, json, error) in
    println(error)
    println(json)

}

这是我对 Alamofire 的请求,对于某个请求,它有时会起作用,但有时我会得到:

Optional(Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x78e74b80 {NSDebugDescription=Invalid value around character 0.})

我已经读到这可能是由于无效的 JSON,但响应是我在 JSON 验证器中验证为有效的静态 json 字符串。它确实包含 å ä ö 字符和一些 HTML。

为什么我有时会收到此错误?

【问题讨论】:

  • 当我收到此错误时,我喜欢做的一件事是注释掉 responseJSON() { ... } 块并替换为 .responseString { _, _, s, _ in println(s) }。这使您可以查看返回的 json,以查找任何使其无法被 responseJSON 解析的奇怪文本
  • 什么是响应状态码?
  • 我得到一个状态码 200 并且我得到这个错误。啊哈。在我的情况下脑死亡:)。我实际上并没有从服务器返回 JSON。这样就解决了。
  • 如果您使用 .POST 方法,这可能会起作用。
  • 检查你的网址:)

标签: ios swift alamofire


【解决方案1】:

我也遇到了同样的问题。我尝试了responseString 而不是responseJSON,它奏效了。我猜这是Alamofire 中的一个错误,与django 一起使用。

【讨论】:

  • 感谢您指出这一点。我使用的是 responseJSON,但来自服务器的实际响应是 XML 格式的!让我头疼:)
  • 在遇到这个问题数小时后保存了我的项目。我应该在我的服务器中设置 JSON 格式的响应。我没有这样做,但是一旦我这样做了,我就可以使用来自 alamofire 的 responseJSON
  • 如果您使用的是 GET,那么您只需要使用 responseString 检查,否则 POST 使用 responseJSON 检查它。参考:grokswift.com/updating-alamofire-to-swift-3-0
  • 因为我的 iOS 应用中的这个问题而失去了客户。
  • 你的响应被html弄乱了,你需要解析html并取出json字符串并将其转换为字典。我建议尝试 SwiftSoup 或 parseHtml 的更好替代方案,请查看stackoverflow.com/questions/31080818/…
【解决方案2】:

我在 Alamofire 中以多部分形式上传图片时遇到了同样的错误

multipartFormData.appendBodyPart(data: image1Data, name: "file")

我通过替换来修复

multipartFormData.appendBodyPart(data: image1Data, name: "file", fileName: "myImage.png", mimeType: "image/png")

希望这对某人有所帮助。

【讨论】:

  • 我花了好几个小时试图弄清楚这一点。我想知道为什么这个解决方案有效...谢谢!
【解决方案3】:

同样的问题发生在我身上,但实际上最终是服务器问题,因为没有设置内容类型。

添加

.validate(contentType: ["application/json"])

到请求链为我解决了

Alamofire.request(.GET, "url")
        .validate(contentType: ["application/json"])
        .authenticate(user: "", password: "")
        .responseJSON() { response in
            switch response.result {
            case .Success:
                print("It worked!")
                print(response.result.value)
            case .Failure(let error):
                print(error)
            }
        }

【讨论】:

    【解决方案4】:

    希望对你有帮助

    Alamofire.request(.GET, "YOUR_URL")
         .validate()
         .responseString { response in
             print("Success: \(response.result.isSuccess)")
             print("Response String: \(response.result.value)")
         }
    

    【讨论】:

    • Yes Bro.i 从您的回答中得到启发。我只是上传任何新人的代码
    【解决方案5】:

    也许为时已晚,但我用这里没有提到的另一种方式解决了这个问题:

    当你使用.responseJSON()时,必须将响应头设置为content-type = application/json,否则即使你的body是有效的JSON也会崩溃。因此,您的响应标头可能为空或使用其他内容类型。

    确保您的响应标头设置为 content-type = application/json.responseJSON() 在 Alamofire 中正常工作。

    【讨论】:

      【解决方案6】:

      我今天早上正在处理的应用程序也出现了同样的错误。我认为这是服务器端错误,因为我无法上传用户图片。

      但是,在检查我的自定义 API 时,我意识到在我没有更新 api.swift URL 的网站添加 SSL 证书后,数据无法发布:

      let HOME_URL = "http://sitename.io"
      let BASE_URL = "http://sitename.io/api"
      let UPLOAD_URL = "http://sitename.io/api/user/upload"
      

      我将 URL 更改为 https://。问题解决了。

      【讨论】:

        【解决方案7】:

        我遇到了同样的错误。但我找到了解决方案。

        注意 1:“这不是 Alarmofire 错误”,这是因为服务器错误。

        注意 2:您不需要将“responseJSON”更改为“responseString”。

        public func fetchDataFromServerUsingXWWWFormUrlencoded(parameter:NSDictionary, completionHandler: @escaping (_ result:NSDictionary) -> Void) -> Void {
        
                let headers = ["Content-Type": "application/x-www-form-urlencoded"]
                let completeURL = "http://the_complete_url_here"
                Alamofire.request(completeURL, method: .post, parameters: (parameter as! Parameters), encoding: URLEncoding.default, headers: headers).responseJSON { response in
        
                    if let JSON = response.result.value {
                        print("JSON: \(JSON)") // your JSONResponse result
                        completionHandler(JSON as! NSDictionary)
                    }
                    else {
                        print(response.result.error!)
                    }
                }
            }
        

        【讨论】:

          【解决方案8】:

          在我的情况下,我必须将这个键:“Accept”:“application/json”添加到我的标头请求中。

          类似这样的:

          let Auth_header: [String:String] = ["Accept":"application/json", "Content-Type" : "application/json", "Authorization":"Bearer MyToken"]
          

          我希望这可以帮助某人。

          【讨论】:

            【解决方案9】:

            这就是我设法解决 Invalid 3840 Err 的方法。

            错误日志

             responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
            
            1. 请求中使用了 Encoding 类型,所使用的编码类型应该在您的服务器端中被接受。

            为了知道编码,我必须遍历所有编码类型:

            默认/ 方法依赖/ 请求参数/ http正文

                let headers: HTTPHeaders = [
                    "Authorization": "Info XXX",
                    "Accept": "application/json",
                    "Content-Type" :"application/json"
                ]
            
                let parameters:Parameters = [
                    "items": [
                            "item1" : value,
                            "item2": value,
                            "item3" : value
                    ]
                ]
            
                Alamofire.request("URL",method: .post, parameters: parameters,encoding:URLEncoding.queryString, headers: headers).responseJSON { response in
                    debugPrint(response)
                 }
            
            1. 这还取决于我们收到的响应,使用适当的
              • 响应字符串
              • 响应JSON
              • 响应数据

            如果响应不是 JSON 并且只是响应中的字符串,请使用 responseString

            示例:在登录/创建令牌 API 的情况下:

            “20dsoqs0287349y4ka85u6f24gmr6pah”

            响应字符串

            【讨论】:

              【解决方案10】:

              嘿,伙计们,这是我发现的问题:我通过一个函数调用 Alamofire 来验证用户:我使用了函数“登录用户”以及将从“正文”调用的参数(电子邮件:字符串, 密码: String) 那将被传递

              我的错误是:

              optional(alamofire.aferror.responseserializationfailed(alamofire.aferror.responseserializationfailurereason.jsonserializationfailed(error domain=nscocoaerrordomain code=3840 "invalid value around character 0." userinfo={nsdebugdescription=invalid value around character 0

              字符 0 是这里的关键:表示“电子邮件”的调用与参数不匹配:参见下面的代码

              func loginUser(email: String, password: String, 完成: @escaping downloadComplete) { 让 lowerCasedEmail = email.lowercased()

                  let header = [
                      "Content-Type" : "application/json; charset=utf-8"
                  ]
                  let body: [String: Any] = [
                      "email": lowerCasedEmail,
                      "password": password
                  ]
              
                  Alamofire.request(LOGIN_USER, method: .post, parameters: body, encoding: JSONEncoding.default, headers: header).responseJSON { (response) in
                      if response.result.error == nil {
              
                          if let data = response.result.value as? Dictionary<String, AnyObject> {
                              if let email = data["user"] as? String {
                                  self.userEmail = email
                                  print(self.userEmail)
                              }
                              if let token = data["token"] as? String {
                                  self.token_Key = token
                                  print(self.token_Key)
                              }
              

              函数参数中的“email”在解析时必须与let“email”匹配,然后它才能工作..我不再收到错误......并且字符0是Alamofire的“body”参数中的“email”请求:

              希望对你有帮助

              【讨论】:

                【解决方案11】:

                我用这个作为标题解决了:

                let header = ["Content-Type": "application/json", "accept": "application/json"]

                【讨论】:

                  【解决方案12】:

                  我在我的参数中向服务器发送了不正确的类型(字符串)(需要是一个 Int)。

                  【讨论】:

                    【解决方案13】:

                    我面临同样的问题,问题出在参数中。

                    let params = [kService: service,
                                      kUserPath: companyModal.directory_path,
                                      kCompanyDomain: UserDefaults.companyDomain,
                                      kImageObject: imageString,
                                      kEntryArray: jsonString,
                                      kUserToken:  UserDefaults.authToken] as [String : Any]
                    

                    companyModal.directory_path 是网址。它从字符串强制转换为任何在服务器端产生问题的字符串。要解决此问题,我必须提供默认值,使其成为字符串值。

                     let params = [kService: kGetSingleEntry,
                                      kUserPath: companyModal.directory_path ?? "",
                                      kCompanyDomain: UserDefaults.companyDomain,
                                      kUserToken: UserDefaults.authToken,
                                      kEntryId: id,
                                      ] as [String: Any]
                    

                    【讨论】:

                      【解决方案14】:

                      添加编码后错误已解决:JSONEncoding.default with Alamofire。

                        Alamofire.request(urlString, method: .post, parameters: 
                        parameters,encoding: 
                        JSONEncoding.default, headers: nil).responseJSON {  
                         response in
                         switch response.result {
                                         case .success:
                                          print(response)
                                          break
                      
                                          case .failure(let error):
                                           print(error)
                              }
                         }
                      

                      【讨论】:

                        【解决方案15】:

                        您的路径末尾可能有“/”。如果不是 GET 请求,请不要在最后加上“/”,否则会报错

                        【讨论】:

                          【解决方案16】:

                          在我的例子中,URL 中有一个额外的 /。

                          【讨论】:

                            【解决方案17】:

                            就我而言,我的服务器 URL 不正确。检查您的服务器网址!!

                            【讨论】:

                            • 这对我来说是个问题。我不敢相信我错过了。我必须养成首先检查 URL 的习惯,而且总是如此!
                            【解决方案18】:

                            我将 mimeType 从“mov”更改为“multipart/form-data”。

                            Alamofire.upload(multipartFormData: { (multipartFormData) in
                                        do {
                                            let data = try Data(contentsOf: videoUrl, options: .mappedIfSafe)
                                            let fileName = String(format: "ios-video_%@.mov ", profileID)
                                            multipartFormData.append(data, withName: "video", fileName: fileName, mimeType: "multipart/form-data")
                            
                                        } catch  {
                                            completion("Error")
                                        }
                                    }, usingThreshold: .init(), to: url,
                                       method: .put,
                                       headers: header)
                            

                            为我工作.. :)

                            【讨论】:

                              【解决方案19】:

                              就我而言:

                              let header = ["Authorization": "Bearer \(Authserices.instance.tokenid)"]
                              

                              我忘记了\之前的空格(Bearer之后)

                              【讨论】:

                                【解决方案20】:

                                在我的情况下,错误是由于重复的电子邮件。您可以在 postman 上重新检查您的 API 以查看响应是否正常。

                                【讨论】:

                                  【解决方案21】:

                                  就我而言,我尝试使用 Postman 获取 API,但此错误来自后端。

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 2018-12-07
                                    • 1970-01-01
                                    • 2014-09-08
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2018-02-20
                                    • 1970-01-01
                                    • 2016-09-19
                                    相关资源
                                    最近更新 更多