tox*_*abs 26 javascript json jsonp github github-api
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"
Run Code Online (Sandbox Code Playgroud)
因为github API不是唯一使用这种方法的API(我认为)我想问一下是否有人有一个有用的小片段来解析链接头(并将其转换为数组),以便我可以将它用于我的js app.
我搜索了一下,但没有发现如何从json API解析分页
Kev*_*cki 15
GitHub Java API中有一个PageLinks类,它显示了如何解析标头.Link
Cos*_*min 14
为此目的存在parse-link-header NPM模块 ; 它的来源可以在麻省理工学院许可下在github上找到(免费用于商业用途).
安装非常简单:
npm install parse-link-header
Run Code Online (Sandbox Code Playgroud)
用法如下所示:
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"')
Run Code Online (Sandbox Code Playgroud)
......之后,一个有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' } }
Run Code Online (Sandbox Code Playgroud)
我在github上找到了wombleton/link-headers.它似乎是为浏览器而制作的,而不是作为npm模块,但似乎不难修改它以在服务器端环境中工作.它使用pegjs生成一个真正的RFC 5988解析器而不是字符串拆分,因此它应该适用于任何链接头,而不仅仅是Github.
我发现这个要点:
Links在JavaScript中解析Github 标头
在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"
};
Run Code Online (Sandbox Code Playgroud)
我完全理解这是“技术上”的一个JavaScript线程。但是,如果您像我一样通过 Google “如何解析链接标头”到达这里,我想我会分享针对我的环境(C#)的解决方案。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
使用 GitHub 的示例链接标头在控制台应用程序中进行测试:
void Main()
{
string link = "<https://api.github.com/user/repos?page=3&per_page=100>; rel=\"next\",< https://api.github.com/user/repos?page=50&per_page=100>; rel=\"last\"";
LinkHeader linkHeader = LinkHeader.FromHeader(link);
}
Run Code Online (Sandbox Code Playgroud)
对于最终在这里搜索 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);
Run Code Online (Sandbox Code Playgroud)
这是一个简单的 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;
}
Run Code Online (Sandbox Code Playgroud)
它将输出这样的结果==>
{
"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"
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11700 次 |
| 最近记录: |