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


93
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
このエラーが発生したときに私がしたいことの1つは、responseJSON() { ... }ブロックをコメントアウトしてに置き換えること.responseString { _, _, s, _ in println(s) }です。あなたはでそれがunparsibleになるだろう任意の奇数のテキストを探すために返されるJSONを確認することができますそのresponseJSON
ad121

応答ステータスコードとは何ですか?
Sahil Kapoor 2015年

1
ステータスコード200が表示され、このエラーが表示されます。AHHH。私の場合の脳死:)。実際にはサーバーからJSONを返していませんでした。それで解決します。
Chris Prince

.POSTメソッドを使用する場合、これが機能する可能性があります。
Surjeet Rajput

URLを確認してください:)
Alok

回答:


136

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


3
ご指摘いただきありがとうございます。私はresponseJSONを使用していましたが、サーバーからの実際の応答はXML形式でした!頭痛を
省い

この問題に直面して数時間後にプロジェクトを保存しました。サーバー内で応答をJSON形式で設定する必要があります。私はこれをしていませんでしたが、一度実行したら、alamofireからのresponseJSONを使用できました
guijob

GETを使用している場合は、responseStringで確認する必要があります。それ以外の場合のみ、POSTの場合はresponseJSONを使用して確認します。参照:grokswift.com/updating-alamofire-to-swift-3-0
Anurag Sharma

iOSアプリでこの問題が発生したため、顧客を失いました。
Jaseem Abbas 2017

1
あなたの応答はhtmlで混乱しています。htmlを解析してjson文字列を取得し、辞書に変換する必要があります。SwiftSoupを試すか、parseHtmlのより良い代替案として、stackoverflow.com / questions / 31080818 /…をご覧になることをお勧めします。
2017年

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 Patel 2016

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する必要があります使用タイプサーバー側

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

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. それはまた、適切な使用を私たちが受け取っている応答に依存します
    • responseString
    • responseJSON
    • responseData

応答は、応答の使用でJSON&単なる文字列でない場合responseString

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

「20dsoqs0287349y4ka85u6f24gmr6pah」

responseString


2

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

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



1

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

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

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


1

こんにちは、これが私の問題であることがわかりました:ユーザーを認証するための関数を介してAlamofireを呼び出していました: "Login User"関数を使用しました。文字列)渡されます

私のエラーは正確でした:

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

関数パラメーターの "email"は、解析時にlet "email"と一致する必要があります。そうすると機能します。エラーは発生しなくなりました...そして、Alamofireリクエストの "body"パラメーターの "email"は文字0でした:

お役に立てれば


1

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


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証明書を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

私の場合、このヘッダー「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

私の場合、エラーはメールの重複が原因でした。postmanでAPIを再確認して、応答がOKかどうかを確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.