Come testare l'API REST con Emacs?


34

Sto mettendo insieme un'app e voglio essere in grado di testare i punti finali dell'API. Ho pensato che Emacs sarebbe stato un ottimo modo per procedere, specialmente se le risposte JSON potevano essere analizzate e i dati di ritorno utilizzati nei test successivi.

Qualche idea su come procedere, o è solo pazzo?


Il modo più semplice è invocare un comando shell curl e analizzare i risultati con json read.
Malabarba,

Risposte:


45
  • restclient è la modalità più "interattiva".

    Questo è uno strumento per esplorare e testare manualmente i servizi web HTTP REST. Esegue query da un foglio di query di testo semplice, visualizza i risultati come XML, JSON e persino immagini piuttosto stampati.

    restclient

    È possibile controllare un esempio di flusso di lavoro su http://jakemccrary.com/blog/2014/07/04/using-emacs-to-explore-an-http-api/ .

  • request.el - Coltello svizzero HTTP.

    (request
     "http://httpbin.org/get"
     :params '(("key" . "value") ("key2" . "value2"))
     :parser 'json-read
     :success (function*
               (lambda (&key data &allow-other-keys)
                 (message "I sent: %S" (assoc-default 'args data)))))
    
  • emacs-web - "L'idea è quella di utilizzare sempre i callback per raccogliere la risposta."

    Il modulo di callback JSON consente di raccogliere solo i dati:

    ;; -*- lexical-binding: t -*-
    (require 'web)
    
    (web-json-post 
      (lambda (data &rest stuff)
         (message "%S" data))
      :url "https://httpbin.org/post")
    

23

Vecchia domanda, sì ... Ma nel caso in cui qualcuno lo cerchi su Google; un'altra opzione sta usando Org Babel e ob-http... (Può essere installato da melpa .)

Con org-babel, è possibile creare un .orgfile contenente " http" blocchi di codice. Quando questi blocchi vengono valutati, faranno la richiesta HTTP e restituiranno la risposta come risultato.

Se questi blocchi hanno un " #+NAME:" attributo, puoi usare i loro risultati in qualsiasi altro org-babelblocco. Ciò consente una programmazione piuttosto accurata utilizzando i risultati delle richieste HTTP.

Ad esempio, ecco un piccolo documento dell'organizzazione che dimostra come effettuare una richiesta HTTP e analizzare il JSON restituito in Ruby:

* The request
The following is the example request shown on [[https://github.com/zweifisch/ob-http][ob-http's Github page]]...

It isn't anything fancy, but it is a REST API request, and returns
JSON, so it works for the sake of this demonstration:

#+NAME:ob-languages
#+BEGIN_SRC http :pretty
  GET https://api.github.com/repos/zweifisch/ob-http/languages
#+END_SRC

#+RESULTS:
: {
:   "Emacs Lisp": 7034
: }

Notice how this has a "=#+NAME:=" attribute? This is a name we can use
in other =org-babel= blocks. (As you will see below)

* Using the request
Now that I have an =http= request in an org block with a name... Lets
write something in a completely different language and use our HTTP
request's response:

#+BEGIN_SRC ruby :var langs=ob-languages
  require 'json'
  JSON.parse(langs)['Emacs Lisp']
#+END_SRC

#+RESULTS:
: 7034

The =:var= keyword allowed me to assign the "=langs=" variable in the
Ruby block to the result of the =ob-languages= block [[The request][above]].

This didn't have to be in Ruby, this could have been any language,
including another =http= block.

Ecco come appare org-mode: ob-http in modalità org

Colpire C-c C-csul blocco inferiore (quello di Ruby) valuterà automagicamente quello superiore per la sua dipendenza (Questo è il :varbit nell'intestazione del blocco.). Ciò significa che la httprichiesta viene prima fatta, quindi i risultati vengono passati a Ruby per ulteriori elaborazioni.

Puoi farlo con tutti i blocchi che vuoi e con quante più lingue.

Se questo soddisfa le tue esigenze, ob-httprichiede un po 'di modifica manuale dopo averlo installato per farlo funzionare. (Non preoccuparti, non è molto)

Dopo l'installazione ob-http, è necessario personalizzare due variabili: org-src-lang-modese org-babel-load-languages.

Quindi, eseguendo M-x customize-variable, è possibile personalizzare ciascuno per includere quanto segue:

org-src-lang-modes: Vorrai personalizzare questa variabile per includere un'altra mappatura della lingua, in modo da poter inserire un altro valore alla fine dell'elenco:

String: http
Symbol: ob-http

Quindi è possibile C-x C-ssalvare quella personalizzazione.

org-babel-load-languages: Vorrai aggiungere un altro elemento all'elenco delle orglingue abilitate . " http".

Tuttavia, potrebbe essere necessario aggiungerlo manualmente all'elenco se l'opzione non è tra le possibili opzioni, puoi farlo facendo clic su "Stato" e scegliendo " :" per mostrare l'espressione Lisp ... Quindi aggiungere quanto segue prima dell'ultima parentesi di chiusura:

(http . t)

Dopodiché, un veloce C-x C-se M-x org-reloaddovrebbe essere tutto ciò che serve ..!


come si può usare ob-http per pubblicare file?
Anuvrat Parashar,

2

Ho scritto httprepl proprio per questo scopo. Ti dà un sostituto basato su un punto in cui puoi inviare richieste http.

https://github.com/gregsexton/httprepl.el

È possibile aggiungere facilmente funzioni che consumano il risultato di richieste. Questi di solito sono usati per una stampa carina ecc. Ma l'analisi di una struttura elisp dovrebbe essere semplice usando la libreria json integrata.


-1

È perfettamente possibile farlo perché faccio quasi esattamente la stessa cosa da solo. Ci sono un paio di avvertimenti però. Prima di tutto ho una libreria xmlrpc.el localmente patch . Ciò risolve due problemi, un'incompatibilità con i moderni emacs e la possibilità di passare le intestazioni di autenticazione nella richiesta. I dati che sto elaborando sono JSON in XML ma potresti essere in grado di saltare il passaggio XML a seconda della configurazione.

Tutto il pesante sollevamento RPC viene eseguito in lava-rpc.el ma non dovrebbe essere difficile da seguire. Puoi vedere la chiamata per inviare un pezzo di json rigoroso qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.