ios - objective - swiftyjson alamofire
Valor no válido de Alamofire alrededor del carácter 0 (18)
Alamofire.request(.GET, "url").authenticate(user: "", password: "").responseJSON() {
(request, response, json, error) in
println(error)
println(json)
}
Esta es mi solicitud con Alamofire, para cierta solicitud a veces funciona, pero a veces obtengo:
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.})
He leído que esto puede deberse a un JSON no válido, pero la respuesta es una cadena json estática que he validado en el validador JSON como válido. Contiene caracteres å ä ö y algo de HTML.
¿Por qué a veces recibo este error?
Así es como logré resolver el error inválido 3840.
El registro de errores
responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
- Fue con el tipo de codificación utilizado en la solicitud. El tipo de codificación utilizado debe aceptarse en el lado del servidor .
Para conocer la codificación, tuve que ejecutar todos los tipos de codificación:
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)
}
-
También depende de la
respuesta
que estemos utilizando.
- respuestaString
- respuesta JSON
- responseData
Si la respuesta no es un JSON y solo una cadena en respuesta, use responseString
Ejemplo : en caso de API de inicio de sesión / creación de token:
"20dsoqs0287349y4ka85u6f24gmr6pah"
respuestaString
Cambié mimeType de "mov" a "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)
Trabajó para mi.. :)
El error se resolvió después de agregar la codificación: JSONEncoding.default con 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)
}
}
El mismo problema me sucedió y en realidad terminó siendo un problema del servidor ya que el tipo de contenido no estaba configurado.
Agregando
.validate(contentType: ["application/json"])
A la cadena de solicitud lo resolvió para mí
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)
}
}
En mi caso, debo agregar esta Clave: "Aceptar": "aplicación / json" a mi solicitud de encabezado.
Algo como esto:
let Auth_header: [String:String] = ["Accept":"application/json", "Content-Type" : "application/json", "Authorization":"Bearer MyToken"]
Espero que esto pueda ayudar a alguien.
En mi caso, había un extra / en la URL.
En mi caso, la URL de mi servidor era incorrecta. Comprueba la URL de tu servidor !!
Estaba enviando el tipo incorrecto (String) al servidor en mis parámetros (necesitaba ser un Int).
Hola chicos, este es el problema que encontré: estaba llamando a Alamofire a través de una función para autenticar usuarios: utilicé la función "Usuario de inicio de sesión" con los parámetros que se llamarían desde el "cuerpo" (correo electrónico: Cadena, contraseña: String) Eso se pasaría
mi error fue exactamente:
opcional (alamofire.aferror.responseserializationfailed (alamofire.aferror.responseserializationfailurereason.jsonserializationfailed (error dominio = nscocoaerrordomain code = 3840 "valor no válido alrededor del carácter 0." userinfo = {nsdebugdescription = valor no válido alrededor del carácter 0)
el carácter 0 es la clave aquí: significa que la llamada para el "correo electrónico" no coincidía con los parámetros: vea el código a continuación
func loginUser (correo electrónico: String, contraseña: String, completado: @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" en los parámetros de la función debe coincidir con let "email" cuando se analiza, entonces funcionará ... Ya no recibí el error ... Y el carácter 0 era el "email" en el parámetro "body" para la solicitud de Alamofire:
Espero que esto ayude
La aplicación en la que estaba trabajando esta mañana tenía el mismo error. Creí que era un error del lado del servidor ya que no pude cargar una imagen de usuario.
Sin embargo, al verificar mi API personalizada, me di cuenta de que después de agregar un certificado SSL a mi sitio web que no había actualizado las URL de api.swift, los datos no pudieron publicar:
let HOME_URL = "http://sitename.io"
let BASE_URL = "http://sitename.io/api"
let UPLOAD_URL = "http://sitename.io/api/user/upload"
Cambié las URL a https: //. Problema resuelto.
Me enfrento al mismo problema y el problema está en los 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
es url.
coaccionado de cadena a cualquiera que cree problemas en el lado del servidor.
Para resolver este problema, tengo que dar el valor predeterminado que lo convierte en valor de cadena.
let params = [kService: kGetSingleEntry,
kUserPath: companyModal.directory_path ?? "",
kCompanyDomain: UserDefaults.companyDomain,
kUserToken: UserDefaults.authToken,
kEntryId: id,
] as [String: Any]
Obtuve el mismo error al cargar la imagen en forma de varias partes en Alamofire cuando estaba usando
multipartFormData.appendBodyPart(data: image1Data, name: "file")
Lo arreglé reemplazando por
multipartFormData.appendBodyPart(data: image1Data, name: "file", fileName: "myImage.png", mimeType: "image/png")
Espero que esto ayude a alguien.
Probablemente tenga "/" al final de su camino. Si no es una solicitud GET, no debe poner "/" al final, de lo contrario obtendrá el error
Que esto te ayude
Alamofire.request(.GET, "YOUR_URL")
.validate()
.responseString { response in
print("Success: /(response.result.isSuccess)")
print("Response String: /(response.result.value)")
}
Resolví usar esto como encabezado:
let header = ["Content-Type": "application/json", "accept": "application/json"]
Tal vez sea demasiado tarde, pero resolví este problema de otra manera que no se menciona aquí:
Cuando usa
.responseJSON()
, debe establecer el encabezado de respuesta con
content-type = application/json
, de lo contrario, se bloqueará incluso si su cuerpo es un JSON válido.
Entonces, tal vez su encabezado de respuesta esté vacío o use otro tipo de contenido.
Asegúrese de que su encabezado de respuesta esté configurado con
content-type = application/json
para que
.responseJSON()
en Alamofire funcione correctamente.
También enfrenté el mismo problema.
Intenté
responseString
lugar de
responseJSON
y funcionó.
Supongo que esto es un error en
Alamofire
al usarlo con
django
.
Tengo el mismo error. Pero encontré la solución para ello.
NOTA 1: "No es un error de Alarmofire", se debe a un error del servidor.
NOTA 2: No necesita cambiar "responseJSON" a "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!)
}
}
}