如何使用 ktor 解析 HTTP 标头

Posted

技术标签:

【中文标题】如何使用 ktor 解析 HTTP 标头【英文标题】:How can I parse HTTP headers using ktor 【发布时间】: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 中没有解析链接头字段的功能。你能描述一下你的用例吗? 更新了用例详情 【参考方案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 调用,但可以正常工作。

【讨论】:

以上是关于如何使用 ktor 解析 HTTP 标头的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ktor 内部重定向?

ktor cors 标头中的 Access-Control-Allow-Origin 问题

Ktor websockets 身份验证

如何使用 ktor 上传单个位图图像?

响应 Ktor 中图像的缓存标头

如何在 ktor-client 中禁用重定向