字符0周围的Alamofire无效值


93
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。

为什么有时会出现此错误?


12
当我收到此错误时,我想做的一件事是注释掉该responseJSON() { ... }块并替换为.responseString { _, _, s, _ in println(s) }。这可以让你看到返回寻找任何奇怪的文字,将使其unparsible由JSONresponseJSON
ad121

什么是响应状态码?
萨希尔·卡普尔

1
我得到的状态码为200,并且出现此错误。啊。我的脑死亡:)。我实际上不是从服务器返回JSON。解决了。
克里斯·普林斯

如果您使用.POST方法,则可能会起作用。
Surjeet Rajput

检查您的网址:)
Alok

Answers:


136

我也面临同样的问题。我尝试responseString而不是,responseJSON它的工作。我猜这是Alamofire与一起使用时的错误django


3
感谢您指出了这一点。我使用的是responseJSON,但服务器的实际响应为XML格式!让
我省

经过数小时的时间后,我保存了我的项目。我应该在服务器中以JSON格式设置响应。我没有这样做,但是一旦这样做,我就可以使用来自alamofire的responseJSON
guijob

如果您使用的是GET,则只需要使用responseString进行检查,否则进行POST时请使用responseJSON进行检查。参考:grokswift.com/updating-alamofire-to-swift-3-0
Anurag Sharma,

由于这个问题,我在iOS应用中失去了客户。
杰西姆·阿巴斯

1
您的响应被html弄乱了,您需要解析html并获取json字符串并将其转换为字典。我建议尝试SwiftSwup或parseHtml的更好替代方法,请查看stackoverflow.com/questions/31080818/…
Smit

9

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

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

我通过替换固定

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

希望这对某人有帮助。


我有几个小时试图弄清楚这一点。我不知道为什么这种解决方案有效...谢谢!
MXV

7

希望这对你有帮助

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

是的,Bro.i从您的回答中得到了启发。我只是上传任何新鲜的代码
Krutarth Patel

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

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


这是我的问题。我简直不敢错过。我必须养成先经常检查URL的习惯!
6

4

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

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

4

这就是我设法解决无效的3840错误的方法。

错误日志

 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. 这也取决于我们收到的响应是否使用适当的
    • responseString
    • responseJSON
    • responseData

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

示例:如果登录/创建令牌API:

“ 20dsoqs0287349y4ka85u6f24gmr6pah”

responseString




1

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

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

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


1

大家好,这就是我遇到的问题:我通过一个用于验证用户身份的函数调用Alamofire:我使用了“登录用户”函数,并带有从“正文”中调用的参数(电子邮件:字符串,密码:字符串)将被传递

我的错误是:

可选(alamofire.aferror.responseserializationfailed(alamofire.aferror.responseserializationfailurereason.jsonserializationfailed(错误域= nscocoaerror域代码= 3840“字符0附近的无效值。” userinfo = {nsdebugdescription =字符0附近的无效值

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

func loginUser(电子邮件:字符串,密码:字符串,完成:@转义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”:

希望这可以帮助


1

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


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

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://。问题解决了。


0

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

像这样:

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

我希望这可以帮助某人。


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]

0

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


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)

为我工作.. :)


0

就我而言:

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

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.