如何使用 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 标头的主要内容,如果未能解决你的问题,请参考以下文章