Alamofire 0 karakteri etrafında geçersiz değer


95
Alamofire.request(.GET, "url").authenticate(user: "", password: "").responseJSON() {
    (request, response, json, error) in
    println(error)
    println(json)

}

Alamofire'dan isteğim bu, bazen belirli bir istek için işe yarıyor, ancak bazen şunu alıyorum:

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

Bunun geçersiz JSON'dan kaynaklanabileceğini okudum, ancak yanıt JSON doğrulayıcısında geçerli olarak doğruladığım statik bir json dizesi. Å ä ö karakterleri ve bazı HTML içerir.

Neden bazen bu hatayı alıyorum?


13
Bu hatayı aldığımda yapmaktan hoşlandığım bir şey responseJSON() { ... }bloğu yorumlamak ve ile değiştirmektir .responseString { _, _, s, _ in println(s) }. Bu,responseJSON
ad121

Yanıt durum kodu nedir?
Sahil Kapoor

1
200 durum kodu alıyorum ve bu hatayı alıyorum. AHHH. Benim durumumda beyin ölümü :). Aslında JSON'u sunucudan döndürmüyordum. Bu onu çözer.
Chris Prince

.POST Yöntemi kullanırsanız bu işe yarayabilir.
Surjeet Rajput

Yanıtlar:


143

Ben de aynı sorunla karşılaştım. Bunun responseStringyerine denedim responseJSONve işe yaradı. Sanırım bu, Alamofireonunla birlikte kullanımda bir hata django.


3
Bunu belirttiğiniz için teşekkürler. ResponseJSON kullanıyordum ancak sunucudan gelen gerçek yanıt XML formatındaydı! Beni baş ağrısından
kurtardı

Bu sorunla karşılaştıktan saatler sonra projemi kaydettim. yanıtı sunucum içinde JSON formatında ayarlamalıyım. Bunu yapmıyordum ama bir kez yaptığımda alamofire'dan JSON yanıtını kullanabilirim
guijob

GET kullanıyorsanız, o zaman responseString ile kontrol etmeniz gerekir, aksi takdirde POST için responseJSON kullanarak kontrol edin. Referans: grokswift.com/updating-alamofire-to-swift-3-0
Anurag Sharma

İOS uygulamamdaki bu sorun nedeniyle müşteri kaybettim.
Jaseem Abbas

1
Yanıtınız html ile karıştırılmış, html'yi ayrıştırmanız ve json dizesini çıkarmanız ve sözlüğe dönüştürmeniz gerekir. SwiftSoup'u denemenizi veya HTML ayrıştırmak için daha iyi alternatifler için stackoverflow.com/questions/31080818/… adresine bakmanızı öneririm .
Smit

9

Alamofire'da çok parçalı biçimde resim yüklerken kullandığımla aynı hatayı aldım

multipartFormData.appendBodyPart(data: image1Data, name: "file")

ile değiştirerek düzelttim

multipartFormData.appendBodyPart(data: image1Data, name: "file", fileName: "myImage.png", mimeType: "image/png")

Umarım bu birine yardımcı olur.


Bunu anlamaya çalışırken saatlerim vardı. Bu çözümün neden işe yaradığını merak ediyorum ... Teşekkürler!
MXV

8

Bu Size Yardımcı Olabilir

Alamofire.request(.GET, "YOUR_URL")
     .validate()
     .responseString { response in
         print("Success: \(response.result.isSuccess)")
         print("Response String: \(response.result.value)")
     }

Evet Bro. Cevabınızdan ilham aldım. sadece daha yeni bir kod
yüklerim

7

Benim durumumda, sunucu URL’m yanlıştı. Sunucu URL'nizi kontrol edin !!


Benim için sorun buydu. Kaçırdığıma inanamıyorum. Önce URL'yi kontrol etmeyi alışkanlık haline getirmeliyim ve her zaman!
LondonGuy

6

Aynı sorun benim de başıma geldi ve içerik türü ayarlanmadığından aslında bir sunucu sorunu haline geldi.

Ekleme

.validate(contentType: ["application/json"])

İstek zinciri benim için çözdü

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

Aynı hatayı aldım. Ama bunun için bir çözüm buldum.

NOT 1: "Alarmofire hatası değildir", sunucu hatasından kaynaklanmaktadır.

NOT 2: "responseJSON" u "responseString" olarak değiştirmenize gerek yoktur.

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!)
            }
        }
    }

4

Geçersiz 3840 Err'yi bu şekilde çözmeyi başardım.

Hata günlüğü

 responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
  1. Talepte kullanılan Kodlama Tipi ile yapılmıştır , Kullanılan Kodlama Tipi Sunucu Tarafınızda kabul edilmelidir .

Kodlamayı bilmek için tüm Kodlama Türlerini incelemek zorunda kaldım:

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. Ayrıca, aldığımız yanıta göre uygun olanı kullanın
    • responseString
    • yanıt
    • yanıt verisi

Yanıtı yanıt kullanımı içinde bir JSON & sadece dize değilse responseString

Örnek : oturum açma / jeton oluşturma API'si durumunda:

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString


2

Bunu başlık olarak kullanarak çözdüm:

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


2

Benim durumumda, URL'de fazladan / vardı.


1

Belki çok geç ama bu sorunu burada belirtilmeyen başka bir şekilde çözdüm:

Kullandığınızda .responseJSON(), yanıt başlığını ile ayarlamalısınız, content-type = application/jsondeğilse, vücudunuz geçerli bir JSON olsa bile çökecektir. Yani, yanıt başlığınız boş olabilir veya başka bir içerik türü kullanıyor olabilir.

Emin olun yanıt başlığını ile ayarlanır content-type = application/jsoniçin .responseJSON()düzgün Alamofire çalışmalarında.


1

Hey millet, sorunum şu: Alamofire'ı Kullanıcıların Kimlik Doğrulamasını yapmak için bir işlev aracılığıyla çağırıyordum: "Gövde" den çağrılacak parametrelerle "Kullanıcı Girişi" işlevini kullandım (e-posta: Dize, şifre: String) Bu geçilecek

benim hatam tam olarak:

isteğe bağlı (alamofire.aferror.responseserializationfailed (alamofire.aferror.responseserializationfailurereason.jsonserializationfailed (hata etki alanı = nscocoaerrordomain code = 3840 "karakter 0 civarında geçersiz değer" userinfo = {nsdebugdescription = karakter 0 etrafında geçersiz değer

0 karakteri burada anahtardır: "e-posta" çağrısının parametrelerle eşleşmediği anlamına gelir: Aşağıdaki koda bakın

func loginUser (e-posta: Dize, şifre: Dize, tamamlandı: @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)
                }

İşlev parametrelerindeki "e-posta", ayrıştırma sırasında let "e-postası" ile eşleşmelidir, o zaman işe yarayacaktır ... Artık hatayı almadım ... Ve Alamofire isteğinin "gövde" parametresindeki "e-posta" karakteri 0 idi:

Bu yardımcı olur umarım


1

Parametrelerimde uygun olmayan türü (String) sunucuya gönderiyordum (bir Int olması gerekiyordu).


1

Kodlama eklendikten sonra hata çözüldü: Alamofire ile 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)
        }
   }

0

Bu sabah üzerinde çalıştığım uygulamada da aynı hata vardı. Bir kullanıcı resmi yükleyemediğim için bunun sunucu tarafı hatası olduğuna inandım.

Ancak, özel API'mi kontrol ettikten sonra, web siteme api.swift URL'lerini güncellemediğimi bir SSL sertifikası ekledikten sonra verilerin şu bilgileri gönderemediğini fark ettim:

let HOME_URL = "http://sitename.io"
let BASE_URL = "http://sitename.io/api"
let UPLOAD_URL = "http://sitename.io/api/user/upload"

URL'leri https: // olarak değiştirdim. Sorun çözüldü.


0

Benim durumumda başlık isteğime şu Anahtarı eklemeliyim: "Kabul Et": "application / json".

Bunun gibi bir şey:

let Auth_header: [String:String] = ["Accept":"application/json", "Content-Type" : "application/json", "Authorization":"Bearer MyToken"]

Umarım bu birisine yardımcı olabilir.


0

Aynı sorunla karşı karşıyayım ve sorun paramlarda.

let params = [kService: service,
                  kUserPath: companyModal.directory_path,
                  kCompanyDomain: UserDefaults.companyDomain,
                  kImageObject: imageString,
                  kEntryArray: jsonString,
                  kUserToken:  UserDefaults.authToken] as [String : Any]

companyModal.directory_pathurl'dir. dizeden sunucu tarafında sorun yaratan herhangi birine zorladı. Bu sorunu çözmek için, onu dize değeri yapan varsayılan değeri vermem gerekiyor.

 let params = [kService: kGetSingleEntry,
                  kUserPath: companyModal.directory_path ?? "",
                  kCompanyDomain: UserDefaults.companyDomain,
                  kUserToken: UserDefaults.authToken,
                  kEntryId: id,
                  ] as [String: Any]

0

Muhtemelen yolunuzun sonunda "/" var. GET isteği değilse, sonuna "/" koymamalısınız, aksi takdirde hatayı alırsınız


0

"Mov" olan mimeType'ı "multipart / form-data" olarak değiştirdim.

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)

Benim için çalıştı .. :)


0

Benim durumum için:

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

Önceden \(sonra Bearer) boşluğu unuttum


0

Benim durumumda hata, yinelenen e-postadan kaynaklanıyordu. Yanıtın tamam olup olmadığını görmek için postacıda API'nizi yeniden kontrol edebilirsiniz.


0

Benim durumumda, API almak için Postman'ı kullanmayı denedim ve bu hata arka uçtan geliyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.