Alamofire invalid value around character 0

IosSwiftAlamofire

Ios Problem Overview


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

This is my request with Alamofire, for a certain request it sometime works, but sometimes i get:

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

I've read that this can be due to invalid JSON, but the response is a static json string that i have validated in JSON validator as valid. It does contain å ä ö characters and some HTML.

Why am i getting this error sometimes?

Ios Solutions


Solution 1 - Ios

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.

Solution 2 - Ios

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

Solution 3 - Ios

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.

Solution 4 - Ios

May this Help YOu

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

Solution 5 - Ios

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

Solution 6 - Ios

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

Solution 7 - Ios

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

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

Solution 8 - Ios

I solved using this as header:

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

Solution 9 - Ios

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

Solution 10 - Ios

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.

Solution 11 - Ios

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

Solution 12 - Ios

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

Solution 13 - Ios

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

Solution 14 - Ios

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.

Solution 15 - Ios

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.

Solution 16 - Ios

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]

Solution 17 - Ios

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

Solution 18 - Ios

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

Solution 19 - Ios

For my case:

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

I forgot the space before \ (after Bearer)

Solution 20 - Ios

In my case error was due to duplicate email. You can recheck your API on postman to see if response there is OK or not.

Solution 21 - Ios

In my case, I tried using Postman to get API and this error come from backend.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLord VermillionView Question on Stackoverflow
Solution 1 - IosSmitView Answer on Stackoverflow
Solution 2 - IosSaeedView Answer on Stackoverflow
Solution 3 - IosAvijit NagareView Answer on Stackoverflow
Solution 4 - IosKrutarth PatelView Answer on Stackoverflow
Solution 5 - IoscameronmoreauView Answer on Stackoverflow
Solution 6 - IosRam MadhavanView Answer on Stackoverflow
Solution 7 - IosRatzView Answer on Stackoverflow
Solution 8 - IosBruno MunizView Answer on Stackoverflow
Solution 9 - IosAlokView Answer on Stackoverflow
Solution 10 - IosguijobView Answer on Stackoverflow
Solution 11 - Iosberkat0789View Answer on Stackoverflow
Solution 12 - IosagrippaView Answer on Stackoverflow
Solution 13 - IoskrishnanView Answer on Stackoverflow
Solution 14 - IosNoble PolygonView Answer on Stackoverflow
Solution 15 - IosDasogaView Answer on Stackoverflow
Solution 16 - IosHitesh AgarwalView Answer on Stackoverflow
Solution 17 - IosMark DarryView Answer on Stackoverflow
Solution 18 - IosK Ravi KumarView Answer on Stackoverflow
Solution 19 - IoshaggagView Answer on Stackoverflow
Solution 20 - IosArqam ButtView Answer on Stackoverflow
Solution 21 - IosDiệp LânView Answer on Stackoverflow