Как разобрать заголовок ссылки из github API - PullRequest
24 голосов
/ 05 января 2012

API github отправляет данные разбивки на страницы для результатов 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"

, поскольку API github - не единственный API, использующий этот метод (я думаю), я хотел спросить,у кого-то есть полезный небольшой фрагмент, чтобы проанализировать заголовок ссылки (и преобразовать его, например, в массив), чтобы я мог использовать его для своего приложения js.

Я гуглил, но не нашел ничего полезного в том, как разбирать нумерацию странициз API-интерфейсов json

Ответы [ 8 ]

14 голосов
/ 07 января 2012

В Java API GitHub есть класс PageLinks , который показывает, как анализировать заголовок Link.

13 голосов
/ 30 апреля 2015

Для этой цели существует модуль NPM Parse-Link-header ; его источник можно найти на 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' } }
6 голосов
/ 23 августа 2013
6 голосов
/ 26 мая 2013

Я нашел wombleton / link-headers на github. Похоже, что он сделан для браузера, в отличие от модуля npm, но кажется, что его не составит труда изменить для работы в серверной среде. Он использует pegjs для генерации настоящего анализатора RFC 5988, а не для разбиения строк, поэтому он должен хорошо работать для любого заголовка ссылки, а не только для Github.

2 голосов
/ 30 сентября 2015

Если вы можете использовать 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)
1 голос
/ 01 февраля 2019

Вот простая функция 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 голос
/ 20 сентября 2017

Я полностью понимаю, что это "технически" нить 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;
    }
}

Тестирование в консольном приложении на примере 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);
}
0 голосов
/ 08 января 2019

Вот простой bash-скрипт с curl и sed для получения всех страниц из длинного запроса

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...