【问题标题】:How to add Alamofire URL parameters如何添加 Alamofire URL 参数
【发布时间】:2017-09-03 02:00:41
【问题描述】:

我有一个使用 Postman 传入 URL 参数的工作场景。现在,当我尝试在 Swift 中通过 Alamofire 进行操作时,它不起作用。

您将如何在 Alamofire 中创建此网址? http://localhost:8080/?test=123

    _url = "http://localhost:8080/"
    let parameters: Parameters = [
        "test": "123"
        ]

    Alamofire.request(_url,
                      method: .post,
                      parameters: parameters,
                      encoding: URLEncoding.default,
                      headers: headers

【问题讨论】:

    标签: swift alamofire


    【解决方案1】:

    问题是您使用的是URLEncoding.default。 Alamofire 对 URLEncoding.default 的解释不同,具体取决于您使用的 HTTP method

    对于GETHEADDELETE 请求,URLEncoding.default 将参数编码为查询字符串并将其添加到 URL,但对于任何其他方法(例如 POST),参数获取编码为查询字符串并作为 HTTP 请求的正文发送。

    要在POST 请求中使用查询字符串,您需要将encoding 参数更改为URLEncoding(destination: .queryString)

    你可以看到更多关于Alamofire如何处理请求参数here的细节。

    您的代码应如下所示:

       _url = "http://localhost:8080/"
        let parameters: Parameters = [
            "test": "123"
            ]
    
        Alamofire.request(_url,
                          method: .post,
                          parameters: parameters,
                          encoding: URLEncoding(destination: .queryString),
                          headers: headers)
    

    【讨论】:

    • 非常感谢 OP 和这个答案。我已经连续调试了 3 个小时的代码!我一直在想f出了什么问题!!!我总是得到状态 500,正在考虑与我的后端开发人员交谈。好在我想到将参数传递给URL只是为了测试,然后我意识到Alamofire在编码为JSONEnconding.default时不接受参数。
    • 非常感谢您。我一直在为为什么我的帖子请求不起作用而苦苦挣扎。欣赏你!!
    • 在我的参数中,我有时间在“2019-08-09T05:30:00”的日期字符串中。当传递这个参数并使用 URLEncoding(destination: .queryString),我的日期参数更改为 2019-08-19T05%3A30%3A00。上述方法是最接近创建正确 url 的方法,但 date 参数除外。请帮忙。
    • 这样一个很好的答案...我对 alamofire 不是很熟悉,并且不知道为什么在收到 400 错误请求错误时从服务中收到 Ino 响应...谢谢您的精彩解释还有……
    【解决方案2】:

    如果您希望在查询字符串中使用您的参数,请使用 .queryString 作为 URLEncoding,如下所示: (我假设你在某处有标题)

    let _url = "http://localhost:8080/"
    let parameters: Parameters = [
        "test": "123"
        ]
    
    Alamofire.request(_url,
            method: .post,
            parameters: parameters,
            encoding: URLEncoding.queryString,
            headers: headers)
    

    这种形式是 Alamofire 作者建议的,因为它更符合另一个,见截图:

    见原文here

    【讨论】:

    • 我相信这就是它在 Swift 2 中的工作方式,但它在 Swift 3 中进行了更改,添加了 JSONEncodingCustomEncoding
    • 这是使用 Swift 3 的最新 Alamofire 版本。来源:github.com/Alamofire/Alamofire#url-encoding
    • "Destination 枚举有三种情况: ....queryString - 将编码的查询字符串结果设置或附加到现有的查询字符串。..." 如您所见,.queryString 是一个@ 987654331@ 值,而不是 encoding 值。编码的形式为URLEncoding(destination:)JSONEncoding(destination:) 或其他类似类型。
    • 这里可以看到库示例中的用法,就是URLEncoding.querystring:github.com/Alamofire/Alamofire/blob/…
    • 我编辑了答案以添加 Alamofire 作者建议的相关信息,我不太确定您现在分配给我的反对票
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2023-03-08
    • 2012-01-23
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多