2012-02-11 13 views
7

GitHub ha un API jsonp per l'origine di un file? So che BitBucket ha, ma non riesco a trovare alcuna informazione per GitHubs (ammesso che ne abbiano uno).GitHub codice sorgente jsonp api

Non è così? In caso contrario, allora bummer ...

risposta

0

Non credo che GitHub abbia un'API per estrarre l'origine di un file. Hanno callback JSONP però specificando il callback = funciton dopo ogni chiamata API (ad esempio, curl https://api.github.com?callback=foo)

Si potrebbe forse usare il Trees API per trovare i file di origine presenti in un repository ad un certo commit (Responsabile il ramo principale). Poi si può solo acquisire l'origine utilizzando l'URL per la versione grezza del file (ad esempio, https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/directories.zsh)

3

A affermato nel GitHub API documentation, qualsiasi chiamata supporta la modalità di invocazione JSONP:

È può inviare un parametro ?callback a qualsiasi chiamata GET per avere i risultati avvolti in una funzione JSON. Questo in genere viene utilizzato quando i browser desiderano incorporare il contenuto GitHub nelle pagine Web aggirando i problemi interdominio. La risposta include lo stesso output di dati dell'API regolare, oltre alle informazioni relative all'intestazione HTTP.

Se per recuperare il generatore di corrente di un file (o di qualsiasi versione di esso), bisogna o conoscere la SHA del Blob esso viene memorizzato in. Vedere la Git Database API per ulteriori informazioni su questo argomento.

Più spesso, non si conosce il CSA, ma solo il relativo percorso del file nella directory di lavoro.

Poi dovrete seguire i seguenti passi

Scegli un commit sha dalla lista

Recupera l'albero a cui punta e ricorsivamente elencare ogni ingresso (alberi e Blobs)

trovi le Blob corrispondenza del percorso cercato, scoprire la sua SHA ed applicare primo processo

+0

Questo è veramente utile! Grazie!! –

8

C'è un'API per ottenere il contenuto di dati da Github. Fa parte dello v3 github API.

si effettua una richiesta per

https://api.github.com/repos/{username}/{repository name}/contents/{filepath and name} 

esempio https://api.github.com/repos/mono/monodevelop/contents/README

A meno che non si imposti l'intestazione di accettazione, riceverai indietro alcuni JSON con il contenuto del file codificato in base64. Dovrai decodificarlo, qualcosa che è molto facile in node.js, ma più di un dolore nel browser. Puoi trovare decoder base64 in javascript in altre domande su Stackoverflow abbastanza facilmente. Una cosa da notare, il codice base64 che si ottiene da github contiene caratteri di nuova riga per renderlo formattato correttamente e molti decoder base64 non sono in grado di gestire le nuove linee, quindi potrebbe essere necessario rimuoverli o modificare il decoder.

Probabilmente vuoi solo il contenuto e non hai bisogno delle altre cose in json (come sha e lunghezza, ecc.), Così puoi semplificarti la vita impostando l'intestazione Accept su application/vnd.github.3.raw.

Ecco un esempio con l'accetta intestazione con ricciolo:

curl -i https://api.github.com/repos/mono/monodevelop/contents/README --header "Accept: application/vnd.github.3.raw" 

Ora, se si sta utilizzando nodo o curl, che è probabilmente bene, ma se si sta eseguendo all'interno del browser, per fare questo è Dovrò usare CORS. Github consente solo l'accesso da host registrati come Applicazioni OAuth. Non è particolarmente difficile farlo, ma per il mio caso (un bookmarketlet), quella non era un'opzione.

C'è un modo per ottenere l'accesso senza usare CORS, e cioè con JSONP, è possibile aggiungere ad es. ?callback=_processGithubResponse per ottenere l'output javascript adatto per includere un tag script (che chiama una funzione chiamata _processGithubResponse con la risposta). Sfortunatamente non puoi impostare un'intestazione di accettazione su questo, quindi in questo caso sei bloccato con la decodifica di base64.

Se si utilizza node.js, si consiglia di utilizzare node-github che rende l'API leggermente più semplice da utilizzare.

+0

non funziona con la versione corrente di API – rakesh