一键多值的Alamofire参数

Posted

技术标签:

【中文标题】一键多值的Alamofire参数【英文标题】:Alamofire parameter with multiple values in one Key 【发布时间】:2019-09-30 17:57:14 【问题描述】:

如何将参数作为alamofire参数发送给以下数据?

data : "username":"username","password":"password"

我想通过 alamofire 参数实现跟随,但我没有实现。

我正在做的是:

let parameter: Parameters = ["data": ["username": "\(textFieldUserName.text!)", "pass": "\(textFieldPassword.text!)"]]

Alamofire.request(loginUrl, method: .post, parameters: parameter,encoding: JSONEncoding.default, headers: nil).responseJSON response in

但它不起作用。

【问题讨论】:

您能否详细说明您的问题? @summerfinn3 我已经更新了问题。 您能分享一下您尝试过的方法以及您遇到的问题吗?这看起来像是一个非常标准的 alamofire 请求:这是他们的官方文档:github.com/Alamofire/Alamofire/blob/master/Documentation/… 【参考方案1】:

查看您正在使用的 api 后:该 api 期望数据值是字符串而不是对象。 你需要做这样的事情:但这可以重构得更干净,这只是为了解释发生了什么。

创建数据参数:

let data: Parameters = [
    "username": "\(textFieldUserName.text!)",
    "pass": "\(textFieldPassword.text!)"
]

然后将其转换为字符串:以下是将 json 转换为字符串的快速搜索,但您需要仔细检查,因为我接受了第一个答案。

let string = stringify(json: data, prettyPrinted: false)

let parameters: Parameters = [
    "data": string
]

并在请求中将编码设置为:encoding: URLEncoding.default

Alamofire.request(
        loginURL,
        method: .post,
        parameters: parameters,
        encoding: URLEncoding.default,
        headers: nil).responseJSON  (responseData) -> Void in
            if responseData.result.value != nil 
                //do something with data
    


func stringify(json: Any, prettyPrinted: Bool = false) -> String 
    var options: JSONSerialization.WritingOptions = []
    if prettyPrinted 
        options = JSONSerialization.WritingOptions.prettyPrinted
    

    do 
      let data = try JSONSerialization.data(withJSONObject: json, options: options)
      if let string = String(data: data, encoding: String.Encoding.utf8) 
          return string
      
     catch 
          print(error)
    
    return ""

我也会尽量避免强制展开 textfield.text 属性,除非您事先在其他地方验证它们的值 由于 api 调用是 http,您还需要在 info.plist 中启用它:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

【讨论】:

但这里data 是关键。我没看懂这个花括号。 我做了同样的事情:let parameter: Parameters = ["data": ["username": "\(textFieldUserName.text!)", "pass": "\(textFieldPassword.text!)"]],但我没有带来这些形式的数据。它与正文一起发送,我不知道如何实现。 我做到了,虽然它没有显示邮递员显示的结果。

以上是关于一键多值的Alamofire参数的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 自定义参数编码

如何在 Alamofire 中将原始数据作为参数发布?

alamofire 抱怨参数类型

Alamofire 多参数字典

通话中的 Alamofire 额外参数“方法”

alamofire-传递 json 字符串作为参数