Alamofire invalid value around character 0

谁说胖子不能爱 提交于 2019-11-27 03:47:59
Smit

I also faced same issue. I tried responseString instead of responseJSON and it worked. I guess this is a bug in Alamofire with using it with django.

I got same error while uploading image in multipart form in Alamofire as i was using

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

i fixed by replacing by

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

Hope this help someone.

The same issue happened to me and it actually ended up being a server issue since the content type wasn't set.

Adding

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

To the request chain solved it for me

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

May this Help YOu

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

I got the same error. But i found the solution for it.

NOTE 1: "It is not Alarmofire error", it's bcouse of server error.

NOTE 2: You don't need to change "responseJSON" to "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!)
            }
        }
    }

This is how I managed to resolve the Invalid 3840 Err.

The error log

 responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
  1. It was with Encoding Type used in the Request, The Encoding Type used should be acceptedin your Server-Side.

In-order to know the Encoding I had to run through all the Encoding Types:

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. It also depends upon the response we are recieving use the appropriate
    • responseString
    • responseJSON
    • responseData

If the response is not a JSON & just string in response use responseString

Example: in-case of login/ create token API :

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString

I solved using this as header:

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

Maybe it is too late but I solved this problem in another way not mentioned here:

When you use .responseJSON(), you must set the response header with content-type = application/json, if not, it'll crash even if your body is a valid JSON. So, maybe your response header are empty or using another content-type.

Make sure your response header is set with content-type = application/json to .responseJSON() in Alamofire work properly.

Hey guys this is what I found to be my issue: I was calling Alamofire via a function to Authenticate Users: I used the function "Login User" With the parameters that would be called from the "body"(email: String, password: String) That would be passed

my errr was exactly:

optional(alamofire.aferror.responseserializationfailed(alamofire.aferror.responseserializationfailurereason.jsonserializationfailed(error domain=nscocoaerrordomain code=3840 "invalid value around character 0." userinfo={nsdebugdescription=invalid value around character 0

character 0 is the key here: meaning the the call for the "email" was not matching the parameters: See the code below

func loginUser(email: String, password: String, completed: @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" in function parameters must match the let "email" when parsing then it will work..I no longer got the error...And character 0 was the "email" in the "body" parameter for the Alamofire request:

Hope this helps

    1

    Error was resolved after adding encoding: JSONEncoding.default with 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)
            }
       }
    
      1

      In my case , my server URL was incorrect. Check your server URL !!

        0

        The application I was working on this morning had the same error. I believed it to be a server side error since I was unable to upload a user image.

        However, upon checking my custom API, I realized that after adding an SSL certificate to my website that I had not updated the api.swift URLs, the data was unable to post:

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

        I changed the URL's to https://. Problem solved.

          0

          In my case I have to add this Key: "Accept":"application/json" to my header request.

          Something like this:

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

          I hope that this can help someone.

            0

            I was sending the improper type (String) to the server in my parameters (needed to be an Int).

              0

              I face same issue and problem is in 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 is url. it coerced from string to any which create issues at server side. To resolve this issue I have to give default value which make it string value.

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

                Probably you have "/" at the end of your path. If it is not GET request, you shouldn't put "/" at the end, otherwise you'll get the error

                  0

                  In my case, there was an extra / in the URL .

                    0

                    I Changed mimeType from "mov" to "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)
                    

                    Worked for me.. :)

                      Your Answer

                      By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

                      Not the answer you're looking for? Browse other questions tagged or ask your own question.

                      易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
                      该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!