Giá trị không hợp lệ của Alamofire xung quanh ký tự 0


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

}

Đây là yêu cầu của tôi với Alamofire, đối với một yêu cầu nhất định, đôi khi nó hoạt động, nhưng đôi khi tôi nhận được:

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

Tôi đã đọc rằng điều này có thể là do JSON không hợp lệ, nhưng phản hồi là một chuỗi json tĩnh mà tôi đã xác thực trong trình xác thực JSON là hợp lệ. Nó chứa các ký tự å ä ö và một số HTML.

Tại sao đôi khi tôi gặp lỗi này?


12
Một điều tôi thích làm khi gặp lỗi này là nhận xét responseJSON() { ... }khối và thay thế bằng .responseString { _, _, s, _ in println(s) }. Cho phép bạn xem các json được trả về để nhìn cho bất kỳ văn bản lẻ mà có thể làm nó unparsible bởiresponseJSON
ad121

Mã trạng thái phản hồi là gì?
Sahil Kapoor

1
Tôi nhận được mã trạng thái là 200 và tôi gặp lỗi này. AHHH. Chết não trong trường hợp của tôi :). Tôi không thực sự trả lại JSON từ máy chủ. Điều đó giải quyết nó.
Chris Prince

có thể điều này sẽ hoạt động nếu bạn sử dụng Phương pháp .POST.
Surjeet Rajput

Kiểm tra Url của bạn :)
Alok

Câu trả lời:


137

Tôi cũng phải đối mặt với vấn đề tương tự. Tôi đã thử responseStringthay vì responseJSONvà nó hoạt động. Tôi đoán đây là một lỗi Alamofirekhi sử dụng nó với django.


3
Cảm ơn vì đã chỉ ra điều đó. Tôi đang sử dụng responseJSON nhưng phản hồi thực tế từ máy chủ ở định dạng XML! Đã cứu tôi đau đầu :)
C0D3

đã lưu dự án của tôi sau nhiều giờ gặp phải sự cố này. Tôi nên đặt phản hồi ở định dạng JSON trong máy chủ của mình. Tôi đã không làm điều này, nhưng một khi tôi đã làm, tôi có thể sử dụng responseJSON từ alamofire
guijob

Nếu bạn đang sử dụng GET thì bạn chỉ cần kiểm tra với responseString, nếu không, để POST, hãy kiểm tra nó bằng cách sử dụng responseJSON. Tham khảo: grokswift.com/updating-alamofire-to-swift-3-0
Anurag Sharma

Tôi đã mất khách hàng vì sự cố này trong ứng dụng iOS của mình.
Jaseem Abbas

1
Phản hồi của bạn bị rối với html, bạn cần phải phân tích cú pháp html và lấy chuỗi json ra và chuyển nó sang từ điển. Tôi khuyên bạn nên dùng thử SwiftSoup hoặc các lựa chọn thay thế tốt hơn cho parseHtml, hãy xem stackoverflow.com/questions/31080818/… .
Smit

9

Tôi gặp lỗi tương tự khi tải lên hình ảnh ở dạng nhiều phần trong Alamofire khi tôi đang sử dụng

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

tôi đã sửa bằng cách thay thế bằng

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

Hy vọng điều này sẽ giúp ai đó.


Tôi đã có hàng giờ cố gắng tìm ra điều này. Tôi tự hỏi tại sao giải pháp này hoạt động ... Cảm ơn bạn!
MXV

7

Mong điều này giúp bạn

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

Có Bro.i lấy cảm hứng từ câu trả lời của bạn. tôi chỉ cần tải lên mã cho bất kỳ tươi
Krutarth Patel

6

Vấn đề tương tự cũng xảy ra với tôi và nó thực sự đã trở thành sự cố máy chủ vì loại nội dung không được đặt.

Thêm

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

Để chuỗi yêu cầu đã giải quyết nó cho tôi

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

Trong trường hợp của tôi, URL máy chủ của tôi không chính xác. Kiểm tra URL máy chủ của bạn !!


Đây là vấn đề đối với tôi. Tôi không thể tin rằng tôi đã bỏ lỡ nó. Tôi phải tạo thói quen kiểm tra URL trước và luôn luôn!
LondonGuy

4

Tôi cũng gặp lỗi tương tự. Nhưng tôi đã tìm ra giải pháp cho nó.

LƯU Ý 1: "Đó không phải là lỗi Alarmofire", đó là do lỗi máy chủ.

LƯU Ý 2: Bạn không cần thay đổi "responseJSON" thành "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

Đây là cách tôi quản lý để giải quyết 3840 Err không hợp lệ.

Nhật ký lỗi

 responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
  1. Đó là với Loại mã hóa được sử dụng trong Yêu cầu, Loại mã hóa được sử dụng phải được chấp nhận ở Phía máy chủ của bạn .

Để biết Mã hóa, tôi đã phải chạy qua tất cả các Loại Mã hóa:

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. Nó cũng phụ thuộc vào phản hồi mà chúng tôi đang nhận được sử dụng
    • chuỗi phản hồi
    • đáp lạiJSON
    • responseData

Nếu phản hồi không phải là JSON & chỉ là chuỗi trong phản hồi, hãy sử dụng responseString

Ví dụ : trong trường hợp đăng nhập / tạo mã thông báo API:

"20dsoqs0287349y4ka85u6f24gmr6pah"

chuỗi phản hồi


2

Tôi đã giải quyết bằng cách sử dụng điều này làm tiêu đề:

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


2

Trong trường hợp của tôi, có thêm / trong URL.


1

Có lẽ đã quá muộn nhưng tôi đã giải quyết vấn đề này theo một cách khác không được đề cập ở đây:

Khi sử dụng .responseJSON(), bạn phải đặt tiêu đề phản hồi bằng content-type = application/json, nếu không, nó sẽ bị lỗi ngay cả khi nội dung của bạn là JSON hợp lệ. Vì vậy, có thể tiêu đề phản hồi của bạn trống hoặc sử dụng loại nội dung khác.

Hãy chắc chắn rằng tiêu đề trả lời của bạn được thiết lập với content-type = application/jsontới .responseJSON()trong Alamofire làm việc đúng cách.


1

Xin chào các bạn, đây là điều tôi thấy là vấn đề của mình: Tôi đang gọi Alamofire qua một chức năng Xác thực Người dùng: Tôi đã sử dụng chức năng "Đăng nhập Người dùng" Với các tham số sẽ được gọi từ "body" (email: Chuỗi, mật khẩu: Chuỗi) Điều đó sẽ được thông qua

sai lầm của tôi chính xác là:

tùy chọn (alamofire.aferror.responseserialization không thành công (alamofire.aferror.responseserializationfailurereason.jsonserialization không thành công (error domain = nscocoaerrordomain code = 3840 "giá trị không hợp lệ xung quanh ký tự 0" userinfo = {nsdebugdescription = giá trị không hợp lệ xung quanh ký tự 0

ký tự 0 là khóa ở đây: nghĩa là lệnh gọi cho "email" không khớp với các tham số: Xem đoạn mã bên dưới

func loginUser (email: String, mật khẩu: String, hoàn thành: @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" trong tham số hàm phải khớp với let "email" khi phân tích cú pháp thì nó mới hoạt động..Tôi không còn gặp lỗi nữa ... Và ký tự 0 là "email" trong tham số "body" cho yêu cầu Alamofire:

Hi vọng điêu nay co ich


1

Tôi đã gửi loại không phù hợp (Chuỗi) đến máy chủ trong các tham số của mình (cần phải là Int).


1

Lỗi đã được giải quyết sau khi thêm mã hóa: JSONEncoding.default với 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

Ứng dụng tôi đang làm sáng nay cũng bị lỗi tương tự. Tôi tin rằng đó là lỗi phía máy chủ vì tôi không thể tải lên hình ảnh người dùng.

Tuy nhiên, khi kiểm tra API tùy chỉnh của mình, tôi nhận ra rằng sau khi thêm chứng chỉ SSL vào trang web của mình mà tôi chưa cập nhật URL api.swift, dữ liệu không thể đăng:

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

Tôi đã thay đổi URL thành https: //. Vấn đề đã được giải quyết.


0

Trong trường hợp của tôi, tôi phải thêm Khóa này: "Chấp nhận": "application / json" vào yêu cầu tiêu đề của mình.

Một cái gì đó như thế này:

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

Tôi hy vọng rằng điều này có thể giúp ai đó.


0

Tôi phải đối mặt với vấn đề tương tự và vấn đề là ở params.

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

companyModal.directory_pathlà url. nó ép buộc từ chuỗi đến bất kỳ tạo ra sự cố ở phía máy chủ. Để giải quyết vấn đề này, tôi phải cung cấp giá trị mặc định làm cho nó có giá trị chuỗi.

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

0

Có lẽ bạn có "/" ở cuối con đường của bạn. Nếu đó không phải là yêu cầu GET, bạn không nên đặt "/" ở cuối, nếu không bạn sẽ gặp lỗi


0

Tôi đã thay đổi mimeType từ "mov" thành "nhiều phần / biểu mẫu-dữ liệu".

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)

Đã làm cho tôi.. :)


0

Đối với trường hợp của tôi:

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

Tôi đã quên khoảng trắng trước \(sau Bearer)


0

Trong trường hợp của tôi, lỗi là do email trùng lặp. Bạn có thể kiểm tra lại API của mình trên người đưa thư để xem phản hồi có đồng ý hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.