Alamofire ungültiger Wert um Zeichen 0

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

}

Dies ist meine Anfrage bei Alamofire, für eine bestimmte Anfrage funktioniert es manchmal, aber manchmal bekomme ich:

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

Ich habe gelesen, dass dies an ungültigem JSON liegen kann, aber die Antwort ist eine statische JSON-Zeichenfolge, die ich im JSON-Validator als gültig validiert habe. Es enthält å ä ö Zeichen und etwas HTML.

Warum bekomme ich diesen Fehler manchmal?

Lord Vermillion
quelle
12
Eine Sache, die ich gerne mache, wenn ich diesen Fehler erhalte, ist, den responseJSON() { ... }Block zu kommentieren und durch zu ersetzen .responseString { _, _, s, _ in println(s) }. Das können Sie die json sehen, die Look für jeden ungeraden Text zurückgegeben wird , die es unparsible durch machen würderesponseJSON
AD121
Was ist der Antwortstatuscode?
Sahil Kapoor
1
Ich erhalte einen Statuscode von 200 und erhalte diesen Fehler. ÄHHH. Hirntod in meinem Fall :). Ich habe JSON nicht vom Server zurückgegeben. Das löst es.
Chris Prince
Möglicherweise funktioniert dies, wenn Sie die .POST-Methode verwenden.
Surjeet Rajput
Überprüfen Sie Ihre URL :)
Alok

Antworten:

136

Ich stand auch vor dem gleichen Problem. Ich habe es responseStringstattdessen versucht responseJSONund es hat funktioniert. Ich denke, das ist ein Fehler Alamofirebei der Verwendung mit django.

Smit
quelle
3
Vielen Dank für den Hinweis. Ich habe responseJSON verwendet, aber die tatsächliche Antwort vom Server war im XML-Format!
Ersparte
Ich habe mein Projekt nach Stunden mit diesem Problem gespeichert. Ich sollte die Antwort im JSON-Format auf meinem Server festlegen. Ich tat dies nicht, aber sobald ich es tat, konnte ich responseJSON von alamofire
guijob
Wenn Sie GET verwenden, müssen Sie nur mit responseString prüfen, andernfalls überprüfen Sie POST mit responseJSON. Referenz: grokswift.com/updating-alamofire-to-swift-3-0
Anurag Sharma
Ich habe aufgrund dieses Problems in meiner iOS-App Kunden verloren.
Jaseem Abbas
1
Ihre Antwort ist mit HTML durcheinander, Sie müssen das HTML analysieren und den JSON-String herausholen und in ein Wörterbuch konvertieren. Ich empfehle SwiftSoup auszuprobieren oder für bessere Alternativen zu parseHtml unter stackoverflow.com/questions/31080818/… nachzuschauen .
Smit
9

Ich habe beim Hochladen eines Bildes in mehrteiliger Form in Alamofire den gleichen Fehler erhalten wie beim Hochladen

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

Ich habe durch Ersetzen durch behoben

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

Hoffe das hilft jemandem.

Avijit Nagare
quelle
Ich hatte Stunden, um das herauszufinden. Ich frage mich, warum diese Lösung funktioniert ... Danke!
MXV
7

Möge dies Ihnen helfen

Alamofire.request(.GET, "YOUR_URL")
     .validate()
     .responseString { response in
         print("Success: \(response.result.isSuccess)")
         print("Response String: \(response.result.value)")
     }
Krutarth Patel
quelle
Ja, Bro.i hat sich von Ihrer Antwort inspirieren lassen. Ich
lade
6

Das gleiche Problem ist mir passiert und es war tatsächlich ein Serverproblem, da der Inhaltstyp nicht festgelegt wurde.

Hinzufügen

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

Um die Anforderungskette hat es für mich gelöst

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
quelle
6

In meinem Fall war meine Server-URL falsch. Überprüfen Sie Ihre Server-URL!

Saeed
quelle
Das war das Problem für mich. Ich kann nicht glauben, dass ich es verpasst habe. Ich muss es mir zur Gewohnheit machen, zuerst und immer die URL zu überprüfen!
LondonGuy
4

Ich habe den gleichen Fehler bekommen. Aber ich habe die Lösung dafür gefunden.

HINWEIS 1: "Es handelt sich nicht um einen Alarmofire-Fehler", sondern um einen Serverfehler.

HINWEIS 2: Sie müssen "responseJSON" nicht in "responseString" ändern.

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
quelle
4

Auf diese Weise konnte ich den ungültigen 3840-Fehler beheben.

Das Fehlerprotokoll

 responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
  1. Es war mit Encoding - Typ in der Anfrage verwendet wird , welche Verschlüsselung sollte acceptedin Ihren frühen Server-Side .

Um die Codierung zu kennen, musste ich alle Codierungstypen durchlaufen:

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. Dies hängt auch von der Antwort ab, die wir erhalten
    • responseString
    • responseJSON
    • responseData

Wenn die Antwort kein JSON ist und nur eine Zeichenfolge in der Antwort, verwenden Sie responseString

Beispiel : Bei Anmeldung / Token-API erstellen:

20dsoqs0287349y4ka85u6f24gmr6pah

responseString

Ratz
quelle
2

Ich habe dies als Header gelöst:

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

Bruno Muniz
quelle
2

In meinem Fall gab es ein zusätzliches / in der URL.

Alok
quelle
1

Vielleicht ist es zu spät, aber ich habe dieses Problem auf eine andere Weise gelöst, die hier nicht erwähnt wird:

Wenn Sie verwenden .responseJSON(), müssen Sie den Antwortheader so festlegen content-type = application/json, dass er abstürzt, selbst wenn Ihr Body ein gültiger JSON ist. Vielleicht ist Ihr Antwortheader leer oder verwendet einen anderen Inhaltstyp.

Stellen Sie sicher , dass Ihre Antwort - Header wird mit content-type = application/jsonan .responseJSON()richtig in Alamofire Arbeit.

Guijob
quelle
1

Hey Leute, das ist mein Problem: Ich habe Alamofire über eine Funktion zum Authentifizieren von Benutzern aufgerufen: Ich habe die Funktion "Login User" mit den Parametern verwendet, die vom "body" aufgerufen werden (E-Mail: String, Passwort: String) Das würde übergeben werden

Mein Fehler war genau:

optional (alamofire.aferror.responseserializationfailed (alamofire.aferror.responseserializationfailurereason.jsonserializationfailed) (Fehlerdomäne = nscocoaerrordomain code = 3840 "ungültiger Wert um Zeichen 0." userinfo = {nsdebugdescription = ungültiger Wert um Zeichen 0

Zeichen 0 ist hier der Schlüssel: Dies bedeutet, dass der Aufruf für die "E-Mail" nicht mit den Parametern übereinstimmte: Siehe den folgenden Code

func loginUser (E-Mail: String, Passwort: String, abgeschlossen: @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" in den Funktionsparametern muss mit dem let "email" beim Parsen übereinstimmen, dann funktioniert es. Ich habe den Fehler nicht mehr erhalten ... Und Zeichen 0 war die "email" im "body" -Parameter für die Alamofire-Anfrage:

Hoffe das hilft

berkat0789
quelle
1

Ich habe den falschen Typ (String) in meinen Parametern an den Server gesendet (musste ein Int sein).

agrippa
quelle
1

Fehler nach dem Hinzufügen der Codierung behoben: JSONEncoding.default mit 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
quelle
0

Die Anwendung, an der ich heute Morgen gearbeitet habe, hatte den gleichen Fehler. Ich habe geglaubt, dass es sich um einen serverseitigen Fehler handelt, da ich kein Benutzerbild hochladen konnte.

Beim Überprüfen meiner benutzerdefinierten API stellte ich jedoch fest, dass nach dem Hinzufügen eines SSL-Zertifikats zu meiner Website, dass ich die api.swift-URLs nicht aktualisiert hatte, die Daten nicht veröffentlicht werden konnten:

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

Ich habe die URLs in https: // geändert. Problem gelöst.

Edles Polygon
quelle
0

In meinem Fall muss ich diesen Schlüssel hinzufügen: "Accept": "application / json" zu meiner Header-Anfrage.

Etwas wie das:

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

Ich hoffe, dass dies jemandem helfen kann.

Dasoga
quelle
0

Ich stehe vor dem gleichen Problem und das Problem liegt in den Parametern.

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

companyModal.directory_pathist url. Es wurde von einem String zu einem anderen gezwungen, der Probleme auf der Serverseite verursacht. Um dieses Problem zu beheben, muss ich einen Standardwert angeben, der ihn zu einem Zeichenfolgenwert macht.

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

Wahrscheinlich haben Sie "/" am Ende Ihres Weges. Wenn es sich nicht um eine GET-Anforderung handelt, sollten Sie am Ende nicht "/" setzen, da sonst der Fehler angezeigt wird

Mark Darry
quelle
0

Ich habe mimeType von "mov" in "multipart / form-data" geändert.

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)

Arbeitete für mich .. :)

K Ravi Kumar
quelle
0

Für meinen Fall:

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

Ich habe den Raum vorher \(nachher Bearer) vergessen

haggag
quelle
0

In meinem Fall war der Fehler auf eine doppelte E-Mail zurückzuführen. Sie können Ihre API beim Postboten erneut überprüfen, um festzustellen, ob die Antwort dort in Ordnung ist oder nicht.

Arqam Butt
quelle