web-dev-qa-db-ja.com

githubAPIからリンクヘッダーを解析する方法

github APIは、json結果のページネーションデータをhttpリンクヘッダーに送信します。

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アプリ。

グーグルで検索しましたが、jsonAPIからページネーションを解析する方法に関して何も役に立ちませんでした

28
toxinlabs

GitHub Java API には、Linkヘッダーの解析方法を示す PageLinks クラスがあります。

15
Kevin Sawicki

parse-link-header NPMモジュール この目的のために存在します。 そのソースはgithubにあります MITライセンス(商用利用は無料)の下で)。

インストールは次のように簡単です。

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.nextparsed.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' } }
13
Cosmin

私はこれを見つけました 要点 それ:

JavaScriptでGithubLinksヘッダーを解析します

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"
};
6
danriti

Githubで wombleton/link-headers が見つかりました。 npmモジュールではなく、ブラウザ用に作成されているように見えますが、サーバー側の環境で機能するように変更するのは難しいことではないようです。 pegjsを使用して、文字列分割ではなく実際のRFC 5988パーサーを生成するため、Githubだけでなく、すべてのリンクヘッダーで適切に機能するはずです。

6
Atul Varma

Pythonを使用でき、実装したくない 完全な仕様 が、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)
2
Anton Babenko

これが「技術的に」JavaScriptスレッドであることを完全に理解しています。しかし、あなたが私のようで、グーグルでここに到着した場合 "リンクヘッダーを解析する方法"私は私が思った私の環境(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;
    }
}

GitHubのサンプルLinkヘッダーを使用した、コンソールアプリでのテスト:

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);
}
1
pim

これは、Niceオブジェクト表記のリンクから有用な情報を抽出する単純な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"
  }
}
1
Harman

これは、長いクエリからすべてのページを取得するための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
0
noelbk