如何使用 ktor 解析 HTTP headers

How can I parse HTTP headers using ktor

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

response.headers.getAll("Link")

这是一个字符串列表,我想得到一个

类型的值
List<LinkHeader>

更新:

我的use-case详情:

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

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 中没有这样的功能,我创建了这个 feature request 来解决您的问题。作为解决方法,您可以针对特定情况使用正则表达式来解析 headers' 值:

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)
}

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