Alamofire.request(.GET, "url").authenticate(user: "", password: "").responseJSON() {
(request, response, json, error) in
println(error)
println(json)
}
Ini adalah permintaan saya dengan Alamofire, untuk permintaan tertentu terkadang berhasil, tetapi terkadang saya mendapatkan:
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.})
Saya telah membaca bahwa ini dapat disebabkan oleh JSON yang tidak valid, tetapi responsnya adalah string json statis yang telah saya validasi di validator JSON sebagai valid. Itu memang berisi karakter å ä ö dan beberapa HTML.
Mengapa saya terkadang mendapatkan kesalahan ini?
responseJSON() { ... }
blok dan mengganti dengan.responseString { _, _, s, _ in println(s) }
. Itu memungkinkan Anda melihat json yang dikembalikan untuk mencari teks ganjil yang akan membuatnya tidak dapat dibaca olehresponseJSON
Jawaban:
Saya juga menghadapi masalah yang sama. Saya mencoba
responseString
alih-alihresponseJSON
dan itu berhasil. Saya kira ini adalah bugAlamofire
dengan menggunakannya dengandjango
.sumber
Saya mendapat error yang sama saat mengupload gambar dalam bentuk multipart di Alamofire seperti yang saya gunakan
multipartFormData.appendBodyPart(data: image1Data, name: "file")
saya perbaiki dengan mengganti oleh
multipartFormData.appendBodyPart(data: image1Data, name: "file", fileName: "myImage.png", mimeType: "image/png")
Semoga ini bisa membantu seseorang.
sumber
Semoga ini Membantu Anda
Alamofire.request(.GET, "YOUR_URL") .validate() .responseString { response in print("Success: \(response.result.isSuccess)") print("Response String: \(response.result.value)") }
sumber
Dalam kasus saya, URL server saya salah. Periksa URL server Anda !!
sumber
Masalah yang sama terjadi pada saya dan akhirnya menjadi masalah server karena jenis konten tidak disetel.
Menambahkan
.validate(contentType: ["application/json"])
Untuk rantai permintaan diselesaikan untuk saya
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) } }
sumber
Saya mendapat kesalahan yang sama. Tetapi saya menemukan solusi untuk itu.
CATATAN 1: "Ini bukan kesalahan Alarmofire", itu karena kesalahan server.
CATATAN 2: Anda tidak perlu mengubah "responseJSON" menjadi "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!) } } }
sumber
Ini adalah bagaimana saya berhasil menyelesaikan Invalid 3840 Err.
Log kesalahan
responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
Untuk mengetahui Pengkodean, saya harus menjalankan semua Jenis Pengkodean:
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) }
Jika responsnya bukan JSON & hanya string dalam respons, gunakan responseString
Contoh : dalam kasus login / create token API:
sumber
Saya menyelesaikan menggunakan ini sebagai tajuk:
let header = ["Content-Type": "application/json", "accept": "application/json"]
sumber
Dalam kasus saya, ada tambahan / di URL.
sumber
Mungkin sudah terlambat tetapi saya menyelesaikan masalah ini dengan cara lain yang tidak disebutkan di sini:
Saat menggunakan
.responseJSON()
, Anda harus menyetel header respons dengancontent-type = application/json
, jika tidak, header tersebut akan macet meskipun badan Anda adalah JSON yang valid. Jadi, mungkin header respons Anda kosong atau menggunakan tipe konten lain.Pastikan header respons Anda disetel
content-type = application/json
ke.responseJSON()
di Alamofire berfungsi dengan baik.sumber
Hai teman-teman, inilah yang saya temukan sebagai masalah saya: Saya memanggil Alamofire melalui fungsi untuk Mengautentikasi Pengguna: Saya menggunakan fungsi "Pengguna Login" Dengan parameter yang akan dipanggil dari "tubuh" (email: String, sandi: String) Itu akan dilewatkan
kesalahan saya persis:
opsional (alamofire.aferror.responseserializationfailed (alamofire.aferror.responseserializationfailurereason.jsonserializationfailed (domain kesalahan = kode nscocoaerrordomain = 3840 "nilai tidak valid di sekitar karakter 0." userinfo = {nsdebugdescription = nilai tidak valid di sekitar karakter 0
karakter 0 adalah kuncinya di sini: artinya panggilan untuk "email" tidak cocok dengan parameter: Lihat kode di bawah ini
func loginUser (email: String, password: String, selesai: @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" dalam parameter fungsi harus cocok dengan biarkan "email" saat parsing maka itu akan berfungsi .. Saya tidak lagi mendapat kesalahan ... Dan karakter 0 adalah "email" di parameter "body" untuk permintaan Alamofire:
Semoga ini membantu
sumber
Saya mengirim jenis yang tidak tepat (String) ke server dalam parameter saya (harus menjadi Int).
sumber
Kesalahan diselesaikan setelah menambahkan pengkodean: JSONEncoding.default dengan 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) } }
sumber
Aplikasi yang saya kerjakan pagi ini mengalami kesalahan yang sama. Saya yakin ini adalah kesalahan sisi server karena saya tidak dapat mengunggah gambar pengguna.
Namun, setelah memeriksa API khusus saya, saya menyadari bahwa setelah menambahkan sertifikat SSL ke situs web saya bahwa saya belum memperbarui URL api.swift, data tidak dapat dikirim:
let HOME_URL = "http://sitename.io" let BASE_URL = "http://sitename.io/api" let UPLOAD_URL = "http://sitename.io/api/user/upload"
Saya mengubah URL menjadi https: //. Masalah terpecahkan.
sumber
Dalam kasus saya, saya harus menambahkan Kunci ini: "Terima": "application / json" ke permintaan header saya.
Sesuatu seperti ini:
let Auth_header: [String:String] = ["Accept":"application/json", "Content-Type" : "application/json", "Authorization":"Bearer MyToken"]
Saya berharap ini dapat membantu seseorang.
sumber
Saya menghadapi masalah yang sama dan masalah ada di 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
adalah url. itu dipaksa dari string ke apa pun yang membuat masalah di sisi server. Untuk mengatasi masalah ini saya harus memberikan nilai default yang menjadikannya nilai string.let params = [kService: kGetSingleEntry, kUserPath: companyModal.directory_path ?? "", kCompanyDomain: UserDefaults.companyDomain, kUserToken: UserDefaults.authToken, kEntryId: id, ] as [String: Any]
sumber
Mungkin Anda memiliki "/" di ujung jalan Anda. Jika ini bukan permintaan GET, Anda tidak boleh meletakkan "/" di akhir, jika tidak Anda akan mendapatkan kesalahan
sumber
Saya mengubah mimeType dari "mov" menjadi "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)
Bekerja untuk saya .. :)
sumber
Untuk kasus saya:
let header = ["Authorization": "Bearer \(Authserices.instance.tokenid)"]
Saya lupa spasi sebelum
\
(setelahBearer
)sumber
Dalam kasus saya, kesalahan terjadi karena email duplikat. Anda dapat memeriksa ulang API Anda di tukang pos untuk melihat apakah responsnya OK atau tidak.
sumber
Dalam kasus saya, saya mencoba menggunakan Postman untuk mendapatkan API dan kesalahan ini berasal dari backend.
sumber