¿Cómo probar la API REST con Emacs?


34

Estoy armando una aplicación y quiero poder probar los puntos finales de la API. Pensé que Emacs sería una buena manera de hacerlo, especialmente si las respuestas JSON pudieran analizarse y los datos de retorno se usaran en pruebas posteriores.

¿Alguna idea sobre cómo hacer esto, o es una locura?


La forma más fácil es invocar un comando curl shell y analizar los resultados con json read.
Malabarba

Respuestas:


45
  • restclient es el modo más "interactivo".

    Esta es una herramienta para explorar y probar manualmente los servicios web HTTP REST. Ejecuta consultas desde una hoja de consulta de texto sin formato, muestra los resultados como XML, JSON e incluso imágenes bien impresas.

    cliente

    Puede consultar un ejemplo de flujo de trabajo en http://jakemccrary.com/blog/2014/07/04/using-emacs-to-explore-an-http-api/ .

  • request.el : cuchillo suizo 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 - "La idea es usar siempre devoluciones de llamada para recopilar la respuesta".

    El formulario de devolución de llamada JSON permite que solo se recopilen datos:

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

23

Vieja pregunta, sí ... Pero en caso de que alguien busque en Google esto; otra opción es usar Org Babel y ob-http... (se puede instalar desde melpa ).

Con org-babel, puede crear un .orgarchivo que contenga " http" bloques de código. Cuando se evalúan estos bloques, harán la solicitud HTTP y devolverán la respuesta como resultado.

Si estos bloques tienen un #+NAME:atributo " ", puede usar sus resultados en cualquier otro org-babelbloque. Esto permite una programación alfabetizada bastante ordenada utilizando los resultados de las solicitudes HTTP.

Por ejemplo, aquí hay un pequeño documento Org que demuestra que realiza una solicitud HTTP y analiza el JSON devuelto en 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.

Así es como se ve en org-mode: ob-http en modo org

Al presionar C-c C-cel bloque inferior (el Ruby), se evaluará automáticamente el superior para determinar su dependencia (ese es el :varbit en el encabezado del bloque). Esto significará que la httpsolicitud se realiza primero y luego los resultados se pasan a Ruby para su posterior procesamiento.

Puede hacer esto con tantos bloques como desee y con tantos idiomas.

Si esto se adapta a sus necesidades, ob-httprequiere un poco de ajustes manuales después de instalarlo para que funcione. (No te preocupes, no es tanto)

Después de la instalación ob-http, debe personalizar dos variables: org-src-lang-modesy org-babel-load-languages.

Entonces, al ejecutar M-x customize-variable, puede personalizar cada uno para incluir lo siguiente:

org-src-lang-modes: Querrá personalizar esta variable para incluir una asignación de idioma más, de modo que pueda insertar un valor más al final de la lista:

String: http
Symbol: ob-http

Entonces puedes C-x C-sguardar esa personalización.

org-babel-load-languages: Querrá agregar un elemento más a la lista de orgidiomas habilitados . " http".

Sin embargo, es posible que deba agregarlo a la lista manualmente si la opción no está en las opciones posibles, puede hacerlo haciendo clic en "Estado" y eligiendo " :" para mostrar la expresión Lisp ... Luego agregaría lo siguiente solo antes del último paréntesis de cierre:

(http . t)

Después de eso, un rápido C-x C-sy M-x org-reloaddebería ser todo lo que necesitas ...!


¿Cómo se puede usar ob-http para publicar archivos?
Anuvrat Parashar

2

Escribí httprepl exactamente para este propósito. Le da una respuesta basada en comint donde puede emitir solicitudes http.

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

Puede agregar fácilmente funciones que consuman el resultado de las solicitudes. Por lo general, se usan para una impresión bonita, etc. pero el análisis de una estructura elisp debería ser simple usando la biblioteca integrada json.


-1

Es perfectamente posible hacerlo porque yo mismo hago casi exactamente lo mismo. Sin embargo, hay un par de advertencias. En primer lugar, tengo una biblioteca localmente parcheada xmlrpc.el . Esto resuelve dos problemas, una incompatibilidad con los emacs modernos y la capacidad de pasar encabezados de autenticación en la solicitud. Los datos que estoy procesando son JSON en XML, pero es posible que pueda omitir el paso XML dependiendo de su configuración.

Todo el levantamiento pesado de RPC se realiza en lava-rpc.el pero no debería ser difícil de seguir. Puede ver la llamada para enviar una pieza de json en cadena aquí .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.