Alamofire字符0周围的值无效

问题描述 投票:79回答:17
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。

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

ios swift alamofire
17个回答
117
投票

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


1
投票

添加编码后错误得到解决:JSONEncoding.default与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)
        }
   }

1
投票

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


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"

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


0
投票

在我的情况下,我必须添加此密钥:“接受”:“application / json”到我的标头请求。

像这样的东西:

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

我希望这可以帮助别人。


0
投票

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


0
投票

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

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]

0
投票

可能你的路径末尾有“/”。如果不是GET请求,则不应将“/”放在最后,否则您将收到错误


0
投票

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


9
投票

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

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

我通过替换来修复

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

希望这能有所帮助。


6
投票

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

添加

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

6
投票

愿这个帮助你

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

3
投票

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

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

注意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!)
            }
        }
    }

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. 使用请求中使用的编码类型时,应在您的服务器端接受使用的编码类型。

为了知道编码我必须运行所有编码类型:

default / methodDependent / queryString / 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. 它还取决于我们收到的响应是否合适 响应字符串 responseJSON 响应数据

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

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

“20 Desouqas 0287349 Y 4 Kfourhfhh 4 Ghamrptah”

responseString


2
投票

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

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


1
投票

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

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

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


1
投票

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

我的错误是:

可选(alamofire.aferror.responseserializationfailed(alamofire.aferror.responseserializationfailurereason.jsonserializationfailed(error domain = nscocoaerrordomain code = 3840)字符0周围的值无效。“userinfo = {nsdebugdescription =字符0周围的无效值

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

func loginUser(email:String,password:String,completed:@escaping downloadComplete){let 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”:

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.