github API在http链接头中发送json结果的分页数据:
Link: <https://api.github.com/repos?page=3&per_page=100>; rel="next",
<https://api.github.com/repos?page=50&per_page=100>; rel="last"
因为github API不是唯一使用此方法的API(我认为)我想问一下是否有人有一个有用的小片段来解析链接头(例如将其转换为数组)以便我可以使用它适用于我的js app。
我搜索了一下,但发现没有什么有关如何从json API解析分页
答案 0 :(得分:14)
PageLinks中有GitHub Java API个班,其中显示了如何解析Link
标题。
答案 1 :(得分:13)
The parse-link-header NPM module; its source can be found on github根据麻省理工学院的许可证(免费用于商业用途)。
安装非常简单:
npm install parse-link-header
用法如下所示:
var parse = require('parse-link-header');
var parsed = parse('<https://api.github.com/repos?page=3&per_page=100>; rel="next", <https://api.github.com/repos?page=50&per_page=100>; rel="last"')
...之后有parsed.next
,parsed.last
等:
{ next:
{ page: '3',
per_page: '100',
rel: 'next',
url: 'https://api.github.com/repos?page=3&per_page=100' },
last:
{ page: '50',
per_page: '100',
rel: 'last',
url: ' https://api.github.com/repos?page=50&per_page=100' } }
答案 2 :(得分:6)
我在github上找到了wombleton/link-headers。它似乎是为浏览器而制作的,而不是作为npm模块,但似乎不难修改它以在服务器端环境中工作。它使用pegjs生成一个真正的RFC 5988解析器而不是字符串拆分,因此它应该适用于任何链接头,而不仅仅是Github。
答案 3 :(得分:5)
我发现这个Gist:
在JavaScript中解析Github
Links
标头
在Github API上测试它并返回如下对象:
var results = {
last: "https://api.github.com/repositories/123456/issues?access_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&state=open&since=2013-07-24T02%3A12%3A30.309Z&direction=asc&page=4"
next: "https://api.github.com/repositories/123456/issues?access_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&state=open&since=2013-07-24T02%3A12%3A30.309Z&direction=asc&page=2"
};
答案 4 :(得分:2)
如果你可以使用Python并且不想实现full specification,但需要有一些适用于Github API的东西,那么我们在这里:
import re
header_link = '<https://api.github.com/repos?page=3&per_page=100>; rel="next", <https://api.github.com/repos?page=50&per_page=100>; rel="last"'
if re.search(r'; rel="next"', header_link):
print re.sub(r'.*<(.*)>; rel="next".*', r'\1', header_link)
答案 5 :(得分:1)
我完全理解这是“技术上”<div data-toggle="tooltip" title="" data-original-title="Add" style=" display inline-block;">
<a class="btn btn-primary" data-toggle="modal" data-target="#myModal" onclick="setSelectedRoleId(6)">
<span class="fa fa-plus"></span>
</a>
</div>
线程。但是,如果你像我一样,通过谷歌来到这里 “如何解析链接标题” 我以为我会分享我的解决方案(C#)
JavaScript
使用GitHub的示例链接标题在控制台应用程序中进行测试:
public class LinkHeader
{
public string FirstLink { get; set; }
public string PrevLink { get; set; }
public string NextLink { get; set; }
public string LastLink { get; set;}
public static LinkHeader FromHeader(string linkHeader)
{
LinkHeader linkHeader = null;
if (!string.IsNullOrWhiteSpace(linkHeader))
{
string[] linkStrings = linkHeader.Split("\",");
if (linkStrings != null && linkStrings.Any())
{
linkHeader = new LinkHeader();
foreach (string linkString in linkStrings)
{
var relMatch = Regex.Match(linkString, "(?<=rel=\").+?(?=\")", RegexOptions.IgnoreCase);
var linkMatch = Regex.Match(linkString, "(?<=<).+?(?=>)", RegexOptions.IgnoreCase);
if (relMatch.Success && linkMatch.Success)
{
string rel = relMatch.Value.ToUpper();
string link = linkMatch.Value;
switch (rel)
{
case "FIRST":
linkHeader.FirstLink = link;
break;
case "PREV":
linkHeader.PrevLink = link;
break;
case "NEXT":
linkHeader.NextLink = link;
break;
case "LAST":
linkHeader.LastLink = link;
break;
}
}
}
}
}
return linkHeader;
}
}
答案 6 :(得分:1)
这是一个简单的javascript函数,它以漂亮的对象表示法从链接中提取有用的信息。
var linkParser = (linkHeader) => {
let re = /<([^\?]+\?[a-z]+=([\d]+))>;[\s]*rel="([a-z]+)"/g;
let arrRes = [];
let obj = {};
while ((arrRes = re.exec(linkHeader)) !== null) {
obj[arrRes[3]] = {
url: arrRes[1],
page: arrRes[2]
};
}
return obj;
}
它将输出结果,例如==>
{
"next": {
"url": "https://api.github.com/user/9919/repos?page=2",
"page": "2"
},
"last": {
"url": "https://api.github.com/user/9919/repos?page=10",
"page": "10"
}
}
答案 7 :(得分:0)
这是一个带有curl和sed的简单bash脚本,可通过长时间查询获取所有页面
url="https://api.github.com/repos/$GIT_USER/$GIT_REPO/issues"
while [ "$url" ]; do
echo "$url" >&2
curl -Ss -n "$url"
url="$(curl -Ss -I -n "$url" | sed -n -E 's/Link:.*<(.*?)>; rel="next".*/\1/p')"
done > issues.json
答案 8 :(得分:0)
这是一个Python解决方案,可让任何github存储库的贡献者计数。
import requests
from urllib.parse import parse_qs
rsp = requests.head('https://api.github.com/repos/fabric8-analytics/fabric8-analytics-server/contributors?per_page=1')
contributors_count = parse_qs(rsp.links['last']['url'])['page'][0]
答案 9 :(得分:0)
这是一个简单的代码,可以使用Java Script解析来自GitHub的链接标头
var parse = require('parse-link-header');
var parsed = parse(res.headers.link);
no_of_pages = parsed.last.page;
答案 10 :(得分:0)
对于那些最终在Java中搜索链接头解析器的人,可以使用javax.ws.rs.core.Link
。请参考以下示例:
import javax.ws.rs.core.Link
String linkHeaderValue = "<https://api.github.com/repos?page=3&per_page=100>; rel='next'";
Link link = Link.valueOf(linkHeaderValue);
答案 11 :(得分:0)
这是一个用于此目的的 Java 函数,您可以找到提供的参数键和参数值的链接。 请注意:这是我出于个人目的制作的东西,对于您的场景可能不是万无一失的,因此请对其进行检查并进行相应的更改
https://github.com/akshaysom/LinkExtract/blob/main/LinkExtract.java
public static String getLinkFromLinkHeaderByParamAndValue(String header, String param, String value) {
if (header != null && param != null && value != null && !"".equals(header.trim()) && !"".equals(param.trim())
&& !"".equals(value)) {
String[] links = header.split(",");
LINKS_LOOP: for (String link : links) {
String[] segments = link.split(";");
if (segments != null) {
String segmentLink = "";
SEGMENT_LOOP: for (String segment : segments) {
segment = segment.trim();
if (segment.startsWith("<") && segment.endsWith(">")) {
segmentLink = segment.substring(1, segment.length() - 1);
continue SEGMENT_LOOP;
} else {
if (segment.split("=").length > 1) {
String currentSegmentParam = segment.split("=")[0].trim();
String currentSegmentValue = segment.split("=")[1].trim();
if (param.equals(currentSegmentParam) && value.equals(currentSegmentValue)) {
return segmentLink;
}
}
}
}
}
}
}
return null;
}