Alamofire字符0周围的值无效

时间:2015-09-02 14:25:56

标签: ios swift alamofire

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。

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

21 个答案:

答案 0 :(得分:115)

我也面临同样的问题。我尝试了responseString而不是responseJSON并且它有效。我想这是Alamofire中的一个错误,与django一起使用。

答案 1 :(得分:9)

我在Alamofire中以多部分形式上传图片时遇到同样的错误,因为我正在使用

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

我通过替换

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

希望这有助于某人。

答案 2 :(得分:6)

祝你有所帮助

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

答案 3 :(得分:5)

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

添加

.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 :(得分:3)

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

注1:"它不是Alarmofire错误",它是服务器错误的一部分。

注意2:您不需要更改" responseJSON" to" 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!)
            }
        }
    }

答案 5 :(得分:3)

这就是我设法解决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. 在请求中使用编码类型时,应在服务器端中接受使用的编码类型。
  2. 为了知道编码,我必须运行所有编码类型:

      

    默认/   methodDependent /   请求参数/   httpBody

        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. 它还取决于我们正在接收的响应使用适当的
      • responseString
      • responseJSON
      • responseData
    2. 如果回复不是JSON&只需在响应中使用 responseString

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

        

      “20dsoqs0287349y4ka85u6f24gmr6pah”

           

      responseString

答案 6 :(得分:1)

我解决了使用它作为标题:

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

答案 7 :(得分:1)

在我的情况下,我的服务器URL不正确。检查您的服务器URL !!

答案 8 :(得分:1)

添加编码后解决错误:Alamofire使用JSONEncoding.default。

  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)
        }
   }

答案 9 :(得分:1)

嘿伙计这就是我发现的问题:我通过一个功能来验证用户呼叫Alamofire:我使用了功能"登录用户"使用将从" body"(email:String,password:String)调用的参数将传递

我的错误完全是:

可选(alamofire.aferror.responseserializationfailed(alamofire.aferror.responseserializationfailurereason.jsonserializationfailed)(错误域= nscocoaerrordomain代码= 3840"字符0周围的值无效。" userinfo = {nsdebugdescription =字符0周围的无效值

字符0是这里的关键:意味着呼叫"电子邮件"与参数不匹配:请参阅下面的代码

func loginUser(email:String,password:String,completed:@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)
                }

&#34;电子邮件&#34;在函数参数中必须匹配let&#34; email&#34;解析然后它将工作..我不再有错误...而字符0是&#34;电子邮件&#34;在&#34;身体&#34; Alamofire请求的参数:

希望这有帮助

答案 10 :(得分:1)

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

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

确保您的回复标题在Alamofire中content-type = application/json.responseJSON()设置正常。

答案 11 :(得分:0)

在我的情况下,我必须添加此密钥:&#34;接受&#34;:&#34; application / json&#34;我的标题请求。

这样的事情:

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

我希望这可以帮助别人。

答案 12 :(得分:0)

我正在使用参数(需要为Int)将不正确的类型(字符串)发送到服务器。

答案 13 :(得分:0)

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

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 :(得分:0)

我今天早上工作的应用程序有同样的错误。我认为这是服务器端错误,因为我无法上传用户图像。

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

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

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

答案 15 :(得分:0)

路径的结尾可能带有“ /”。如果不是GET请求,则不要在末尾加上“ /”,否则会出现错误

答案 16 :(得分:0)

就我而言,URL中有一个额外的/。

答案 17 :(得分:0)

我将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)

为我工作..:)

答案 18 :(得分:0)

就我而言:

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

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

答案 19 :(得分:0)

就我而言,错误是由于电子邮件重复造成的。您可以在邮递员上重新检查您的API,以查看响应是否正常。

答案 20 :(得分:0)

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