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からページネーションを解析する方法に関して何も役に立ちませんでした
GitHub Java API には、Link
ヘッダーの解析方法を示す PageLinks クラスがあります。
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.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' } }
私はこれを見つけました 要点 それ:
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"
};
Githubで wombleton/link-headers が見つかりました。 npmモジュールではなく、ブラウザ用に作成されているように見えますが、サーバー側の環境で機能するように変更するのは難しいことではないようです。 pegjsを使用して、文字列分割ではなく実際のRFC 5988パーサーを生成するため、Githubだけでなく、すべてのリンクヘッダーで適切に機能するはずです。
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)
これが「技術的に」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);
}
これは、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"
}
}
これは、長いクエリからすべてのページを取得するための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