【问题标题】:Alamofire Swift 3.0 Extra argument in callAlamofire Swift 3.0 调用中的额外参数
【发布时间】:2017-01-22 06:48:07
【问题描述】:

我已将我的项目迁移到 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 是否在该行显示一个小三角形 (^) 来告诉您哪个参数导致了错误?

标签: alamofire swift3


【解决方案1】:

这个对我有用。
无需移除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]。谢谢你的帮助。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    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!)
        }
    }
    

    【讨论】:

      【解决方案4】:

      我这样解决了这个问题:

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

      Alamofire.request(yourURLString, method: .post)
      

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

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

                希望对你有帮助。

                【讨论】:

                  【解决方案10】:

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

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

                  【讨论】:

                    【解决方案11】:

                    根据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() 等方法中获得正确的值
                    【解决方案12】:

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

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

                    【讨论】:

                      【解决方案13】:

                      我解决了这个问题:

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

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

                      【讨论】:

                        【解决方案14】:

                        对我来说,这是有效的。

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

                        【讨论】:

                          猜你喜欢
                          • 2017-06-26
                          • 2023-03-21
                          • 2018-08-26
                          • 1970-01-01
                          • 2019-02-23
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多