【问题标题】:How to send Http Form with parameters by ktor-client如何通过 ktor-client 发送带参数的 Http Form
【发布时间】:2019-10-12 04:17:28
【问题描述】:

我在 ktor-client 文档和示例中几乎无处不在,他们使用空的 formData 来展示客户端的工作方式

formParameters: Parameters = Parameters.Empty

那么 kotlin/ktor 用参数填充它的方式是什么?

【问题讨论】:

    标签: kotlin httpclient ktor


    【解决方案1】:

    Ktor 使用这种方式来填充参数:

    client.submitForm<HttpResponse>(
            url = "https://foo.com/login",
            formParameters = Parameters.build {
                append("_username", username)
                append("_password", password)
            })
    

    【讨论】:

    • 这是唯一有效的方法。 append 由于某种原因被标记为内部,但关于这个问题的其他建议要么最终发送零字节形式(!!)或附加 url 参数。
    【解决方案2】:

    或者,您也可以使用formData 简单地传递表单数据,例如:

    client.post<HttpResponse>("https://example.com/login") {
        formData {
            parameter("username", username)
            parameter("password", password)
        }
    }
    

    【讨论】:

    • 这不会发送任何表单数据,而是在 url 中编码参数。它将向带有参数的 URL 发布一个零字节的表单。
    【解决方案3】:

    我找到了至少三种发布 www-urlencoded 表单的方法:

    return httpClient.submitForm("url") {
        parameter("key", "value")
    }
    
    return httpClient.post("url") {
        FormDataContent(Parameters.build {
            parameter("key", "value")
        })
    }
    
    return httpClient.post("url") {
        formData {
            parameter("key", "value")
        }
    }
    

    append() 方法被标记为内部方法,不适用于 ktor 1.6.4

    【讨论】:

    • 不幸的是,参数只是将内容编码到 url 而不是表单有效负载中。它是 HttpRequestBuilder 上添加 url 参数的扩展函数。总是。对于发布多部分表单毫无用处。
    • 我同意。但是一些网络服务器支持这两种变体。例如,我使用这种方法发布到 Google 表单,它适用于 URL 中的空正文和编码值。
    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多