Alamofire在字符0附近的值无效
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,但响应是一个静态JSONstring,我已经在JSONvalidation器validation有效。 它确实包含字符和一些HTML。
为什么我有时会得到这个错误?
我也面临同样的问题,我试着responseString而不是responseJSON和它的工作。我想这是alamofire与Django的使用它的错误。
我在使用Alamofire时以多部分forms上传图像时出现同样的错误
multipartFormData.appendBodyPart(data: image1Data, name: "file")
我通过replace修复
multipartFormData.appendBodyPart(data: image1Data, name: "file", fileName: "myImage.png", mimeType: "image/png")
希望这可以帮助别人。
可以这个帮助YOU
Alamofire.request(.GET, "YOUR_URL") .validate() .responseString { response in print("Success: \(response.result.isSuccess)") print("Response String: \(response.result.value)") }
同样的问题发生在我身上,它实际上最终成为服务器问题,因为没有设置内容types。
添加
.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) } }
我得到了同样的错误。 但我find了解决办法。
注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!) } } }
这是我设法解决无效的3840错误。
它与请求中使用的编码types一致,使用的编码types应该在服务器端被接受。
为了了解编码,我必须运行所有的编码types:
默认/ 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) }
也许是为时已晚,但我用另一种方式解决了这个问题:
当你使用.responseJSON()
,你必须设置content-type = application/json
的响应头,否则,即使你的主体是一个有效的JSON,它也会崩溃。 所以,也许你的回应标题是空的或使用另一种内容types。
请确保您的响应头设置为content-type = application/json
to .responseJSON()
。
我今天上午工作的应用程序也有同样的错误。 我相信这是一个服务器端错误,因为我无法上传用户图像。
但是,在检查我的自定义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://。 问题解决了。
在我的情况下,我必须添加此密钥:“接受”:“应用程序/ json”到我的标题请求。
像这样的东西:
let Auth_header: [String:String] = ["Accept":"application/json", "Content-Type" : "application/json", "Authorization":"Bearer MyToken"]
我希望这可以帮助别人。
嗨,这就是我发现的问题:我通过一个函数来调用Alamofire来validation用户:我使用了“Login User”这个函数,用“body”(email:String,password:string)这将被传递
我的错误正是:
(alamofire.aferror.responseserializationfailed(alamofire.aferror.responseserializationfailurereason.jsonserializationfailed(error domain = nscocoaerrordomain code = 3840“invalid value around character。”)userinfo = {nsdebugdescription =字符0附近无效值
字符0是这里的关键字:表示“email”的调用与参数不匹配:请参阅下面的代码
func loginUser(email:String,密码:String,已完成:@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”在parsing时必须与let“email”匹配,然后才能正常工作。我不再有错误…而且字符0是Alamofire请求的“body”参数中的“email”
希望这可以帮助