Недопустимое значение 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 validator как допустимую. Он содержит символы å ä ö и некоторые HTML.



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

523   14  

14 ответов:

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

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

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

я исправил путем замены на

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

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

пусть это поможет вам

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

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

добавлять

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

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

Примечание 1:" это не ошибка Alarmofire", это bcouse ошибки сервера.

примечание 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!)
            }
        }
    }

вот как мне удалось разрешить недопустимую ошибку 3840.

ошибки, журнал

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

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

по умолчанию/ methodDependent/ строки запроса/ 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

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

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

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

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

func loginUser(email: String, password: String, completed: @escaping downloadComplete) { пусть lowerCasedEmail = электронная почта.строчные буквы ()

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

надеюсь, что это помогает

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

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

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

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

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

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

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

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

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

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

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

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

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

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

я сталкиваюсь с той же проблемой и проблема находится в 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 - это URL-адрес. он принудительно из строки в любую, которая создает проблемы на стороне сервера. Чтобы решить эту проблему, я должен дать значение по умолчанию, которое делает его строковым значением.

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

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

Comments

    Ничего не найдено.