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 บางส่วน

ทำไมบางครั้งฉันจึงได้รับข้อผิดพลาดนี้


13
สิ่งหนึ่งที่ผมชอบที่จะทำเมื่อฉันได้รับข้อผิดพลาดนี้แสดงความคิดเห็นออกมาบล็อกและแทนที่ด้วยresponseJSON() { ... } .responseString { _, _, s, _ in println(s) }ที่ช่วยให้คุณเห็น json ที่ถูกส่งกลับเพื่อค้นหาข้อความแปลก ๆ ที่จะทำให้ไม่สามารถแยกวิเคราะห์ได้ภายในresponseJSON
ad121

รหัสสถานะการตอบกลับคืออะไร?
Sahil Kapoor

1
ฉันได้รับรหัสสถานะ 200 และได้รับข้อผิดพลาดนี้ AHHH. สมองตายในกรณีของฉัน :) ฉันไม่ได้ส่งคืน JSON จากเซิร์ฟเวอร์จริงๆ ที่แก้ได้
Chris Prince

อาจจะใช้ได้ถ้าคุณใช้. POST Method
Surjeet Rajput

Check your Url :)
Alok

คำตอบ:


142

ฉันก็ประสบปัญหาเดียวกัน ฉันพยายามresponseStringแทนresponseJSONและได้ผล ฉันเดาว่านี่เป็นข้อบกพร่องในการAlamofireใช้กับdjango.


3
ขอบคุณที่ชี้ให้เห็น ฉันใช้ responseJSON แต่การตอบกลับจริงจากเซิร์ฟเวอร์อยู่ในรูปแบบ XML! ช่วยให้ฉันปวดหัว :)
C0D3

บันทึกโครงการของฉันหลังจากหลายชั่วโมงที่ประสบปัญหานี้ฉันควรตั้งค่าการตอบสนองในรูปแบบ JSON ภายในเซิร์ฟเวอร์ของฉัน ฉันไม่ได้ทำสิ่งนี้ แต่เมื่อทำแล้วฉันสามารถใช้ responseJSON จาก 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/...
Smit

9

ฉันได้รับข้อผิดพลาดเดียวกันขณะอัปโหลดภาพในรูปแบบหลายส่วนใน Alamofire ขณะที่ฉันใช้

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

ฉันแก้ไขโดยการแทนที่ด้วย

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

หวังว่านี่จะช่วยใครสักคน


ฉันมีเวลาหลายชั่วโมงในการพยายามคิดออก ฉันสงสัยว่าทำไมวิธีนี้ถึงได้ผล ... ขอบคุณ!
MXV

7

ขอให้สิ่งนี้ช่วย YOu

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

ใช่ Bro.i ได้รับแรงบันดาลใจจากคำตอบของคุณ ฉันแค่อัปโหลดโค้ดสำหรับคนใหม่
Krutarth Patel

7

ในกรณีของฉัน URL เซิร์ฟเวอร์ของฉันไม่ถูกต้อง ตรวจสอบ URL เซิร์ฟเวอร์ของคุณ !!


นี่เป็นปัญหาสำหรับฉัน ไม่น่าเชื่อว่าจะพลาด ฉันต้องสร้างนิสัยในการตรวจสอบ URL ก่อนเสมอ!
LondonGuy

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

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

นี่คือวิธีที่ฉันจัดการเพื่อแก้ไข 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. มันก็มีการเข้ารหัสประเภทที่ใช้ในการร้องขอ, การเข้ารหัสประเภทที่ใช้ควรจะเป็นของคุณ acceptedin ฝั่งเซิร์ฟเวอร์

เพื่อที่จะทราบการเข้ารหัสที่ฉันต้องเรียกใช้ผ่านประเภทการเข้ารหัสทั้งหมด:

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
    • ตอบกลับ
    • responseData

หากการตอบกลับไม่ใช่สตริง JSON & just ในการตอบสนองให้ใช้responseString

ตัวอย่าง : ในกรณีของการล็อกอิน / สร้างโทเค็น API:

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString




1

อาจจะสายเกินไป แต่ฉันแก้ไขปัญหานี้ด้วยวิธีอื่นที่ไม่ได้กล่าวถึงที่นี่:

เมื่อคุณใช้.responseJSON()คุณต้องตั้งค่าส่วนหัวการตอบกลับด้วยcontent-type = application/jsonหากไม่เป็นเช่นนั้นระบบจะหยุดทำงานแม้ว่าเนื้อหาของคุณจะเป็น JSON ที่ถูกต้องก็ตาม ดังนั้นส่วนหัวการตอบกลับของคุณอาจว่างเปล่าหรือใช้เนื้อหาประเภทอื่น

ตรวจสอบให้แน่ใจว่าส่วนหัวการตอบกลับของคุณตั้งค่าcontent-type = application/jsonเป็น.responseJSON()ใน Alamofire ทำงานได้อย่างถูกต้อง


1

นี่คือสิ่งที่ฉันพบว่าเป็นปัญหาของฉัน: ฉันเรียก Alamofire ผ่านฟังก์ชันเพื่อตรวจสอบสิทธิ์ผู้ใช้: ฉันใช้ฟังก์ชัน "ผู้ใช้เข้าสู่ระบบ" ด้วยพารามิเตอร์ที่จะเรียกจาก "body" (อีเมล: String, password: String) ที่จะผ่านไป

ข้อผิดพลาดของฉันคือ:

ทางเลือก (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 คือ "email" ในพารามิเตอร์ "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 ของคุณในบุรุษไปรษณีย์อีกครั้งเพื่อดูว่าการตอบสนองนั้นใช้ได้หรือไม่


0

ในกรณีของฉันฉันลองใช้ Postman เพื่อรับ API และข้อผิดพลาดนี้มาจากแบ็กเอนด์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.