Comment tester l'API REST avec Emacs?

34

Je suis en train de créer une application et je veux pouvoir tester les points finaux de l'API. Je pensais qu'Emacs serait une bonne solution, en particulier si les réponses JSON pouvaient être analysées et les données de retour utilisées lors des tests suivants.

Des idées sur la façon de s'y prendre, ou est-ce juste fou?

Ryan White
la source
Le moyen le plus simple consiste à appeler une commande shell curl et à analyser les résultats avec json read.
Malabarba

Réponses:

45
  • Restclient est le mode le plus "interactif".

    Il s’agit d’un outil permettant d’explorer et de tester manuellement les services Web HTTP REST. Exécute des requêtes à partir d'une feuille de requête en texte brut, affiche les résultats sous forme de jolies impressions XML, JSON et même d'images.

    restclient

    Vous pouvez consulter un exemple de flux de travail à l’ adresse http://jakemccrary.com/blog/2014/07/04/using-emacs-to-explore-an-http-api/ .

  • request.el - couteau suisse 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’idée est de toujours utiliser des rappels pour recueillir la réponse."

    Le formulaire de rappel JSON permet uniquement de collecter des données:

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

Vieille question, oui ... Mais au cas où quelqu'un googles ceci; une autre option utilise Org Babel et ob-http... (Peut être installé depuis melpa .)

Avec org-babel, vous pouvez créer un .orgfichier contenant " http" des blocs de code. Lorsque ces blocs sont évalués, ils font la demande HTTP et renvoient la réponse comme résultat.

Si ces blocs ont un #+NAME:attribut " ", vous pouvez utiliser leurs résultats dans n’importe quel autre org-babelbloc. Cela permet une programmation assez soignée et alphabète utilisant les résultats des requêtes HTTP.

Par exemple, voici un petit document Org illustrant la création d’une requête HTTP et l’analyse du code JSON renvoyé dans 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.

Voici à quoi cela ressemble dans org-mode: ob-http en mode org

Frapper C-c C-csur le bloc du bas (The Ruby) évaluera automatiquement le premier :varbloc pour sa dépendance (c'est le bit dans l'en-tête du bloc.). Cela signifie que la httpdemande est faite en premier, puis que les résultats sont transmis à Ruby pour traitement ultérieur.

Vous pouvez le faire avec autant de blocs que vous le souhaitez et avec autant de langues.

Si cela convient à vos besoins, ob-httpnécessite un peu de peaufinage manuel après l'avoir installé pour le faire fonctionner. (Ne vous inquiétez pas, ce n'est pas tant que ça)

Après l’installation ob-http, vous devez personnaliser deux variables:, org-src-lang-modeset org-babel-load-languages.

Ainsi, en exécutant M-x customize-variable, vous pouvez personnaliser chacun pour inclure les éléments suivants:

org-src-lang-modes: Vous voudrez personnaliser cette variable pour inclure un mappage de langue supplémentaire, afin que vous puissiez insérer une valeur supplémentaire à la fin de la liste:

String: http
Symbol: ob-http

Ensuite, vous pouvez C-x C-senregistrer cette personnalisation.

org-babel-load-languages: Vous voudrez ajouter un élément de plus à la liste des orglangues activées . " http".

Cependant, vous devrez peut-être l'ajouter manuellement à la liste si l'option ne figure pas parmi les options possibles. Pour ce faire, vous pouvez cliquer sur "Etat" et choisir " :" pour afficher l'expression Lisp ... avant la dernière parenthèse fermante:

(http . t)

Après cela, un rapide C-x C-set M-x org-reloaddevrait être tout ce dont vous avez besoin ..!

Archénoth
la source
Comment utiliser ob-http pour poster des fichiers?
Anuvrat Parashar
2

J'ai écrit httprepl dans ce but. Il vous donne une répl com-based où vous pouvez émettre des requêtes http.

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

Vous pouvez facilement ajouter des fonctions qui consomment le résultat des requêtes. Celles-ci sont généralement utilisées pour de jolies impressions, etc., mais l'analyse d'une structure elisp devrait être simple à l'aide de la bibliothèque JSON intégrée.

Greg Sexton
la source
-1

C'est parfaitement possible, car je fais presque exactement la même chose moi-même. Il y a cependant quelques mises en garde. Tout d’abord, j’ai une bibliothèque de correctifs localement xmlrpc.el . Cela résout deux problèmes, une incompatibilité avec les systèmes emacs modernes et la possibilité de transmettre des en-têtes d'authentification dans la demande. Les données que je traite sont au format JSON au format XML, mais vous pourrez peut-être ignorer l'étape XML en fonction de votre configuration.

Tout le levage de RPC lourd est fait dans lava-rpc.el mais cela ne devrait pas être difficile à suivre. Vous pouvez voir l'appel à soumettre un morceau de json stratifié ici .

stsquad
la source