如何使用 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 调用,但有效。
我正在使用 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 调用,但有效。