Valor no válido de Alamofire alrededor del carácter 0

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

}

Esta es mi solicitud con Alamofire, para una determinada 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álida. Contiene caracteres å ä ö y algo de HTML.

¿Por qué aparece este error a veces?

Señor Vermillion
fuente
13
Una cosa que me gusta hacer cuando recibo este error es comentar el responseJSON() { ... }bloque y reemplazarlo con .responseString { _, _, s, _ in println(s) }. Eso le permite ver el json que se devuelve para buscar cualquier texto extraño que lo haga no visible pararesponseJSON
ad121
¿Qué es el código de estado de respuesta?
Sahil Kapoor
1
Recibo un código de estado de 200 y aparece este error. AHHH. Muerte cerebral en mi caso :). En realidad, no estaba devolviendo JSON desde el servidor. Eso lo resuelve.
Chris Prince
puede ser que esto funcione si usa el método .POST.
Surjeet Rajput
Compruebe su URL :)
Alok

Respuestas:

137

También enfrenté el mismo problema. Lo intenté en responseStringlugar de responseJSONy funcionó. Supongo que esto es un error Alamofireal usarlo con django.

Smit
fuente
3
Gracias por señalar eso. Estaba usando responseJSON pero la respuesta real del servidor estaba en formato XML. Me salvó el dolor de cabeza :)
C0D3
guardé mi proyecto después de horas enfrentando este problema. Debería configurar la respuesta en formato JSON dentro de mi servidor. No estaba haciendo esto, pero una vez que lo hice, podría usar responseJSON de alamofire
guijob
Si está utilizando GET, debe verificar con responseString solo, de lo contrario, POST, verifíquelo usando responseJSON. Referencia: grokswift.com/updating-alamofire-to-swift-3-0
Anurag Sharma
Perdí clientes debido a este problema en mi aplicación iOS.
Jaseem Abbas
1
Su respuesta está desordenada con html, debe analizar el html y obtener la cadena json y convertirla en diccionario. Recomiendo probar SwiftSoup o para obtener mejores alternativas a parseHtml, consulte stackoverflow.com/questions/31080818/… .
Smit
9

Recibí el mismo error al cargar la imagen en forma de varias partes en Alamofire que 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.

Avijit Nagare
fuente
Pasé horas tratando de resolver esto. Me pregunto por qué funciona esta solución ... ¡Gracias!
MXV
7

Que esto te ayude

Alamofire.request(.GET, "YOUR_URL")
     .validate()
     .responseString { response in
         print("Success: \(response.result.isSuccess)")
         print("Response String: \(response.result.value)")
     }
Krutarth Patel
fuente
Sí Bro.i inspirado en su respuesta. acabo de cargar el código para cualquier nuevo
Krutarth Patel
6

Me sucedió el mismo problema y, en realidad, terminó siendo un problema del servidor, ya que el tipo de contenido no estaba configurado.

Añadiendo

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

A la cadena de solicitudes me lo resolvió

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

En mi caso, la URL de mi servidor era incorrecta. ¡Verifique la URL de su servidor!

Saeed
fuente
Este fue el problema para mí. No puedo creer que me lo perdiera. ¡Tengo que acostumbrarme a comprobar la URL primero y siempre!
LondonGuy
4

Tengo el mismo error. Pero encontré la solución.

NOTA 1: "No es un error de Alarmofire", es debido a un error del servidor.

NOTA 2: No es necesario cambiar "responseJSON" por "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!)
            }
        }
    }
Ram Madhavan
fuente
4

Así es como logré resolver el error 3840 incorrecto.

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 recibiendo, use el apropiado
    • responseString
    • responseJSON
    • responseData

Si la respuesta no es un JSON y solo una cadena en la respuesta, use responseString

Ejemplo : en caso de iniciar sesión / crear API de token:

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString

Ratz
fuente
2

Resolví usando esto como encabezado:

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

Bruno Muniz
fuente
2

En mi caso, había un extra / en la URL.

Alok
fuente
1

Tal vez sea demasiado tarde, pero resolví este problema de otra manera que no se menciona aquí:

Cuando lo use .responseJSON(), debe configurar el encabezado de respuesta con content-type = application/json, si no, 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 cabecera de respuesta se establece con content-type = application/jsonque .responseJSON()en el trabajo Alamofire correctamente.

guijob
fuente
1

Hola chicos, esto es lo que encontré que era mi problema: estaba llamando a Alamofire a través de una función para autenticar usuarios: utilicé la función "Iniciar sesión de usuario" 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 domain = nscocoaerrordomain code = 3840 "valor inválido alrededor del carácter 0." userinfo = {nsdebugdescription = valor inválido alrededor del carácter 0

el carácter 0 es la clave aquí: lo que significa que la llamada para el "correo electrónico" no coincidía con los parámetros: consulte 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" al analizar, 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

berkat0789
fuente
1

Estaba enviando el tipo incorrecto (String) al servidor en mis parámetros (necesitaba ser un Int).

agripa
fuente
1

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)
        }
   }
Krishnan
fuente
0

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 se 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é la URL a https: //. Problema resuelto.

Polígono noble
fuente
0

En mi caso, tengo que 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.

Dasoga
fuente
0

Me enfrento al mismo problema y el problema está en los parámetros.

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

companyModal.directory_pathes url. coaccionaba de la cadena a cualquiera que creara problemas en el lado del servidor. Para resolver este problema, tengo que dar un valor predeterminado que lo convierte en un valor de cadena.

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

Probablemente tenga "/" al final de su camino. Si no es una solicitud GET, no debe poner "/" al final; de lo contrario, obtendrá el error

Mark Darry
fuente
0

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

K Ravi Kumar
fuente
0

Para mi caso:

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

Olvidé el espacio antes \(después Bearer)

haggag
fuente
0

En mi caso, el error se debió a un correo electrónico duplicado. Puede volver a verificar su API en cartero para ver si la respuesta está bien o no.

Trasero de arqam
fuente