Alamofire Swift 3.0 调用中的额外参数

Posted

技术标签:

【中文标题】Alamofire Swift 3.0 调用中的额外参数【英文标题】:Alamofire Swift 3.0 Extra argument in call 【发布时间】:2016-09-14 12:46:52 【问题描述】:

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

谁能告诉我为什么?

【问题讨论】:

错误信息说,你向请求方法传递了太多参数。帮助自己的最简单方法是在文档中查找实际签名。 当然我已经检查了签名 - 这是正确的。那就是问题所在。似乎是 Xcode 8 报告了一个无效错误。 然后重新键入方法以获取带有代码完成的实际语法。我怀疑第二个参数需要一个标签。 无论有无标签,它都会给出完全相同的错误。 Xcode 是否在该行显示一个小三角形 (^) 来告诉您哪个参数导致了错误? 【参考方案1】:

根据Alamofire 使用 HTTP 方法的版本 4.0.0 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

希望这会有所帮助!

【讨论】:

有效吗?在使用这个Alamofire.request(url, method: .post, parameters: nil, headers: nil, encoding: JSONEncoding.default)时,我仍然在调用中遇到额外参数的错误 你的意思是Alamofire.request(url!, method: .post, parameters: parameters, encoding: nil, headers: nil)还是这个Alamofire.request(url!, method: .post, parameters: parameters, headers: nil)还有错误。甚至这一行也显示相同的错误Alamofire.request(url!, method: .post, parameters: nil, headers: nil, encoding: JSONEncoding.default) 您使用的是 Alamofire 4.0.0 版吗?您可以从 url 中删除可选符号 (!) 吗? @Abdullah Md.Zubair,@Rajan Maheshwari 我用你上面的答案试过了,我的代码是 func POST(url _url: String, params: [String : AnyObject]) -> Future let request = Alamofire.request(.POST, self.buildAppUrl, method: .post, parameters: params, encoding: JSONEncoding.JSON, headers: self.requestHeaders()).Thanks Alamofire.request("", method: .post, parameters: [:], encoding: JSONEncoding.default, headers: [:]) .responseJSON response in 这对我有用,确保从 self.buildAppUrl、params 和 self.requestHeaders() 等方法中获得正确的值【参考方案2】:

这个对我有用。 无需移除encoding参数

Swift 5.x 更新

Alamofire 使用 Swift 5 中引入的 Result 类型。此外,Alamofire.request 已更改为 AF.request,现在将使用 .success 读取其开关 response.result 值和.failure

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

如果获取

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

【讨论】:

@jimijon 和帖子一样。检查我更新的答案并尝试任何获取 URL。将参数留空为["":""] 好的,只是错误中的“红鲱鱼”。如果任何其他参数,headers et 是错误的,那么它会给出这个奇怪的错误。 @Error404 编码取决于服务器端的 API 类型。如果它接受的 post 参数不是原始形式,那么您必须使用 URLEncoding.default。如果它接受原始形式的 post 参数,那么你必须选择 JSONEncoding.defaultGET 你不需要它们中的任何一个。如果它接受参数作为表单数据多部分表单,那么您必须使用 alamofire 的multipart 功能 @RajanMaheshwari 抱歉,我的意思是参数的顺序(用于 Alamofire.request 调用)。一定和你做的一模一样。 你是对的,标题应该是 [String:String]。谢谢你的帮助。【参考方案3】:

使用 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 
                        
                 

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

此错误取决于参数值。它必须是 [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)")

        

    

【讨论】:

【参考方案6】:

我刚刚解决了和你一样的问题。问题是我在标题中导入了 Alamofire,所以我只是在调用请求时删除了 Alamofire。像这样:

request(.POST, patientIdUrl, 参数: nil, headers: nil, 编码: .JSON)

希望对你有帮助。

【讨论】:

【参考方案7】:

当我的URL 变量超出范围 时,我遇到了同样的Extra argument 'method' in call 错误。

在您的情况下,请确保 baseUrlnextPatientIdUrl 在使用 Alamofire.request(patientIdUrl,..) 方法时都在范围内。

希望这可以解决您的问题。谢谢你!

【讨论】:

【参考方案8】:
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!)
    

【讨论】:

【参考方案9】:

对我来说这是有效的。

对于 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

        

    

发帖

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

【讨论】:

【参考方案10】:

我解决了这个问题:

    重新排序参数(网址然后方法类型)。 例如将 Encoding Enum 更改为“JSONEncoding.default”。

注意:Swift 3 中的 Alamofire 方法签名更改

【讨论】:

【参考方案11】:

我发现有两件事值得注意。

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

【讨论】:

【参考方案12】:

我从 Alamofire 复制此代码,创建一个 URLRequest 并使用 Alamofire.request(URLRequest) 方法,避免此错误

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

【讨论】:

【参考方案13】:

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

去掉多余的参数就行了,只去掉parametersencodingheaders,如果这些参数都是nil你可以去掉然后这样离开,

Alamofire.request(yourURLString, method: .post)

【讨论】:

【参考方案14】:

如果你已经在本地添加了 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
            
    

【讨论】:

以上是关于Alamofire Swift 3.0 调用中的额外参数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用参数 swift 3.0 Alamofire 4.0 调用邮政服务?

在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作

使用 Alamofire 的 swift 3.0 中的 URL 问题

Swift 2.0 + Alamofire 3.0 - 缓慢加载 JSON

Alamofire 自定义响应从 Alamofire v1.3 迁移到 3.0(和 Swift 2 语法)

POST 请求 Swift 3.0 Alamofire