2012-01-04 17 views
18

GitHub एपीआई http लिंक शीर्षक में json परिणामों के लिए पृष्ठांकन डेटा भेजता है:GitHub एपीआई से लिंक हैडर पार्स करने के लिए कैसे

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 नहीं है (मुझे लगता है कि) मैं पूछना चाहता था कि लिंक हेडर को पार्स करने के लिए किसी के पास उपयोगी छोटा स्निपेट है (और उदाहरण के लिए इसे सरणी में परिवर्तित करें) ताकि मैं इसे अपने जेएस ऐप के लिए उपयोग कर सकूं।

मैं आसपास googled लेकिन कैसे json एपीआई

उत्तर

14

से पृष्ठांकन पार्स करने के लिए GitHub Java API में एक PageLinks वर्ग से पता चलता है कि कैसे Link हैडर पार्स करने के लिए नहीं है के बारे में उपयोगी कुछ नहीं मिला।

+0

महान है, धन्यवाद:

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 के उदाहरण लिंक हैडर का उपयोग कर! – toxinlabs

+9

यह ध्यान देने योग्य है कि यह गिटहब के उपयोग के लिए चाल है, यह किसी लिंक हेडर की पूरी तरह से मजबूत पार्सिंग नहीं है। स्ट्रिंग विभाजन पर्याप्त नहीं हैं; जैसे '; =' को URL के भीतर अनुमति दी गई है, और मानों के उद्धृत होने पर भी मानों के भीतर '' 'की अनुमति है।बहुत जटिल स्पेक: http://www.rfc-editor.org/rfc/rfc5988.txt –

6

मुझे जिथब पर wombleton/link-headers मिला। यह ब्राउज़र के लिए बनाया जाता है, जैसा कि एक एनपीएम मॉड्यूल होने के विपरीत है, लेकिन ऐसा लगता है कि सर्वर-साइड वातावरण में काम करने के लिए इसे संशोधित करना मुश्किल नहीं होगा। यह स्ट्रिंग स्प्लिट्स के बजाए वास्तविक आरएफसी 5988 पार्सर उत्पन्न करने के लिए पेगजे का उपयोग करता है, इसलिए इसे गिथब के बजाए किसी लिंक हेडर के लिए अच्छी तरह से काम करना चाहिए। जावास्क्रिप्ट

में

पार्स Github Links हैडर

Github एपीआई पर इसे बाहर परीक्षण किया गया है और यह की तरह एक वस्तु देता है:

5

मैं इस Gist कि पाया

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 इस उद्देश्य के लिए मौजूद है; एक एमआईटी लाइसेंस के तहत its source can be found on github (वाणिज्यिक उपयोग के लिए नि: शुल्क)। , जिसके बाद एक parsed.next है

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.last, आदि:

npm install parse-link-header 

प्रयोग ऐसा दिखाई देता है:

स्थापना के रूप में सरल है

{ 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

मूल स्रोत से आवश्यक हिस्सों को शामिल करें, क्योंकि अगर लिंक मर जाता है तो उत्तर बेकार हो जाएगा! –

+0

यह एक एनपीएम मॉड्यूल लड़कों है। क्या इसे अलग करने के लिए समझ में आता है? – Cosmin

+0

@ कोसमैन, नियम नियम हैं। उपयोग का प्रदर्शन देना आपके उत्तर को डाउनवॉटेड/बंद करने से बचने के लिए बहुत अच्छा होगा (यह कम गुणवत्ता वाली पोस्ट कतार में था, यह देखने के लिए कि मुझे इसे संपादित करने के लिए कहां मिला है)। अनुमोदित, इस प्रश्न पर कई अन्य उत्तर बहुत बेहतर नहीं हैं; सिस्टम कभी-कभी अनुचित है। –

1

यदि आप पायथन का उपयोग कर सकते हैं और full specification को लागू नहीं करना चाहते हैं है, लेकिन फिर ये हम चले कुछ Github एपीआई के लिए क्या काम करने की जरूरत है,:

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

यदि आप अनुरोधों का उपयोग कर रहे हैं तो आप इसे 'rsp.links' द्वारा प्राप्त कर सकते हैं। – kxxoling

+0

'लिंक' टिप @ kxxoling के लिए धन्यवाद, मुझे इसके बारे में पता नहीं था! –

0

मैं पूरी तरह से यह "तकनीकी रूप से" एक JavaScript धागा समझते हैं। लेकिन, यदि आप मेरे जैसे हैं और Google'ing "लिंक हेडर को कैसे पार्स करें" मैंने सोचा कि मैं अपने समाधान के लिए अपना समाधान साझा करूंगा (सी #)।

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