Подтвердить что ты не робот

Недопустимое значение Alamofire вокруг символа 0

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

}

Это мой запрос с Alamofire, для определенного запроса он когда-нибудь работает, но иногда я получаю:

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

Я читал, что это может быть связано с недействительным JSON, но ответ представляет собой статическую строку json, которая была проверена в валидаторе JSON как действительная. Он содержит символы å ä ö и некоторый HTML.

Почему я иногда получаю эту ошибку?

4b9b3361

Ответ 1

Я также столкнулся с такой же проблемой. Я попробовал responseString вместо responseJSON и он сработал. Я предполагаю, что это ошибка в Alamofire используя ее с django.

Ответ 2

У меня такая же ошибка при загрузке изображения в многочастной форме в Alamofire, когда я использовал

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

i фиксируется заменой на

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

Надеюсь, что это поможет кому-то.

Ответ 3

То же самое произошло со мной, и на самом деле это стало проблемой сервера, поскольку тип содержимого не был установлен.

Добавление

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

В цепочку запросов было решено это для меня

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

Пусть это поможет YOu

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

Ответ 5

Я получил ту же ошибку. Но я нашел решение для него.

ПРИМЕЧАНИЕ 1: "Это не ошибка Alarmofire", это ошибка серверной ошибки.

ПРИМЕЧАНИЕ 2. Вам не нужно изменять "responseJSON" на "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!)
            }
        }
    }

Ответ 6

Вот как мне удалось разрешить Invalid 3840 Err.

Журнал ошибок

 responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
  1. Именно с типом кодирования, используемым в запросе, используемый тип кодирования должен быть принят на стороне вашего сервера.

Чтобы знать кодировку, мне пришлось пропустить все типы кодирования:

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. Это также зависит от ответа, который мы получаем, используя соответствующие
    • responseString
    • responseJSON
    • responseData

Если ответ не является JSON и просто строкой в ответ, используйте responseString

Пример: в случае API входа/создания токена:

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString

Ответ 7

Я решил использовать это как заголовок:

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

Ответ 8

Возможно, уже слишком поздно, но я решил эту проблему другим способом, не упомянутым здесь:

Когда вы используете .responseJSON(), вы должны установить заголовок ответа content-type = application/json, если нет, он потерпит крах, даже если ваше тело является действительным JSON. Итак, возможно, ваш заголовок ответа пуст или используется другой тип содержимого.

Убедитесь, что заголовок ответа установлен с content-type = application/json до .responseJSON() в Alamofire правильно.

Ответ 9

Привет, ребята, это то, что я нашел своей проблемой: я звонил в Alamofire через функцию Authenticate Users: я использовал функцию "Login User" с параметрами, которые будут вызываться из "body" (электронная почта: String, password: String) Это будет передано

мой errr был точно:

optional (alamofire.aferror.responseserializationfailed(alamofire.aferror.responseserializationfailurereason.jsonserializationfailed(error domain = nscocoaerrordomain code = 3840 "недопустимое значение вокруг символа 0." userinfo = {nsdebugdescription = недопустимое значение вокруг символа 0

символ 0 - это ключ: означает, что вызов для "электронной почты" не соответствует параметрам: см. код ниже

func loginUser (email: String, password: String, завершено: @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" в параметрах функции должен соответствовать дате "электронной почты" при разборе, тогда он будет работать. Я больше не получил ошибку... И символ 0 был "адресом электронной почты" в параметре "тело" для Alamofire запрос:

Надеюсь, что это поможет

Ответ 10

Ошибка была решена после добавления кодировки: JSONEncoding.default с помощью 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)
        }
   }

Ответ 11

В моем случае URL моего сервера был неверным. Проверьте URL вашего сервера!

Ответ 12

Приложение, над которым я работал сегодня утром, имело ту же ошибку. Я считал, что это ошибка на стороне сервера, так как я не смог загрузить изображение пользователя.

Однако после проверки моего пользовательского API я понял, что после добавления SSL-сертификата на мой сайт, что я не обновил URL-адреса api.swift, данные не смогли опубликовать:

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

Я изменил URL-адрес на https://. Проблема решена.

Ответ 13

В моем случае я должен добавить этот ключ: "Принять": "application/json" в мой запрос заголовка.

Что-то вроде этого:

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

Я надеюсь, что это может кому-то помочь.

Ответ 14

Я отправлял неподходящий тип (String) на сервер по моим параметрам (должен был быть Int).

Ответ 15

Я сталкиваюсь с той же проблемой, и проблема в параметрах.

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

companyModal.directory_path - это URL. он принуждался от строки к любому, что создавало проблемы на стороне сервера. Чтобы решить эту проблему, я должен указать значение по умолчанию, которое делает его строковым.

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

Ответ 16

Вероятно, у вас есть "/" в конце вашего пути. Если это не GET-запрос, вы не должны ставить "/" в конце, иначе вы получите ошибку

Ответ 17

В моем случае была добавлена дополнительная/в URL.

Ответ 18

Я изменил mimeType с "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)

Работал на меня.. :)