【问题标题】:Swift 3: How to add or remove parameters in Request Body in ALamofire 4?Swift 3:如何在 ALamofire 4 的请求正文中添加或删除参数?
【发布时间】:2018-06-15 06:56:17
【问题描述】:

我正在使用 Alamofire 库进行 REST API 调用。我有一个
Dictionary(String, Any) 类型的请求正文。请求正文中很少有对象是某些 API 通用的。

例如:第一个 API 调用在请求正文中包含以下参数。

var hotel = HotelParameter()
var food = foodParameter()
var address = addressParameter()

class RequestParameters: NSObject{

func parameter() -> NSDictionary {

   var parameter : [String : Any] = [:]
   parameter["hotels"] = hotel.params()
   parameter["foodType"] = food.params()
   parameter["address"] = address.params()

   return parameter as! NSDictionary
}

现在,在第二次 API 调用中,我只需要在 RequestParameter 中传递“hotels”和“address”。 我的问题是:如何在 Alamofire 请求正文中添加或删除任何额外参数?

由于我无法为“n”个请求添加请求正文,因此必须有一个 RequestParameter 将根据 api 调用进行修改。 Body 中可以有额外的或单个的 Parameter(s)。 大多数情况下,“hotels”将是所有请求正文的通用参数。

我已经尝试了很多来解决这个问题,但是我得到了异常,因为它无法解析一些 JSON 响应。 我创建了函数来调用 api 调用,并且我正在传递这样的参数。

var requestParam = RequestParamters()

Alamofire.request(url,
                      method: .post,
                      parameters: requestParam.parameter(),
                      encoding: JSONEncoding.default, headers: headers)
        .responseJSON(completionHandler: { (data : DataResponse<Any>) in

【问题讨论】:

  • 我不建议在 Swift 3+ 中使用 NSDictionary,但更多的 Dictionary(Swift 版本)。也许您还想做requestParam.parameters(withKeys:["hotel", "address"]),它只返回带有这些键和相应值的参数,或者如果您的 API 调用有“名称”,requestParam.parameters(name:"APICallName1") 等。
  • requestParam.parameters(withKeys:["hotel", "address"]).. 抱歉没有找到你
  • 创建一个额外的方法,返回带有所需键/值的字典

标签: ios swift parameters httprequest alamofire


【解决方案1】:

我不确定,我的要求是正确的。但是根据我的理解,你必须多次点击一个API,并且每次参数都应该不同。所以只需编写一个将参数作为方法参数的方法。这是根据您的要求的示例代码。

func getAllHotels(_ params:Dictionary, callback:@escaping (Dictionary<String, Any>, Error?)->Void)
{
     let parameters: Parameters = params

    Alamofire.request(baseUrl + "/getHotels", method: .post,parameters: parameters, encoding: URLEncoding.default).responseJSON    { response in
        debugPrint("All Response from API: \(response)")
        switch response.result
        {
        case .success(let value):
            callback(value as! Dictionary, nil)
        case .failure(let error):
            callback([:], error)
        }
    }
}

/** Now call the above method with your required parameters **/

【讨论】:

    【解决方案2】:

    我发现了两种方法。

    1. 创建一个 addExtraParams :[String : Any] = : 字典类型并在其中添加您需要的 key : value 对。

    2. 为各个 API 创建请求函数,并使用您在记录后获得的 object 更新所需参数的值。

    例如:

    var user = response.object as! Person
    var request = RequestParameters()
    request.hotel.name = user.hotel_name
    

    在您创建的函数中更新 Alamofire 请求之前的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      相关资源
      最近更新 更多