문자 0 주변의 Alamofire 유효하지 않은 값


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이 포함되어 있습니다.

가끔이 오류가 발생하는 이유는 무엇입니까?


12
이 오류가 발생할 때 내가 좋아하는 한 가지는 responseJSON() { ... }블록을 주석 처리하고 .responseString { _, _, s, _ in println(s) }. 그러면 해석 할 수없는 이상한 텍스트를 찾기 위해 반환되는 json을 볼 수 있습니다.responseJSON
ad121

응답 상태 코드는 무엇입니까?
Sahil Kapoor

1
상태 코드가 200이고이 오류가 발생합니다. AHHH. 내 경우에는 뇌사 :). 실제로 서버에서 JSON을 반환하지 않았습니다. 그것은 그것을 해결합니다.
Chris Prince

.POST 메서드를 사용하면 작동 할 수 있습니다.
Surjeet이 라

URL 확인 :)
Alok

답변:


137

나도 같은 문제에 직면했습니다. responseString대신 시도했고 responseJSON작동했습니다. 나는 이것이 Alamofire함께 사용 하는 버그라고 생각합니다 django.


3
지적 해 주셔서 감사합니다. 나는 responseJSON을 사용하고 있었지만 서버의 실제 응답은 XML 형식이었습니다! 나에게 두통을
구했다

이 문제에 직면 한 시간 후에 내 프로젝트를 저장했습니다. 서버 내에서 JSON 형식으로 응답을 설정해야합니다. 나는이 일을하지 않은,하지만 난 한 번, 나는 alamofire에서 responseJSON을 사용할 수 있습니다
guijob

GET을 사용하는 경우에는 responseString으로 만 확인해야합니다. 그렇지 않으면 POST를 위해 responseJSON을 사용하여 확인해야합니다. 참조 : grokswift.com/updating-alamofire-to-swift-3-0
아 누락 샤르마

iOS 앱에서이 문제로 인해 고객을 잃었습니다.
자심 압바스

1
응답이 html로 엉망이되었으므로 html을 구문 분석하고 json 문자열을 가져와 사전으로 변환해야합니다. 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")

이것이 누군가를 돕기를 바랍니다.


나는 이것을 알아 내려고 몇 시간을 보냈다. 이 솔루션이 작동하는 이유가 궁금합니다 ... 감사합니다!
MXV

7

이것이 당신을 도울 수 있습니다

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

네 Bro.i는 귀하의 답변에서 영감을 얻었습니다. 난 그냥 어떤 신선한 코드를 업로드
Krutarth 파텔에게

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을 먼저 확인하는 습관을 들이고 항상!
LondonGuy

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

이것이 내가 잘못된 3840 오류를 해결하는 방법입니다.

오류 로그

 responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
  1. 그것은 함께 있었다 인코딩 유형 요청에 사용되는 인코딩 유형이 acceptedin해야 사용되는 서버 측 .

인코딩을 알기 위해서는 모든 인코딩 유형을 실행해야했습니다.

기본값 / 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
    • responseJSON
    • responseData

응답은 응답 사용에 JSON 및 단지 문자열이 아닌 경우 responseString

: 로그인의 경우 / 토큰 생성 API :

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString


2

이것을 헤더로 사용하여 해결했습니다.

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


2

제 경우에는 URL에 추가 /가 있습니다.


1

너무 늦었을 수도 있지만 여기에 언급되지 않은 다른 방법으로이 문제를 해결했습니다.

을 사용할 때를 사용 .responseJSON()하여 응답 헤더를 설정해야합니다 content-type = application/json. 그렇지 않으면 본문이 유효한 JSON 인 경우에도 충돌이 발생합니다. 따라서 응답 헤더가 비어 있거나 다른 콘텐츠 유형을 사용하고있을 수 있습니다.

확인 응답 헤더로 설정 content-type = application/json.responseJSON()제대로 Alamofire 작업에.


1

안녕하세요 여러분, 이것이 제 문제인 것으로 나타났습니다. 사용자 인증을위한 함수를 통해 Alamofire를 호출했습니다. "body"에서 호출되는 매개 변수와 함께 "Login User"함수를 사용했습니다 (email : String, password : 문자열) 전달됩니다.

내 어음은 정확히 :

optional (alamofire.aferror.responseserializationfailed (alamofire.aferror.responseserializationfailurereason.jsonserializationfailed (error domain = nscocoaerrordomain code = 3840 "invalid value around character 0."userinfo = {nsdebugdescription = 문자 0 주변의 잘못된 값

여기에서 문자 0이 핵심입니다. "email"에 대한 호출이 매개 변수와 일치하지 않음을 의미합니다. 아래 코드를 참조하십시오.

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"은 구문 분석 할 때 let "email"과 일치해야합니다. 그러면 작동합니다. 더 이상 오류가 발생하지 않습니다. 문자 0은 Alamofire 요청에 대한 "body"매개 변수의 "email"이었습니다.

도움이 되었기를 바랍니다


1

내 매개 변수 (Int가 필요함)의 서버에 부적절한 유형 (String)을 보냈습니다.


1

인코딩을 추가 한 후 오류가 해결되었습니다. Alamofire로 JSONEncoding.default.

  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를 확인한 결과 api.swift URL을 업데이트하지 않은 SSL 인증서를 내 웹 사이트에 추가 한 후 데이터를 게시 할 수 없음을 깨달았습니다.

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_pathURL입니다. 그것은 문자열에서 서버 측에서 문제를 일으키는 모든 것으로 강제되었습니다. 이 문제를 해결하려면 문자열 값으로 만드는 기본값을 제공해야합니다.

 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를 다시 확인하여 응답이 정상인지 여부를 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.