2012-01-04 13 views
18

l'API github invia i dati di impaginazione per i risultati JSON nell'intestazione collegamento http:come analizzare un colpo di testa collegamento da 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" 

poiché l'API GitHub non è l'unico API utilizzando questo metodo (credo) volevo chiedere se qualcuno ha un piccolo snippet utile per analizzare l'intestazione del link (e convertirlo in un array ad esempio) in modo che io possa usarlo per la mia app js.

I googled intorno ma non trovò nulla utile per quanto riguarda come analizzare impaginazione da API JSON

risposta

14

C'è una classe PageLinks nel GitHub Java API che mostra come analizzare l'intestazione Link.

+0

grande, grazie! – toxinlabs

+9

Vale la pena notare che mentre questo fa il trucco per l'utilizzo di GitHub, questo non è un parsing pienamente affidabile di qualsiasi intestazione di Link. Le divisioni di stringa non sono sufficienti; per esempio. '; =' è permesso all'interno degli URL, e anche ',' è consentito all'interno dei valori se i valori sono quotati.Orribilmente complesso Specifiche: http://www.rfc-editor.org/rfc/rfc5988.txt –

6

Ho trovato wombleton/link-headers su github. Sembra essere fatto per il browser, invece di essere un modulo npm, ma sembra che non sarebbe difficile modificarlo per funzionare in un ambiente lato server. Usa pegjs per generare un vero parser RFC 5988 piuttosto che split di stringhe, quindi dovrebbe funzionare bene per qualsiasi intestazione di link, piuttosto che solo per Github.

5

ho trovato questo Gist che:

Parse Github Links intestazione in JavaScript

testato sul API Github e restituisce un oggetto come:

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 esiste per questo scopo; its source can be found on github con licenza MIT (gratuita per uso commerciale).

installazione è semplice come:

npm install parse-link-header 

Usage è simile al seguente:

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

... dopo di che si ha parsed.next, parsed.last, ecc:

{ 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

Includi le parti essenziali della fonte originale, perché la risposta diventerebbe inutile se il link dovesse diventare morto! –

+0

questo è un modulo npm ragazzi. ha senso distinguerlo? – Cosmin

+0

@Cosmin, le regole sono le regole. Dare una dimostrazione dell'uso farà molto bene per evitare di far downvoted/closed la tua risposta (era nella coda post di bassa qualità per votare se cancellare dove ho trovato per la modifica). Certo, molte delle altre risposte a questa domanda non sono molto migliori; il sistema è ingiusto a volte. –

1

Se è possibile utilizzare Python e non si desidera implementare full specification , Ma hanno bisogno di avere qualcosa di ciò che il lavoro per Github API, allora qui andiamo:

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

Puoi ottenerlo con 'rsp.links' se stai usando le richieste. – kxxoling

+0

Grazie per il suggerimento 'links' su @kxxoling, non lo sapevo! –

0

Capisco perfettamente questa è "tecnicamente" un filo JavaScript. Ma se sei come me e sei arrivato qui da Google "come analizzare l'intestazione del link" Ho pensato di condividere la mia soluzione per il mio ambiente (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; 
    } 
} 

test in una console app, utilizzando intestazione esempio link di 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); 
} 
Problemi correlati