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。
为什么我有时会收到此错误?
答案 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.}))
为了知道编码,我必须运行所有编码类型:
默认/ 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)
}
如果回复不是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,并且此错误来自后端。