Wie teste ich REST API mit Emacs?

34

Ich stelle eine App zusammen und möchte die API-Endpunkte testen können. Ich dachte, Emacs wäre ein cooler Weg, vor allem, wenn JSON-Antworten analysiert und die Rückgabedaten für nachfolgende Tests verwendet werden könnten.

Irgendwelche Ideen, wie man das macht, oder ist das einfach verrückt?

Ryan White
quelle
Am einfachsten ist es, einen Curl-Shell-Befehl aufzurufen und die Ergebnisse mit json read zu analysieren.
Malabarba

Antworten:

45
  • restclient ist der "interaktivste" Modus.

    Dies ist ein Tool zum manuellen Durchsuchen und Testen von HTTP-REST-Webservices. Führt Abfragen von einem Nur-Text-Abfrageblatt aus und zeigt die Ergebnisse als hübsch gedrucktes XML, JSON und sogar als Bilder an.

    restclient

    Sie können ein Workflow-Beispiel unter http://jakemccrary.com/blog/2014/07/04/using-emacs-to-explore-an-http-api/ überprüfen .

  • request.el - HTTP Schweizer Messer.

    (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 - "Die Idee ist, immer Rückrufe zu verwenden, um die Antwort zu sammeln."

    Über das JSON-Rückrufformular können nur Daten erfasst werden:

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

Alte Frage, ja ... Aber für den Fall, dass jemand dies googelt; Eine andere Option ist die Verwendung von Org Babel und ob-http... (Kann von Melpa installiert werden .)

Mit " " org-babelkönnen Sie eine .orgDatei httperstellen, die Codeblöcke enthält. Wenn diese Blöcke ausgewertet werden, stellen sie die HTTP-Anforderung und geben die Antwort als Ergebnis zurück.

Wenn diese Blöcke ein #+NAME:Attribut " " haben, können Sie ihre Ergebnisse in jedem anderen org-babelBlock verwenden. Dies ermöglicht eine ziemlich gute Programmierung unter Verwendung der Ergebnisse von HTTP-Anforderungen.

Beispiel: Hier ist ein kleines Org-Dokument, in dem gezeigt wird, wie eine HTTP-Anfrage gestellt und der zurückgegebene JSON-Code in Ruby analysiert wird:

* 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.

So sieht das aus in org-mode: ob-http im org-modus

Wenn Sie C-c C-cauf den unteren Block (The Ruby one) treffen, wird der obere automatisch auf seine Abhängigkeit hin bewertet (das ist das :varBit im Header des Blocks.). Dies bedeutet, dass zuerst die httpAnforderung erfolgt und dann die Ergebnisse zur weiteren Verarbeitung an Ruby übergeben werden.

Sie können dies mit so vielen Blöcken tun, wie Sie möchten und mit so vielen Sprachen.

Wenn dies Ihren Anforderungen entspricht, ob-httpmüssen Sie nach der Installation einige manuelle Anpassungen vornehmen, damit es funktioniert. (Mach dir keine Sorgen, es ist nicht so viel)

Nach der Installation ob-httpmüssen Sie zwei Variablen anpassen: org-src-lang-modesund org-babel-load-languages.

Wenn M-x customize-variableSie also ausführen, können Sie jedes so anpassen, dass es Folgendes enthält:

org-src-lang-modes: Sie möchten diese Variable so anpassen, dass sie eine weitere Sprachzuordnung enthält, sodass Sie einen weiteren Wert am Ende der Liste einfügen können:

String: http
Symbol: ob-http

Dann können Sie C-x C-sdiese Anpassung speichern.

org-babel-load-languages: Sie möchten der Liste der aktivierten orgSprachen ein weiteres Element hinzufügen . " http".

Sie müssen es möglicherweise manuell zur Liste hinzufügen, wenn die Option nicht in den möglichen Optionen enthalten ist. Klicken Sie dazu auf "Status" und wählen Sie " :", um den Lisp-Ausdruck anzuzeigen. Dann fügen Sie einfach Folgendes hinzu vor der letzten schließenden Klammer:

(http . t)

Danach ein schnelles C-x C-sund M-x org-reloadsollte alles sein, was Sie brauchen ..!

Archenoth
quelle
Wie kann ob-http zum Posten von Dateien verwendet werden?
Anuvrat Parashar
2

Genau zu diesem Zweck habe ich httprepl geschrieben. Sie erhalten eine comint-basierte Antwort, in der Sie http-Anforderungen ausgeben können.

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

Sie können problemlos Funktionen hinzufügen, die das Ergebnis von Anforderungen verwenden. Diese werden normalerweise für hübsches Drucken usw. verwendet, aber das Parsen zu einer Elisp-Struktur sollte mithilfe der eingebauten JSON-Bibliothek einfach sein.

Greg Sexton
quelle
-1

Das ist durchaus möglich, weil ich fast genau dasselbe selbst mache. Es gibt jedoch ein paar Einschränkungen. Zuallererst habe ich eine lokal patch xmlrpc.el Bibliothek . Dies löst zwei Probleme, eine Inkompatibilität mit modernen Emacs und die Möglichkeit, Authentifizierungsheader in der Anforderung zu übergeben. Die Daten, die ich verarbeite, sind JSON in XML, aber Sie können den XML-Schritt möglicherweise überspringen, abhängig von Ihrer Konfiguration.

Das ganze schwere RPC-Heben wird in lava-rpc.el durchgeführt, aber es sollte nicht schwer zu folgen sein. Sie können die Aufforderung zur Einreichung eines Json-Strings hier sehen .

Stsquad
quelle