2012-01-04 32 views
18

API github gửi dữ liệu pagination về kết quả json trong tiêu đề liên kết http:Làm thế nào để phân tích tiêu đề liên kết từ github API

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" 

từ API github không phải là API chỉ sử dụng phương pháp này (tôi nghĩ rằng) Tôi muốn hỏi nếu ai đó có một đoạn nhỏ hữu ích để phân tích cú pháp tiêu đề liên kết (và chuyển đổi nó thành một mảng ví dụ) để tôi có thể sử dụng nó cho ứng dụng js của tôi.

i googled xung quanh nhưng không tìm thấy gì hữu ích về làm thế nào để phân tích pagination từ API json

Trả lời

14

Có một lớp PageLinks trong GitHub Java API cho thấy làm thế nào để phân tích Link tiêu đề.

+0

tuyệt vời, cảm ơn bạn! – toxinlabs

+9

Điều đáng lưu ý là mặc dù điều này có lợi cho việc sử dụng GitHub, đây không phải là một phân tích cú pháp hoàn toàn mạnh mẽ của bất kỳ tiêu đề Liên kết nào. Phân chia chuỗi không đủ; ví dụ. '; =' được cho phép trong các URL, và thậm chí ',' được cho phép trong các giá trị nếu các giá trị được trích dẫn.Phức tạp khủng khiếp. Spec: http://www.rfc-editor.org/rfc/rfc5988.txt –

6

Tôi tìm thấy wombleton/link-headers trên github. Nó dường như được tạo ra cho trình duyệt, trái với việc là một mô-đun npm, nhưng có vẻ như sẽ không khó để sửa đổi nó để làm việc trong môi trường phía máy chủ. Nó sử dụng pegjs để tạo ra một trình phân tích cú pháp RFC thực 5988 chứ không phải là phân tách chuỗi, vì vậy nó sẽ làm việc tốt cho bất kỳ tiêu đề liên kết nào, thay vì chỉ là của Github.

5

Tôi thấy điều này Gist rằng:

Parse Github Links tiêu đề trong JavaScript

Tested nó ra trên API Github và nó sẽ trả về một đối tượng như:

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" 
}; 
9

The parse-link-header NPM module tồn tại cho mục đích này; its source can be found on github theo giấy phép MIT (miễn phí cho mục đích thương mại).

cài đặt cũng đơn giản như:

npm install parse-link-header 

Cách sử dụng trông giống như sau:

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"') 

... sau đó người ta có parsed.next, parsed.last, vv:

{ 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' } } 
+0

Bao gồm các phần thiết yếu từ nguồn gốc, vì câu trả lời sẽ trở nên vô dụng nếu liên kết bị chết! –

+0

đây là một npm module guys. nó có ý nghĩa để chọn nó ngoài? – Cosmin

+0

@Cosmin, các quy tắc là các quy tắc. Đưa ra một minh họa về cách sử dụng sẽ làm rất nhiều điều tốt để tránh nhận được câu trả lời của bạn downvoted/closed (nó nằm trong hàng đợi bài viết chất lượng thấp để bỏ phiếu về việc có nên xóa nơi tôi tìm thấy nó để chỉnh sửa) hay không. Cấp, nhiều câu trả lời khác về câu hỏi này không tốt hơn nhiều; đôi khi không công bằng của hệ thống. –

1

Nếu bạn có thể sử dụng Python và không muốn triển khai full specification , Nhưng cần phải có một cái gì đó những gì làm việc cho Github API, sau đó ở đây chúng tôi đi:

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) 
+3

Bạn có thể lấy nó bằng «rsp.links' nếu bạn đang sử dụng các yêu cầu. – kxxoling

+0

Cảm ơn bạn đã biết mẹo 'link' @kxxoling, tôi không biết về điều đó! –

0

tôi hoàn toàn hiểu được điều này là "kỹ thuật" a thread JavaScript. Nhưng, nếu bạn giống tôi và đến đây bằng cách Google'ing "cách phân tích cú pháp tiêu đề Liên kết" Tôi nghĩ tôi sẽ chia sẻ giải pháp của mình cho sự tham gia của tôi (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; 
    } 
} 

kiểm tra trong một ứng dụng giao diện điều khiển, sử dụng tiêu đề ví dụ liên kết GitHub của:

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); 
} 
Các vấn đề liên quan