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
のバグだと思います。
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:「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 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の作成:
「20dsoqs0287349y4ka85u6f24gmr6pah」
responseString
これをヘッダーとして使用して解決しました:
let header = ["Content-Type": "application/json", "accept": "application/json"]
私の場合、サーバーのURLが間違っていました。サーバーのURLを確認してください!!
エンコーディングを追加した後のエラーは解決されました:JSONEncoding.default with 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)
}
}
やあみんなこれは私の問題であることがわかった:私はユーザーを認証する関数を介してAlamofireを呼び出していた:私は関数「Login User」を使用し、「body」(email:String、password:文字列)それが渡されます
私のエラーは正確に:
optional(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)
}
関数パラメーターの「電子メール」は、解析時にlet「電子メール」と一致する必要があります。エラーが発生しなくなりました...そして、Alamofire要求の「body」パラメーターの文字0は「電子メール」でした。
お役に立てれば
遅すぎるかもしれませんが、ここで言及されていない別の方法でこの問題を解決しました:
.responseJSON()
を使用する場合は、content-type = application/json
を使用して応答ヘッダーを設定する必要があります。設定しない場合、ボディが有効なJSONであってもクラッシュします。したがって、応答ヘッダーが空であるか、別のコンテンツタイプを使用している可能性があります。
Alamofireの応答ヘッダーがcontent-type = application/json
から.responseJSON()
に設定されていることを確認してください。
今朝作業していたアプリケーションにも同じエラーがありました。ユーザー画像をアップロードできなかったため、サーバー側のエラーであると考えました。
ただし、カスタムAPIを確認すると、api.Swift URLを更新していないSSL証明書をWebサイトに追加した後、データを投稿できないことがわかりました。
let HOME_URL = "http://sitename.io"
let BASE_URL = "http://sitename.io/api"
let UPLOAD_URL = "http://sitename.io/api/user/upload"
URLをhttps://に変更しました。問題が解決しました。
私の場合、URLに余分な/がありました。
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)
私のために働いた.. :)
私の場合、このキー: "Accept": "application/json"をヘッダーリクエストに追加する必要があります。
このようなもの:
let Auth_header: [String:String] = ["Accept":"application/json", "Content-Type" : "application/json", "Authorization":"Bearer MyToken"]
これが誰かを助けることを願っています。
おそらく、パスの最後に「/」があります。 GETリクエストでない場合は、末尾に「/」を入れないでください。そうしないと、エラーが発生します。
私は同じ問題に直面しており、問題はパラメータにあります。
let params = [kService: service,
kUserPath: companyModal.directory_path,
kCompanyDomain: UserDefaults.companyDomain,
kImageObject: imageString,
kEntryArray: jsonString,
kUserToken: UserDefaults.authToken] as [String : Any]
companyModal.directory_path
はurlです。文字列からサーバー側で問題を引き起こすものに強制されました。この問題を解決するには、文字列値にするデフォルト値を指定する必要があります。
let params = [kService: kGetSingleEntry,
kUserPath: companyModal.directory_path ?? "",
kCompanyDomain: UserDefaults.companyDomain,
kUserToken: UserDefaults.authToken,
kEntryId: id,
] as [String: Any]
私はパラメータで不適切なタイプ(String)をサーバーに送信していました(Intである必要があります)。