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?
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
.
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.
Puisse ceci vous aider
Alamofire.request(.GET, "YOUR_URL")
.validate()
.responseString { response in
print("Success: \(response.result.isSuccess)")
print("Response String: \(response.result.value)")
}
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)
}
}
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!)
}
}
}
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.}))
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)
}
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
Dans mon cas, l'URL de mon serveur était incorrecte. Vérifiez l'URL de votre serveur!
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
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.
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)
}
}
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.
Dans mon cas, il y avait un extra/dans l'URL.
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 .. :)
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.
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
J'ai résolu en utilisant ceci comme en-tête:
let header = ["Content-Type": "application/json",
"accept": "application/json"]
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]
J'envoyais le type incorrect (String) au serveur dans mes paramètres (devait être un Int).