web-dev-qa-db-ja.com

文字0の周りのAlamofireの無効な値

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が含まれています。

このエラーが時々発生するのはなぜですか?

80
Lord Vermillion

私も同じ問題に直面しました。 responseStringの代わりにresponseJSONを試しましたが、うまくいきました。これはAlamofireでの使用に伴うDjangoのバグだと思います。

117
Smit

Alamofireでマルチパート形式で画像をアップロードしているときに、使用していたのと同じエラーが発生しました

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

に置き換えて修正しました

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

これが誰かを助けることを願っています。

9
Avijit Nagare

同じ問題が私に起こり、コンテンツタイプが設定されていないため、実際にはサーバーの問題になりました。

追加中

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

助けてよ

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

同じエラーが発生しました。しかし、私はそれに対する解決策を見つけました。

注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!)
            }
        }
    }
3
Ram Madhavan

これが、無効な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. エンコードリクエストで使用されたタイプ、使用されたエンコードタイプはServer-Sideで受け入れられるべきでした.

エンコーディングを知るために、すべてのエンコーディングタイプを実行する必要がありました。

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. また、responseにも依存します。適切なを使用して受信しています。
    • responseString
    • responseJSON
    • responseData

応答がJSONではなく、応答内の単なる文字列の場合responseString

:ログインの場合/トークンAPIの作成:

「20dsoqs0287349y4ka85u6f24gmr6pah」

responseString

3
Ratz

これをヘッダーとして使用して解決しました:

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

2
Bruno Muniz

私の場合、サーバーのURLが間違っていました。サーバーのURLを確認してください!!

1
Saeed

エンコーディングを追加した後のエラーは解決されました: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
krishnan

やあみんなこれは私の問題であることがわかった:私はユーザーを認証する関数を介してAlamofireを呼び出していた:私は関数「Login User」を使用し、「body」(email:String、password:文字列)それが渡されます

私のエラーは正確に:

optional(alamofire.aferror.responseserializationfailed(alamofire.aferror.responseserializationfailurereason.jsonserializationfailed(error domain = nscocoaerrordomain code = 3840 "文字0の周りの無効な値。" userinfo = {nsdebugdescription =文字0の周りの無効な値

ここでの文字0はキーです。つまり、「電子メール」の呼び出しがパラメーターと一致しなかったことを意味します。以下のコードを参照してください

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

関数パラメーターの「電子メール」は、解析時にlet「電子メール」と一致する必要があります。エラーが発生しなくなりました...そして、Alamofire要求の「body」パラメーターの文字0は「電子メール」でした。

お役に立てれば

1
berkat0789

遅すぎるかもしれませんが、ここで言及されていない別の方法でこの問題を解決しました:

.responseJSON()を使用する場合は、content-type = application/jsonを使用して応答ヘッダーを設定する必要があります。設定しない場合、ボディが有効なJSONであってもクラッシュします。したがって、応答ヘッダーが空であるか、別のコンテンツタイプを使用している可能性があります。

Alamofireの応答ヘッダーがcontent-type = application/jsonから.responseJSON()に設定されていることを確認してください。

1
guijob

今朝作業していたアプリケーションにも同じエラーがありました。ユーザー画像をアップロードできなかったため、サーバー側のエラーであると考えました。

ただし、カスタムAPIを確認すると、api.Swift URLを更新していないSSL証明書をWebサイトに追加した後、データを投稿できないことがわかりました。

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
RH Blanchfield

私の場合、URLに余分な/がありました。

0
Alok

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
K Ravi Kumar

私の場合、このキー: "Accept": "application/json"をヘッダーリクエストに追加する必要があります。

このようなもの:

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

これが誰かを助けることを願っています。

0
Dasoga

おそらく、パスの最後に「/」があります。 GETリクエストでない場合は、末尾に「/」を入れないでください。そうしないと、エラーが発生します。

0
Mark Darry

私は同じ問題に直面しており、問題はパラメータにあります。

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
Hitesh Agarwal

私はパラメータで不適切なタイプ(String)をサーバーに送信していました(Intである必要があります)。

0
agrippa