Недопустимое значение 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.
почему я получаю эту ошибку иногда?
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.}))
- он был с кодирование тип, используемый в запросе, используемый тип кодировки должен быть принят в вашем На Стороне Сервера.
для того, чтобы узнать кодировку мне пришлось запустить через все типы кодировки:
по умолчанию/ 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) }
- это также зависит от ответ мы получаем пользу соотвествующее
- 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"]
я сталкиваюсь с той же проблемой и проблема находится в 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