Nilai tidak valid Alamofire di sekitar karakter 0

94
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?

Lord Vermillion
sumber
13
Satu hal yang ingin saya lakukan ketika saya mendapatkan kesalahan ini adalah mengomentari 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
ad121
Apa kode status tanggapan?
Sahil Kapoor
1
Saya mendapatkan kode status 200 dan saya mendapatkan kesalahan ini. AHHH. Kematian otak dalam kasus saya :). Saya sebenarnya tidak mengembalikan JSON dari server. Itu menyelesaikannya.
Chris Prince
mungkin ini akan berhasil jika Anda menggunakan Metode .POST.
Surjeet Rajput
Periksa Url Anda :)
Alok

Jawaban:

142

Saya juga menghadapi masalah yang sama. Saya mencoba responseStringalih-alih responseJSONdan itu berhasil. Saya kira ini adalah bug Alamofiredengan menggunakannya dengan django.

Smit
sumber
3
Terima kasih telah menunjukkannya. Saya menggunakan responseJSON tetapi respons sebenarnya dari server dalam format XML! Menyelamatkan saya dari sakit kepala :)
C0D3
menyimpan proyek saya setelah berjam-jam menghadapi masalah ini.Saya harus mengatur tanggapan dalam format JSON dalam server saya. Saya tidak melakukan ini, tetapi begitu saya melakukannya, saya dapat menggunakan responseJSON dari alamofire
guijob
Jika Anda menggunakan GET maka Anda perlu memeriksa dengan responseString saja, sebaliknya untuk POST periksa menggunakan responseJSON. Referensi: grokswift.com/updating-alamofire-to-swift-3-0
Anurag Sharma
Saya kehilangan pelanggan karena masalah ini di aplikasi iOS saya.
Jaseem Abbas
1
Respons Anda kacau dengan html, Anda perlu mengurai html dan mengeluarkan string json dan mengubahnya menjadi kamus. Saya merekomendasikan untuk mencoba SwiftSoup atau alternatif yang lebih baik untuk melihat parseHtml di stackoverflow.com/questions/31080818/… .
Smit
9

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.

Avijit Nagare
sumber
Aku punya waktu berjam-jam untuk memikirkannya. Saya bertanya-tanya mengapa solusi ini berhasil ... Terima kasih!
MXV
7

Semoga ini Membantu Anda

Alamofire.request(.GET, "YOUR_URL")
     .validate()
     .responseString { response in
         print("Success: \(response.result.isSuccess)")
         print("Response String: \(response.result.value)")
     }
Krutarth Patel
sumber
Ya Bro.i terinspirasi dari jawaban Anda. saya baru saja mengunggah kode untuk yang lebih baru
Krutarth Patel
7

Dalam kasus saya, URL server saya salah. Periksa URL server Anda !!

Saeed
sumber
Ini adalah masalah saya. Aku tidak percaya aku melewatkannya. Saya harus membiasakan diri mengecek URL dulu, dan selalu!
LondonGuy
6

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)
            }
        }
cameronmoreau
sumber
4

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!)
            }
        }
    }
Ram Madhavan
sumber
4

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.}))
  1. Itu dengan Jenis Pengkodean yang digunakan dalam Permintaan, Jenis Pengkodean yang digunakan harus diterima di Sisi Server Anda .

Untuk mengetahui Pengkodean, saya harus menjalankan semua Jenis Pengkodean:

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)
     }
  1. Itu juga tergantung pada respons yang kita terima menggunakan yang sesuai
    • responseString
    • responseJSON
    • responseData

Jika responsnya bukan JSON & hanya string dalam respons, gunakan responseString

Contoh : dalam kasus login / create token API:

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString

Ratz
sumber
2

Saya menyelesaikan menggunakan ini sebagai tajuk:

let header = ["Content-Type": "application/json", "accept": "application/json"]

Bruno Muniz
sumber
2

Dalam kasus saya, ada tambahan / di URL.

Alok
sumber
1

Mungkin sudah terlambat tetapi saya menyelesaikan masalah ini dengan cara lain yang tidak disebutkan di sini:

Saat menggunakan .responseJSON(), Anda harus menyetel header respons dengan content-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/jsonke .responseJSON()di Alamofire berfungsi dengan baik.

kerja keras
sumber
1

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

berkat0789
sumber
1

Saya mengirim jenis yang tidak tepat (String) ke server dalam parameter saya (harus menjadi Int).

agripa
sumber
1

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)
        }
   }
krishnan
sumber
0

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.

Poligon Mulia
sumber
0

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.

Dasoga
sumber
0

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_pathadalah 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]
Hitesh Agarwal
sumber
0

Mungkin Anda memiliki "/" di ujung jalan Anda. Jika ini bukan permintaan GET, Anda tidak boleh meletakkan "/" di akhir, jika tidak Anda akan mendapatkan kesalahan

Mark Darry
sumber
0

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 .. :)

K Ravi Kumar
sumber
0

Untuk kasus saya:

let header = ["Authorization": "Bearer \(Authserices.instance.tokenid)"]

Saya lupa spasi sebelum \(setelah Bearer)

kuyu
sumber
0

Dalam kasus saya, kesalahan terjadi karena email duplikat. Anda dapat memeriksa ulang API Anda di tukang pos untuk melihat apakah responsnya OK atau tidak.

Arqam Butt
sumber
0

Dalam kasus saya, saya mencoba menggunakan Postman untuk mendapatkan API dan kesalahan ini berasal dari backend.

Diệp Lân
sumber