swiftyjson objective example ios swift alamofire

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

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

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