【问题标题】:How can I parse HTTP headers using ktor如何使用 ktor 解析 HTTP 标头
【发布时间】:2021-07-16 02:35:46
【问题描述】:

我正在使用 ktor 1.5.3 HTTP 客户端,想知道如何将 HTTP 响应标头反序列化为 LinkHeader 值列表。我的代码中有以下值:

response.headers.getAll("Link")

这是一个字符串列表,我想得到一个类型的值

List<LinkHeader>

更新:

我的用例的详细信息:

我有一个使用以下响应标头来管理分页的后端:

Link: <https://hostname/v2/issues?orderBy=updated&orderAsc=false&perPage=15>; rel="first"
Link: <https://hostname/v2/issues?orderBy=updated&orderAsc=false&page=2&perPage=15>; rel="prev"
Link: <https://hostname/v2/issues?orderBy=updated&orderAsc=false&page=4&perPage=15>; rel="next"
Link: <https://hostname/v2/issues?orderBy=updated&orderAsc=false&page=116922&perPage=15>; rel="last"

我只需要解析它们以了解最后一页在哪里

【问题讨论】:

  • Ktor 中没有解析链接头字段的功能。你能描述一下你的用例吗?
  • 更新了用例详情

标签: ktor


【解决方案1】:

由于 Ktor 目前没有这样的功能,我创建了这个 feature request 来解决您的问题。作为一种解决方法,您可以针对特定情况使用正则表达式来解析标头的值:

data class Link(val url: Url, val rel: String)

fun parse(value: String): Link {
    val matches = Regex("""<(.+?)>;\s*rel="(.+?)"""").matchEntire(value) ?: throw Exception("Cannot parse Link header value $value")
    val (_, urlString, rel) = (matches.groupValues)
    return Link(URLBuilder(urlString).build(), rel)
}

【讨论】:

  • 谢谢!我刚刚在 SO question 中发现了另一个用例,已添加到您的工单中
【解决方案2】:

由于 Ktor 没有准确的解决方案,我已经从 this article 实施了一个解决方法。同样的 do-while 循环也适用于我的情况。它对空的最后一页进行了冗余 API 调用,但可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 2021-02-08
    • 2016-07-19
    • 2022-07-06
    • 2011-06-08
    • 1970-01-01
    • 2010-12-28
    • 2010-11-23
    相关资源
    最近更新 更多