如何从github API解析链接头

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

  • 值得注意的是,虽然这对GitHub的使用起了作用,但这并不是对任何Link头的完全可靠的解析.字符串拆分是不够的; 例如,在URL中允许`; =`,如果引用了值,则在值内允许使用`,`.非常复杂.规格:http://www.rfc-editor.org/rfc/rfc5988.txt (10认同)

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)

  • 同时接受的答案,只提供链接,没有人说了3年.这简直荒谬...... (3认同)
  • 是的,听起来像规则需要修改.目前你可以让社区知道我的贡献激励在此之后已经减少了.谢谢你的编辑.但是,如果链接被删除(节点模块被删除),您编辑到我的消息中的信息将毫无用处.我发现很难理解制定规则以降低/删除试图帮助的人的帖子的常识,事实上没有做错任何事(这是一个节点模块,也许有些人不明白这是什么...) (2认同)
  • 还要记住,我没有通过堆栈溢出来支付.我付了我的雇主,在我花了最少的时间后,我回到工作岗位,帮助别人,在堆栈溢出问题证明提供了不正确的信息后.如果您认为我提供的准确信息不值得,请随时删除我的帖子.也可以随意给我一个报价,如果你考虑下次我应该花更多的时间在我的帖子上,我会预算时间并在下班后做一个专业的帖子.Stackoverflow是社区驱动的,但它是一项业务. (2认同)
  • 这是javascript的最佳答案。 (2认同)

Atu*_*rma 6

我在github上找到了wombleton/link-headers.它似乎是为浏览器而制作的,而不是作为npm模块,但似乎不难修改它以在服务器端环境中工作.它使用pegjs生成一个真正的RFC 5988解析器而不是字符串拆分,因此它应该适用于任何链接头,而不仅仅是Github.


dan*_*iti 6

我发现这个要点:

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)


rob*_*pim 6

我完全理解这是“技术上”的一个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)


Sah*_*bra 6

对于最终在这里搜索 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)


Har*_*man 5

这是一个简单的 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)