web-dev-qa-db-ja.com

Alamofire Swift 3.0呼び出し中の追加の引数

プロジェクトをSwift 3に移行しました(Podfileでpod 'Alamofire', '~> 4.0'を使用してAlamofireを最新のSwift 3バージョンに更新しました)。

すべてのAlamofire.requestで「余分な引数の呼び出し」エラーが表示されるようになりました。例えば:

let patientIdUrl = baseUrl + nextPatientIdUrl
Alamofire.request(.POST, patientIdUrl, parameters: nil, headers: nil, encoding: .JSON)

誰に理由を教えてもらえますか?

52
Agreensh

Alamofire によると、バージョン4.0.0のURL要求のドキュメントHTTPメソッドは次のようになります。

Alamofire.request("https://httpbin.org/get") // method defaults to `.get`    
Alamofire.request("https://httpbin.org/post", method: .post)
Alamofire.request("https://httpbin.org/put", method: .put)
Alamofire.request("https://httpbin.org/delete", method: .delete)

したがって、URLリクエストは次のようになります。

Alamofire.request(patientIdUrl, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: nil)

サンプルリクエストは次のようになります。

Alamofire.request(url, method: .post, parameters: param, encoding: JSONEncoding.default, headers: [AUTH_TOKEN_KEY : AUTH_TOKEN])
    .responseJSON { response in
        print(response.request as Any)  // original URL request
        print(response.response as Any) // URL response
        print(response.result.value as Any)   // result of response serialization
}

お役に立てれば!

78

これは私のために働いた。
encodingパラメーターを削除する必要はありません

Swift 5.xの更新

Alamofireは、Swift 5で導入されたResultタイプを使用します。
また、Alamofire.requestAF.requestに変更され、スイッチのresponse.result値が.successおよび.failureになります。

AF.request("https://yourServiceURL.com", method: .get, parameters: [:], encoding: URLEncoding.default, headers: ["":""]).responseJSON { (response:DataResponse<Any>) in
        switch response.result {
        case let .success(value):
            print(value)
        case let .failure(error):
            print(error)
    }
}

Swift 3.x/4.x

Alamofire.request("https://yourServiceURL.com", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if let data = response.result.value{
                print(response.result.value)
            }
            break

        case .failure(_):
            print(response.result.error)
            break

        }
    }

parametersがタイプであることを確認してください

[String:Any]?

Getの場合

Alamofire.request("https://yourGetURL.com", method: .get, parameters: ["":""], encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if let data = response.result.value{
                print(response.result.value)
            }
            break

        case .failure(_):
            print(response.result.error)
            break

        }
    }

でも動作します

JSONEncoding.default 

ヘッダーの場合

ヘッダーを渡す場合は、タイプが[String:String]であることを確認してください

Parameter Encoding Linkを確認します https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#parameter-encoding-protocol

68

Swift 3.0およびxCode 8.0を使用したメソッドAlamofire 4.0のポスト

Alamofire.request(URL, method: .post, parameters: PARAMS)
                            .responseJSON { closureResponse in
                        if String(describing: closureResponse.result) == "SUCCESS"
                        { 
                           // Sucess code  
                        }
                        else
                        { 
                           // Failure Code 
                        }
                 }

私の解決策は、ヘッダーを使用している場合、そのタイプは[String:String]でなければなりません。

4
xevser

このエラーは、パラメーター値までです。 [String:String]でなければなりません

let url = URL(string: "http://yourURLhere")!

    let params: [String: String] = ["name": "oskarko", "email": "[email protected]", "sex": "male"]



    Alamofire.request(url, method: .post, parameters: params, encoding: URLEncoding.default, headers: nil).validate(statusCode: 200..<600).responseJSON() { response in

        switch response.result {
        case .success:

            var result = [String:String]()

            if let value = response.result.value {

                let json = JSON(value) 

            }

        case .failure(let error):
            print("RESPONSE ERROR: \(error)")

        }

    }
2
oskarko

あなたと同じ問題を解決しました。問題は、ヘッダーにAlamofireをインポートしたため、コールリクエストがあったときにAlamofireを削除するだけです。そのように:

request(.POST、patientIdUrl、パラメーター:nil、ヘッダー:nil、エンコード:.JSON)

それがあなたのお役に立てば幸いです。

1
Chi Minh Trinh

私はこれと同じに遭遇しました呼び出し中の余分な引数 'method'私のRL変数が範囲外でしたのエラー。

あなたの場合は、baseUrlnextPatientIdUrlの両方がAlamofire.request(patientIdUrl,..)メソッドを使用しているときにスコープ内にあることを確認してください。

これで問題が解決することを願っています。ありがとうございます!

1
onlinebaba

Alamofireからこのコードをコピーし、URLRequestを作成し、Alamofire.request(URLRequest)メソッドを使用して、このエラーを回避します

originalRequest = try URLRequest(url: url, method: method, headers: headers)
let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)
0
Arthur Liu

この問題を修正しました:

  1. パラメータの順序を変更します(URL、次にメソッドタイプ)。
  2. Encoding Enumを「JSONEncoding.default」などに変更します。

注意:Swift 3のAlamofireメソッドのシグネチャの変更

0
Ahmed Lotfy

注目に値する2つのこと。

  1. 値の前の最初のURLラベルを削除します。 Alamofire.request("https://yourServiceURL.com", method: .post,の代わりにAlamofire.request(url: "https://yourServiceURL.com", method: .post,を使用します。
  2. パラメーターのデータ型が[String: String]であることを確認してください。明示的に宣言します。
0
Jiang Xiang
func API()
{
    if Reachability.isConnectedToNetwork()
    {
        let headers = ["Vauthtoken":"Bearer \(apiToken)"]
        print(headers)
        //            let parameter = ["iLimit":"10","iOffset":"0","iThreadId":"1"]
        ApiUtillity.sharedInstance.showSVProgressHUD(text: "Loding...")
        Alamofire.request(ApiUtillity.sharedInstance.API(Join: "vehicle/CurrentVehicleLists"), method:.get, parameters:nil, headers: headers).responseJSON { response in
            switch response.result {
            case .success:
                print(response)
                ApiUtillity.sharedInstance.dismissSVProgressHUD()
                let dictVal = response.result.value
                let dictMain:NSDictionary = dictVal as! NSDictionary
                let statusCode = dictMain.value(forKey: "status") as! Int
                if(statusCode == 200)
                {

                }
                else if statusCode == 401
                {

                }
                else
                {

                }
            case .failure(let error):
                print(error)
                ApiUtillity.sharedInstance.dismissSVProgressHUD()
            }
        }
    } else
    {
        ApiUtillity.sharedInstance.dismissSVProgressHUD()
        ApiUtillity.sharedInstance.showErrorMessage(Title: "Internet Connection", SubTitle: "Internet connection Faild", ForNavigation: self.navigationController!)
    }
}
0

この方法でこの問題を修正しました。

parametersencoding、およびheadersだけの余分なパラメーターを削除します。これらのパラメーターがnilの場合、削除してこの方法で終了できます。

Alamofire.request(yourURLString, method: .post)
0

私にとってこれは機能しています。

GETリクエストの場合

Alamofire.request("http://jsonplaceholder.typicode.com/todos/1/get").responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if response.result.value != nil{
                print(response.result.value!)
            }
            break

        case .failure(_):
            print(response.result.error)
            break

        }

    }

POST用

let parameters = NSDictionary(object: "nara", forKey: "simha" as NSCopying)

    Alamofire.request("http://jsonplaceholder.typicode.com/posts", method: HTTPMethod.post, parameters: parameters as? Parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in


        switch(response.result) {
        case .success(_):
            if response.result.value != nil{
                print(response.result.value!)
            }
            break

        case .failure(_):
            print(response.result.error)
            break

        }
    }

ありがとう@ Rajan Maheswari

Alamofireファイルをローカルに追加した場合は、リクエストの前に「Alamofire」を使用しないでください

let apipath = “your api URL”    
    request(apipath, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { response in switch(response.result) {
            case .success(_):
                do {
                    let JSON = try JSONSerialization.jsonObject(with: response.data! as Data, options:JSONSerialization.ReadingOptions(rawValue: 0))

                    guard let JSONDictionary: NSDictionary = JSON as? NSDictionary else {
                        print("Not a Dictionary")
                        return
                    }

                    print("Post Response : \(JSONDictionary)")
                }
                catch let JSONError as NSError {
                    print("\(JSONError)")
                }
                break
            case .failure(_):
                print("failure Http: \(String(describing: response.result.error?.localizedDescription))")
                break
            }
    }
0
Pritesh