Недійсне значення Alamofire навколо символу 0


94
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.

Чому я іноді отримую цю помилку?


12
Одне, що я люблю робити, коли отримую цю помилку, - коментувати responseJSON() { ... }блок і замінювати на .responseString { _, _, s, _ in println(s) }. Це дозволяє побачити json, який повертається, щоб шукати будь-який непарний текст, який би зробив його нерозбірливим доresponseJSON
ad121

Що таке код стану відповіді?
Сахіл Капур,

1
Я отримую код стану 200, і я отримую цю помилку. AHHH. Смерть мозку в моєму випадку :). Я фактично не повертав JSON із сервера. Це вирішує це.
Кріс Принс

можливо, це спрацює, якщо ви використовуєте метод .POST.
Surjeet Rajput

Перевір свою URL-адресу :)
Алок,

Відповіді:


137

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


3
Дякуємо, що вказали на це. Я використовував responseJSON, але фактична відповідь сервера була у форматі XML! Врятував головний біль :)
C0D3,

зберегла мій проект через години, що зіткнулися з цією проблемою. Я повинен встановити відповідь у форматі JSON на моєму сервері. Я не робив цього, але як тільки це зробив, я міг використати відповідь JSON з alamofire
guijob

Якщо ви використовуєте GET, вам потрібно перевірити за допомогою responseString лише в іншому випадку для POST перевірити його за допомогою responseJSON. Довідка: grokswift.com/updating-alamofire-to-swift-3-0
Anurag Sharma

Я втратив клієнтів через цю проблему в моєму додатку iOS.
Jaseem Abbas

1
Ваша відповідь переплутана з html, вам потрібно проаналізувати html і вивести рядок json і перетворити його на словник. Я рекомендую спробувати SwiftSoup або кращі альтернативи parseHtml погляд на stackoverflow.com/questions/31080818 / ... .
Сміт

9

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

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

я виправив, замінивши на

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

Сподіваюся, це комусь допоможе.


Я годинами намагався це зрозуміти. Цікаво, чому це рішення працює ... Дякую!
MXV

7

Нехай це допоможе ВАМ

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

Так, брате, я надихнувся твоєю відповіддю. я просто завантажую код для будь-якого більш свіжого
Krutarth Patel

6

Та сама проблема трапилася і зі мною, і насправді вона виявилася проблемою сервера, оскільки тип вмісту не встановлений.

Додавання

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

6

У моєму випадку URL-адреса мого сервера була неправильною. Перевірте URL-адресу вашого сервера !!


Це було питання для мене. Не можу повірити, що я це пропустив. Я маю звичку перевіряти URL-адресу спочатку, і завжди!
LondonGuy

4

Я отримав ту ж помилку. Але я знайшов рішення для цього.

ПРИМІТКА 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!)
            }
        }
    }

4

Ось як мені вдалося виправити помилкову помилку 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 / 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
    • відповідьJSON
    • responseData

Якщо відповідь не є JSON і просто рядок у відповіді, використовуйте responseString

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

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString


2

Я вирішив використовувати це як заголовок:

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



1

Можливо, пізно, але я вирішив цю проблему іншим способом, про який тут не згадувалося:

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

Переконайтеся, що для заголовка відповіді встановлено content-type = application/jsonзначення .responseJSON()Alamofire, щоб він працював належним чином.


1

Привіт, хлопці, це те, що я виявив своєю проблемою: я закликав Alamofire через функцію для автентифікації користувачів: я використовував функцію "Користувач для входу" з параметрами, які будуть викликані з "тіла" (електронна адреса: рядок, пароль: Рядок) Це було б передано

моя помилка була точно:

необов’язково (alamofire.aferror.responseserializationfailed (alamofire.aferror.responseserializationfailurereason.jsonserializationfailed (error domain = nscocoaerrordomain code = 3840 "недійсне значення навколо символу 0." userinfo = {nsdebugdescription = недійсне значення навколо символу 0

символ 0 тут є ключовим: означає, що виклик "електронної пошти" не відповідав параметрам: Дивіться код нижче

func loginUser (електронна адреса: рядок, пароль: рядок, завершено: @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" у параметрах функції повинен збігатися з let "email" при синтаксичному аналізі, тоді він буде працювати .. Я більше не отримував помилку ... А символ 0 був "електронною поштою" у параметрі "body" для запиту Alamofire:

Сподіваюся, це допомагає


1

Я надсилав неправильний тип (String) на сервер у моїх параметрах (мав бути Int).


1

Помилка була усунена після додавання кодування: 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)
        }
   }

0

У додатку, над яким я працював сьогодні вранці, була та ж помилка. Я вважав, що це помилка на стороні сервера, оскільки я не зміг завантажити зображення користувача.

Однак, перевіривши свій користувацький 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: //. Проблема вирішена.


0

У моєму випадку я повинен додати цей ключ: "Accept": "application / json" до мого запиту заголовка.

Щось на зразок цього:

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

Я сподіваюся, що це може комусь допомогти.


0

Я стикаюся з тим же питанням, і проблема в парамедрах.

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]

0

Ймовірно, у вас є "/" в кінці вашого шляху. Якщо це не запит GET, не слід ставити "/" в кінці, інакше ви отримаєте помилку


0

Я змінив 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)

Працював у мене .. :)


0

Для мого випадку:

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

Я забув простір до \(після Bearer)


0

У моєму випадку помилка сталася через дублікат електронної пошти. Ви можете перевірити свій API у листоноші, щоб побачити, чи є відповідь нормальною чи ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.