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。
为什么我有时会收到此错误?
我也面临同样的问题。我尝试了responseString
而不是responseJSON
并且它有效。我想这是Alamofire
中的一个错误,与django
一起使用它。
添加编码后错误得到解决: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)
}
}
就我而言,我的服务器URL不正确。检查您的服务器URL !!
我今天早上工作的应用程序有同样的错误。我认为这是服务器端错误,因为我无法上传用户图像。
但是,在检查我的自定义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://。问题解决了。
在我的情况下,我必须添加此密钥:“接受”:“application / json”到我的标头请求。
像这样的东西:
let Auth_header: [String:String] = ["Accept":"application/json", "Content-Type" : "application/json", "Authorization":"Bearer MyToken"]
我希望这可以帮助别人。
我在我的参数中发送了不正确的类型(String)到服务器(需要是一个Int)。
我面临同样的问题,问题在于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]
可能你的路径末尾有“/”。如果不是GET请求,则不应将“/”放在最后,否则您将收到错误
就我而言,URL中有一个额外的/。
我在Alamofire中使用多部分形式上传图像时遇到了同样的错误
multipartFormData.appendBodyPart(data: image1Data, name: "file")
我通过替换来修复
multipartFormData.appendBodyPart(data: image1Data, name: "file", fileName: "myImage.png", mimeType: "image/png")
希望这能有所帮助。
同样的问题发生在我身上,它实际上最终成为服务器问题,因为没有设置内容类型。
添加
.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)
}
}
愿这个帮助你
Alamofire.request(.GET, "YOUR_URL")
.validate()
.responseString { response in
print("Success: \(response.result.isSuccess)")
print("Response String: \(response.result.value)")
}
我得到了同样的错误。但我找到了解决方案。
注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!)
}
}
}
这就是我设法解决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.}))
为了知道编码我必须运行所有编码类型:
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)
}
如果响应不是JSON并且响应中只是字符串,则使用responseString
示例:登录/创建令牌API的情况:
“20 Desouqas 0287349 Y 4 Kfourhfhh 4 Ghamrptah”
responseString
我解决了使用它作为标题:
let header = ["Content-Type": "application/json",
"accept": "application/json"]
也许为时已晚,但我用另一种未提及的方式解决了这个问题:
当你使用.responseJSON()
时,你必须用content-type = application/json
设置响应头,否则,即使你的身体是一个有效的JSON,它也会崩溃。因此,也许您的响应标头为空或使用其他内容类型。
确保您的响应标头设置为使用content-type = application/json
到Alamofire中的.responseJSON()
正常工作。
嘿伙计这是我发现的问题:我通过一个函数来调用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”:
希望这可以帮助