चरित्र 0 के आसपास का अमान्य मान


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

}

यह मेरा अनुरोध है कि यह कुछ समय के लिए काम करता है, लेकिन कभी-कभी मुझे मिलता है:

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) }। इससे आप किसी भी अजीब पाठ को देखने के लिए लौटे हुए जौन को देख सकते हैं जो इसे अनपेक्षित कर देगाresponseJSON
ad121

प्रतिक्रिया स्थिति कोड क्या है?
साहिल कपूर

1
मुझे 200 का एक स्थिति कोड मिलता है और मुझे यह त्रुटि मिलती है। आह। मेरे मामले में ब्रेन डेथ :)। मैं वास्तव में JSON सर्वर से वापस नहीं कर रहा था। जो इसे हल करता है।
क्रिस प्रिंस

यदि आप .POST विधि का उपयोग करते हैं तो यह काम करेगा।
सुरजीत राजपूत

अपने Url की जाँच करें :)
आलोक

जवाबों:


136

मैंने भी इसी मुद्दे का सामना किया। मैंने responseStringइसके बजाय कोशिश की responseJSONऔर यह काम कर गया। मुझे लगता है कि यह Alamofireइसके साथ प्रयोग करने में एक बग है django


3
यह बात बताने के लिए धन्यवाद। मैं responseJSON का उपयोग कर रहा था, लेकिन सर्वर से वास्तविक प्रतिक्रिया XML प्रारूप में थी! मुझे सिरदर्द से बचाया :)
C0D3

इस समस्या का सामना करने के घंटों के बाद मेरी परियोजना को बचाया। मुझे अपने सर्वर के भीतर JSON प्रारूप में प्रतिक्रिया सेट करनी चाहिए। मैं ऐसा नहीं कर रहा था, लेकिन एक बार मैंने ऐसा किया, मैं प्रतिक्रिया का उपयोग कर सकता था अलोनोफायर से
गुइज़ोब

यदि आप GET का उपयोग कर रहे हैं, तो आपको responseString के साथ ही जांचना होगा अन्यथा POST के लिए responseJSON का उपयोग करके इसे जांचें। संदर्भ: grokswift.com/updating-alamofire-to-swift-3-0
अनुराग शर्मा

मैंने अपने iOS ऐप में इस मुद्दे के कारण ग्राहकों को खो दिया।
जसीम अब्बास

1
आपकी प्रतिक्रिया को HTML के साथ गड़बड़ कर दिया गया है, आपको html को पार्स करने और जोंस स्ट्रिंग को बाहर निकालने और इसे शब्दकोश में बदलने की आवश्यकता है। मैं 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")

आशा है कि यह किसी की मदद करेंगे।


मेरे पास यह जानने की कोशिश में घंटों लगे थे। मुझे आश्चर्य है कि यह समाधान क्यों काम करता है ... धन्यवाद!
एमएक्सवी

7

यह मदद कर सकता है

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

हाँ Bro.i आपके उत्तर से प्रेरित है। मैं बस किसी भी फ्रेशर के लिए कोड अपलोड करता
हूं

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 की जाँच करने की आदत डालनी है, और हमेशा!
लंदनगू

4

मुझे भी यही त्रुटि मिली। लेकिन मुझे इसका हल मिल गया।

नोट 1: "यह अलार्म की त्रुटि नहीं है", यह सर्वर त्रुटि का 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!)
            }
        }
    }

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. यह अनुरोध में उपयोग किए गए एन्कोडिंग प्रकार के साथ था , उपयोग किए गए एन्कोडिंग प्रकार को आपके सर्वर-साइड को स्वीकार किया जाना चाहिए ।

एनकोडिंग को जानने के लिए मुझे सभी एनकोडिंग प्रकारों के माध्यम से चलना था:

डिफ़ॉल्ट / मेथड डिपेंडेंट / क्वेरीस्ट्रीमिंग / 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

उदाहरण : लॉगिन के मामले में / टोकन एपीआई बनाएं:

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString




1

शायद यह बहुत देर हो चुकी है लेकिन मैंने इस समस्या को एक और तरीके से हल किया है जिसका उल्लेख यहां नहीं किया गया है:

जब आप उपयोग करते हैं .responseJSON(), तो आपको प्रतिक्रिया हैडर के साथ सेट करना होगा content-type = application/json, यदि नहीं, तो यह दुर्घटनाग्रस्त हो जाएगा भले ही आपका शरीर एक वैध JSON हो। तो, हो सकता है कि आपकी प्रतिक्रिया शीर्ष लेख रिक्त हो या किसी अन्य सामग्री-प्रकार का उपयोग कर रही हो।

सुनिश्चित करें कि आपकी प्रतिक्रिया हेडर के साथ सेट कर दिया जाता content-type = application/jsonकरने के लिए .responseJSON()ठीक से Alamofire काम में।


1

हे लोग यह वही है जो मुझे मेरा मुद्दा लगता है: मैं एक फ़ंक्शन के माध्यम से ऑलमोफायर को प्रामाणिक उपयोगकर्ताओं को बुला रहा था: मैंने फ़ंक्शन "लॉगिन उपयोगकर्ता" का उपयोग उन मापदंडों के साथ किया था जिन्हें "निकाय" से बुलाया जाएगा (ईमेल: स्ट्रिंग, पासवर्ड: स्ट्रिंग) कि पारित किया जाएगा

मेरा इर्र्ट बिल्कुल था:

वैकल्पिक (alamofire.aferror.responseserializationfailed (alamofire.aferror.responseserialializationfailurereason.jsonserializationfailed) (त्रुटि डोमेन = nscocerrerrordomain कोड = 3840 "वर्ण के आसपास अमान्य मान 0." userinfo = {nsdebugdescription अमान्य ""

चरित्र 0 यहाँ कुंजी है: जिसका अर्थ है "ईमेल" के लिए कॉल पैरामीटर से मेल नहीं खा रहा था: नीचे दिए गए कोड को देखें

func loginUser (ईमेल: स्ट्रिंग, पासवर्ड: स्ट्रिंग, पूर्ण: @ डाउनलोड डाउनलोड पूर्ण) {चलो लोअरकेसडेलमेल = 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)
                }

फ़ंक्शन पैरामीटर में "ईमेल" को "ईमेल" से मेल खाना चाहिए जब पार्सिंग होगी तब यह काम करेगा। मुझे अब त्रुटि नहीं मिली ... और चरित्र 0 अल्मोफ़ायर अनुरोध के लिए "बॉडी" पैरामीटर में "ईमेल" था:

उम्मीद है की यह मदद करेगा


1

मैं अपने मापदंडों में सर्वर को अनुचित प्रकार (स्ट्रिंग) भेज रहा था (एक इंट होने की आवश्यकता थी)।


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 प्रमाणपत्र जोड़ने के बाद, जिसे मैंने 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: // में बदल दिया है। समस्या सुलझ गयी।


0

मेरे मामले में मुझे इस कुंजी को जोड़ना है: "स्वीकार करें": "आवेदन / 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_pathurl है। यह स्ट्रिंग से किसी भी ओर ले जाता है जो सर्वर साइड में समस्याएं पैदा करता है। इस समस्या को हल करने के लिए मुझे डिफ़ॉल्ट मान देना होगा जो इसे स्ट्रिंग मान बनाता है।

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

0

संभवतः आपके पास अपने रास्ते के अंत में "/" है। यदि यह GET अनुरोध नहीं है, तो आपको अंत में "/" नहीं डालना चाहिए, अन्यथा आपको त्रुटि मिलेगी


0

मैंने "mov" से "मल्टीपार्ट / फॉर्म-डेटा" में mimeType को बदल दिया।

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

मेरे मामले में त्रुटि डुप्लिकेट ईमेल के कारण हुई थी। आप पोस्टमैन पर अपना एपीआई देख सकते हैं कि क्या प्रतिक्रिया ठीक है या नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.