.request调用中的额外参数 - Alamofire + Swift

时间:2018-03-17 01:26:49

标签: ios swift alamofire

我正在尝试使用Alamofire 4和Swift 4进行.request()调用。这是我正在使用的代码:

static func getPlaceData(url: String, parameters: [String: String]) {
    Alamofire.request(url, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { (response) in
        if response.result.isSuccess {
            let json: JSON = JSON(response.result.value!)
            print(json)
        } else {
            print("error")
        }
    }
}

其中headers是:

let headers: HTTPHeaders = [
        "Authorization": "Bearer /*PRIVATE KEY*/"
]

我收到以下错误: 调用中的额外参数'方法',位于Alamofire.request(...行。

我已经阅读了很多关于类似问题的SO帖子,但他们的解决方案都没有解决我的问题:

我也读过this documentation guidethis issues thread on GitHub,但都没有解决问题。

.request()调用所需parametersheaders的正确语法是什么?

该代码用于使用Yelp Fusion API从Swift代码进行经过身份验证的调用 - 也许有人可以建议比Alamofire更好的方法?

2 个答案:

答案 0 :(得分:2)

我查看了文件,发现了两件事

  1. 请求方法签名

     public func request(
        _ url: URLConvertible,
        method: HTTPMethod = .get,
        parameters: Parameters? = nil,
        encoding: ParameterEncoding = URLEncoding.default,
        headers: HTTPHeaders? = nil)
        -> DataRequest
    
  2. Link to the documentation

    1. Parameter typeAlias是[String:Any]的一种类型,当您传递[String:String]时会发生冲突。
    2. Link to the Parameter Definition in the DOC

      所以你需要做的就是改变签名而且你很好。

答案 1 :(得分:0)

我想出了这个问题,不用多于任何文档或GitHub线程。

上面代码片段中的逻辑(来自问题)引用了一个名为headers的常量,该常量在getPlaceData(url:parameters:)之外声明。这是因为为了访问Yelp Fusion API,您需要在发送的HTTP标题中包含一个额外字段,以使用here提到的格式包含私有API密钥。

我在headers内部移动了getPlaceData(url:parameters:)数据结构并修复了问题,因此我的结果函数如下:

static func getPlaceData(url: String, parameters: [String: String]) {
  let headers: HTTPHeaders = [
    "Authorization": "Bearer /*PRIVATE KEY*/"
  ]

  Alamofire.request(url, method: .get, parameters: parameters, encoding: 
  JSONEncoding.default, headers: headers).responseJSON { (response) in
    if response.result.isSuccess {
      let json: JSON = JSON(response.result.value!)
      print(json)
    } else {
      print("error")
    }
  }
}

不确定为什么这会解决问题,但代码现在可以正常工作。