Alamofire Swift 3.0:调用中的额外参数

54

我已将我的项目迁移到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)

有人能告诉我为什么吗?


1
错误信息显示,您正在向请求方法传递过多的参数。帮助自己最简单的方法是在文档中查找实际签名。 - vadian
当然我已经检查了签名,而且是正确的。问题就在这里。似乎 Xcode 8 报告了一个无效错误。 - Agreensh
然后重新输入方法以获取具有代码完成的实际语法。我怀疑第二个参数需要一个标签。 - vadian
是的,它是URL(第二个)参数。 - Agreensh
是的,URL 是有效的,但这是一个编译时错误。 - Agreensh
显示剩余5条评论
14个回答

78
根据Alamofire 4.0.0版本的文档,使用HTTP方法进行URL请求应该按以下方式进行:

根据Alamofire的文档,使用HTTP方法进行URL请求应遵循以下步骤:

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
}

希望这能帮到你!


8
它是否有效?我在使用它时仍然收到“调用中多余的参数”错误。 Alamofire.request(url, method: .post, parameters: nil, headers: nil, encoding: JSONEncoding.default) - Rajan Maheshwari
没有编码参数也可以正常工作,我使用的方式如下:Alamofire.request(url, method: .post, parameters: dict, headers: header) - Abdullah Md. Zubair
这个可以工作:Alamofire.request("http//yourserviceURL.com", method: .post, parameters: parameters, headers: nil).responseJSON { (response:DataResponse) in switch(response.result) { case .success(_): if let data = response.result.value{ print(response.result.value) } break case .failure(_): print(response.result.error) break } } - Rajan Maheshwari
1
@Abdullah Md.Zubair,@Rajan Maheshwari 我尝试使用你们上面的答案,但仍然遇到了调用中的额外参数问题。我的代码是:func POST(url _url: String, params: [String : AnyObject]) -> Future<JSON, NSError> {let request = Alamofire.request(.POST, self.buildAppUrl, method: .post, parameters: params, encoding: JSONEncoding.JSON, headers: self.requestHeaders())}。谢谢。 - Vinathy nvr
1
Alamofire.request("", method: .post, parameters: [:], encoding: JSONEncoding.default, headers: [:]) .responseJSON { response in }这在我的端上可以运行,确保你从你的方法中获取到了正确的值,例如self.buildAppUrl、params和self.requestHeaders()。 - Abdullah Md. Zubair
显示剩余8条评论

72

这个对我有用。
不需要删除编码参数。

针对 Swift 5.x 的更新

Alamofire 使用了在Swift 5中引入的Result类型。此外,Alamofire.request已更改为AF.request,它现在将使用.success.failure来读取它们的switchresponse.result值。

AF.request("https://yourServiceURL.com", method: .get, parameters: [:], encoding: URLEncoding.default, headers: ["":""]).responseJSON { (response) 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

        }
    }

确保参数的类型正确

[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]

请参阅参数编码链接 https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#parameter-encoding-protocol


2
@Error404 编码取决于服务器端API的类型。如果它不接受原始格式的post参数,则必须使用URLEncoding.default。如果它接受原始格式的post参数,则必须选择JSONEncoding.default。 在GET中,你不需要任何一个。 如果它接受表单数据多部分形式的参数,则必须使用alamofire的multipart特性。 - Rajan Maheshwari
1
@RajanMaheshwari 抱歉,我的意思是参数的顺序(用于 Alamofire.request 调用)。必须与您所做的完全相同。 - ricardokrieg
@RajanMaheshwari 我正在使用最新的Swift和Alamofire,如果你有时间,能否看一下:http://stackoverflow.com/questions/41484477/nsmutableurlrequest-in-router-class-swift-3 - user2363025
这个答案解释得非常完美。此外,在Alamofire.request方法下列参数的顺序非常关键。例如(URL,methods,parameters,encoding,headers)。任何对这个顺序的更改都会导致错误。 - SeaWarrior404
1
你是对的,headers 应该是 [String:String]。感谢你的帮助。 - 无夜之星辰
显示剩余10条评论

5

使用Swift 3.0和xCode 8.0,采用Alamofire 4.0进行Post请求

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

4

我的解决方案是,如果您正在使用标题,则其类型必须为[String:String]。


2

这个错误与参数值有关,它必须是 [String: String] 类型。

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

    let params: [String: String] = ["name": "oskarko", "email": "youremail@here.com", "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)")

        }

    }

1
我刚刚解决了与你相同的问题。问题在于我已经在头部导入了Alamofire,所以当调用请求时,我只需删除Alamofire即可。像这样:

request(.POST, patientIdUrl, parameters: nil, headers: nil, encoding: .JSON)

我希望它能对你有所帮助。

1
我遇到了同样的问题:“调用中存在额外参数'method'”,当我的“URL变量超出作用域”时。
在您的情况下,请确保在使用“Alamofire.request(patientIdUrl,..)”方法时,baseUrlnextPatientIdUrl都处于作用域内。
希望这能解决您的问题。谢谢!

1
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

我通过以下方式解决了这个问题:

  1. 重新排列参数(先是URL,然后是方法类型)。
  2. 将编码枚举更改为“JSONEncoding.default”。

请注意:Alamofire在Swift 3中的方法签名已更改。


0

有两件事值得注意。

  1. 在它的值之前删除第一个URL标签。使用 Alamofire.request("https://yourServiceURL.com", method: .post, 而不是 Alamofire.request(url: "https://yourServiceURL.com", method: .post,
  2. 确保参数的数据类型为[String:String]。显式声明它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接