2012-01-04 14 views
18

la API github envía los datos de paginación de los resultados JSON en la cabecera de enlace http:cómo analizar la cabecera de enlace de la API 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" 

desde la API de github no es la única API usando este método (creo) Yo quería preguntar si alguien tiene un pequeño fragmento útil para analizar la cabecera de enlace (y convertirlo en una matriz, por ejemplo,) para que pueda usarlo para mi JS aplicación.

i googled alrededor pero no encontró nada útil con respecto a cómo analizar la paginación de las API JSON

Respuesta

14

Hay una clase PageLinks en el GitHub Java API que muestra cómo analizar la cabecera Link.

+0

grande, gracias! – toxinlabs

+9

Vale la pena señalar que si bien este es el truco para el uso de GitHub, esto no es un análisis totalmente robusta de cualquier cabecera de Enlace. Las divisiones de cadena no son suficientes; p.ej. '; =' está permitido dentro de las URL, e incluso ',' está permitido dentro de los valores si se citan los valores.Horriblemente complejo. Spec: http://www.rfc-editor.org/rfc/rfc5988.txt –

6

He encontrado wombleton/link-headers en github. Parece estar hecho para el navegador, en lugar de ser un módulo de NGP, pero parece que no sería difícil modificarlo para trabajar en un entorno de servidor. Utiliza pegjs para generar un verdadero analizador RFC 5988 en lugar de divisiones de cuerda, así que debería funcionar bien para cualquier enlace de cabecera, en lugar de sólo Github de.

5

yo encontramos este Gist que:

Analizar encabezado Github Links en JavaScript

probamos a cabo en la API de Github y devuelve un objeto como:

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 existe para este propósito; its source can be found on github bajo una licencia de MIT (gratis para uso comercial).

La instalación es tan simple como:

npm install parse-link-header 

uso tiene el siguiente aspecto:

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

... después de lo cual uno tiene parsed.next, parsed.last, etc:

{ 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

Incluye las partes esenciales de la fuente original, porque la respuesta sería inútil si el enlace se quedara muerto. –

+0

este es un módulo npm chicos. ¿Tiene sentido desmantelarlo? – Cosmin

+0

@ Cosmin, las reglas son las reglas. Dar una demostración de uso hará mucho bien para evitar que tu respuesta sea desestimada/cerrada (estaba en la cola de correos de baja calidad para votar sobre si borrar donde encontré la edición). Por supuesto, muchas de las otras respuestas sobre esta pregunta no son mucho mejores; el sistema es injusto a veces. –

1

Si puede usar Python y no desea implementar full specification , Pero necesita tener algo qué labor de API Github, entonces aquí vamos:

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

Puedes obtenerlo por 'rsp.links' si estás usando solicitudes. – kxxoling

+0

Gracias por la sugerencia de 'links' @kxxoling, ¡no sabía nada de eso! –

0

entiendo por completo este es "técnicamente" un hilo JavaScript. Pero, si eres como yo y llegó aquí por Google'ing "cómo analizar cabecera Enlace" pensé que me gustaría compartir mi solución para mi envinronment (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; 
    } 
} 

Testing en una aplicación de consola, usando cabecera ejemplo Enlace de 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); 
} 
Cuestiones relacionadas