web-dev-qa-db-fra.com

Alamofire valeur invalide autour du personnage

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

}

Ceci est ma demande avec Alamofire, pour une certaine demande cela fonctionne parfois, mais parfois je reçois:

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

J'ai lu que cela peut être dû à un JSON invalide, mais la réponse est une chaîne JSON statique que j'ai validée dans le validateur JSON comme valide. Il contient des caractères å ä ö et du code HTML.

Pourquoi est-ce que je reçois parfois cette erreur? 

72
Lord Vermillion

J'ai aussi fait face au même problème. J'ai essayé responseString au lieu de responseJSON et cela a fonctionné. Je suppose que c'est un bogue dans Alamofire avec son utilisation avec Django.

109
Smit

J'ai eu la même erreur en téléchargeant l'image sous forme de plusieurs parties dans Alamofire car je l'utilisais

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

j'ai fixé en remplaçant par

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

J'espère que cela aidera quelqu'un.

9
Avijit Nagare

Puisse ceci vous aider

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

Le même problème m’est arrivé et il s’est avéré être un problème de serveur puisque le type de contenu n’était pas défini.

Ajouter

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

À la chaîne de demande l'a résolu pour moi

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
cameronmoreau

J'ai eu la même erreur. Mais j'ai trouvé la solution pour cela.

NOTE 1: "Ce n'est pas une erreur Alarmofire", c'est une erreur de serveur.

REMARQUE 2: vous n'avez pas besoin de remplacer "responseJSON" par "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!)
            }
        }
    }
3
Ram Madhavan

Voici comment j'ai réussi à résoudre le message d'erreur 3840 non valide.

Le journal des erreurs 

 responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
  1. C'était avec Encoding Type utilisé dans la demande, le type d'encodage utilisé doit être accepté dans votre Server-Side

Afin de connaître l'encodage, j'ai dû parcourir tous les types d'encodage: 

défaut/ methodDependent / chaîne de requête/ 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. Cela dépend aussi de la réponse que nous recevons, utilisez le .__ approprié.
    • responseString
    • réponseJSON
    • responseData

Si la réponse n'est pas une chaîne JSON & une chaîne, utilisez responseString

Exemple: dans le cas d'une API de connexion/création de jeton:

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString

2
Ratz

Dans mon cas, l'URL de mon serveur était incorrecte. Vérifiez l'URL de votre serveur!

1
Saeed

Hé les gars, c’est ce que j’ai trouvé être mon problème: j’appelais Alamofire via une fonction permettant d’authentifier les utilisateurs: j’utilisais la fonction "Login User" avec les paramètres appelés "body" (email: String, mot de passe: String) qui serait passé 

mon errr était exactement: 

optionnel (alamofire.aferror.responseserializationfailed (alamofire.aferror.responseserializationfailurereason.jsonserializationfailed (error domain = nscocoaerrordomain code = 3840 "valeur non valide autour du caractère 0." userinfo = {nsdebugdescription, valeur non valide autour du caractère 0

le caractère 0 est la clé ici: cela signifie que l'appel pour le "courriel" ne correspond pas aux paramètres: voir le code ci-dessous 

func loginUser (email: String, mot de passe: String, complété: @escaping downloadComplete) { laissez 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" dans les paramètres de fonction doit correspondre à let "email" lors de l'analyse, cela fonctionnera donc. Je n'ai plus l'erreur ... Et le caractère 0 était "email" dans le paramètre "body" de la requête Alamofire: 

J'espère que cela t'aides 

1
berkat0789

C'est peut-être trop tard mais j'ai résolu ce problème d'une autre manière que celle mentionnée ici:

Lorsque vous utilisez .responseJSON(), vous devez définir l'en-tête de la réponse avec content-type = application/json. Sinon, le blocage se produira même si votre corps est un fichier JSON valide. Alors, peut-être que votre en-tête de réponse est vide ou utilise un autre type de contenu.

Assurez-vous que l'en-tête de votre réponse est défini avec content-type = application/json à .responseJSON() dans Alamofire fonctionne correctement.

1
guijob

L'erreur a été résolue après l'ajout de l'encodage: JSONEncoding.default avec 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)
        }
   }
0
krishnan

L'application sur laquelle je travaillais ce matin avait la même erreur. Je pensais qu'il s'agissait d'une erreur côté serveur car je ne pouvais pas télécharger une image d'utilisateur.

Cependant, en vérifiant mon API personnalisée, je me suis rendu compte qu'après avoir ajouté un certificat SSL à mon site Web, je n'avais pas mis à jour les URL de api.Swift, les données ne pouvaient pas publier:

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

J'ai changé l'URL en https: //. Problème résolu.

0
RH Blanchfield

Dans mon cas, il y avait un extra/dans l'URL.

0
Alok

J'ai changé mimeType de "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)

Travaillé pour moi .. :)

0
K Ravi Kumar

Dans mon cas, je dois ajouter cette clé: "Accepter": "application/json" à ma demande d'en-tête.

Quelque chose comme ça:

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

J'espère que cela peut aider quelqu'un.

0
Dasoga

Vous avez probablement "/" au bout de votre chemin. Si ce n'est pas une requête GET, vous ne devez pas mettre "/" à la fin, sinon vous obtiendrez l'erreur

0
Mark Darry

J'ai résolu en utilisant ceci comme en-tête:

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

0
Bruno Muniz

Je suis confronté au même problème et le problème est dans 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 est l'URL. il a été forcé d'une chaîne à une autre qui crée des problèmes côté serveur. Pour résoudre ce problème, je dois donner une valeur par défaut qui en fait une valeur de chaîne.

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

J'envoyais le type incorrect (String) au serveur dans mes paramètres (devait être un Int).

0
agrippa