Jak przetestować interfejs API REST za pomocą Emacsa?


34

Przygotowuję aplikację i chcę przetestować punkty końcowe interfejsu API. Uznałem, że Emacs byłby świetną drogą - szczególnie jeśli odpowiedzi JSON mogłyby zostać przeanalizowane, a dane zwrotne wykorzystane w kolejnych testach.

Wszelkie pomysły, jak to zrobić, czy to po prostu szalone?


Najłatwiejszym sposobem jest wywołanie polecenia curl shell i parsowanie wyników przy pomocy json read.
Malabarba

Odpowiedzi:


45
  • restclient to najbardziej „interaktywny” tryb.

    Jest to narzędzie do ręcznego przeglądania i testowania usług HTTP REST. Uruchamia zapytania z arkusza zapytań w postaci zwykłego tekstu, wyświetla wyniki w postaci ładnie wydrukowanego pliku XML, JSON, a nawet obrazów.

    restclient

    Przykład przepływu pracy można sprawdzić na stronie http://jakemccrary.com/blog/2014/07/04/using-emacs-to-explore-an-http-api/ .

  • request.el - szwajcarski nóż 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 - „Chodzi o to, aby zawsze używać wywołań zwrotnych do zbierania odpowiedzi”.

    Formularz zwrotny JSON umożliwia gromadzenie tylko danych:

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

23

Stare pytanie, tak ... Ale na wypadek, gdyby ktokolwiek googlował; inną opcją jest użycie Org Babel i ob-http... (Można zainstalować z Melpy .)

Za pomocą org-babelmożesz utworzyć .orgplik zawierający httpbloki kodu. Gdy te bloki są oceniane, wysyłają żądanie HTTP i zwracają odpowiedź jako wynik.

Jeśli te bloki mają #+NAME:atrybut „ ”, możesz użyć ich wyników w dowolnym innym org-babelbloku. Pozwala to na pewne porządne programowanie z wykorzystaniem wyników żądań HTTP.

Na przykład, oto mały dokument organizacji przedstawiający wysyłanie żądania HTTP i analizowanie zwróconego JSON w 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.

Tak to wygląda w org-mode: ob-http w trybie org

Trafienie C-c C-cw dolny blok (Rubinowy) automatycznie oceni górny :varblok pod kątem jego zależności (to jest bit w nagłówku bloku). Oznacza to, że httpżądanie jest najpierw tworzone, a następnie wyniki są przekazywane do Ruby w celu dalszego przetwarzania.

Możesz to zrobić z dowolną liczbą bloków i dowolną liczbą języków.

Jeśli to odpowiada Twoim potrzebom, ob-httpwymaga trochę ręcznego dostosowania po zainstalowaniu, aby działało. (Nie martw się, to nie tak dużo)

Po instalacji ob-httpmusisz dostosować dwie zmienne: org-src-lang-modesi org-babel-load-languages.

Tak więc, uruchamiając M-x customize-variable, możesz dostosować każdy z nich, aby zawierał następujące elementy:

org-src-lang-modes: Będziesz chciał dostosować tę zmienną, aby zawierała jeszcze jedno mapowanie języka, dzięki czemu możesz wstawić jeszcze jedną wartość na końcu listy:

String: http
Symbol: ob-http

Następnie możesz C-x C-szapisać to dostosowanie.

org-babel-load-languages: Będziesz chciał dodać jeszcze jeden element do listy włączonych orgjęzyków. „ http”.

Chociaż może być konieczne ręczne dodanie go do listy, jeśli opcja nie jest dostępna w możliwych opcjach, możesz to zrobić, klikając „Stan” i wybierając „ :”, aby wyświetlić wyrażenie Lisp ... przed ostatnim nawiasem zamykającym:

(http . t)

Po tym szybko C-x C-si M-x org-reloadpowinno być wszystkim, czego potrzebujesz ..!


jak można używać ob-http do publikowania plików?
Anuvrat Parashar

2

Właśnie w tym celu napisałem httprepl. Zapewnia replikę opartą na poleceniach, w której można wydawać żądania HTTP.

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

Możesz łatwo dodawać funkcje, które wykorzystują wynik żądań. Są one zwykle używane do ładnego drukowania itp., Ale parsowanie do struktury elisp powinno być proste przy użyciu wbudowanej biblioteki json.


-1

Jest to całkowicie możliwe, ponieważ robię prawie dokładnie to samo. Jest jednak kilka zastrzeżeń. Przede wszystkim mam lokalną bibliotekę łatek xmlrpc.el . To rozwiązuje dwa problemy, niekompatybilność z nowoczesnymi emacami i możliwość przekazywania nagłówków uwierzytelniania w żądaniu. Dane, które przetwarzam, to JSON w XML, ale możesz być w stanie pominąć krok XML w zależności od konfiguracji.

Wszystkie ciężkie podnoszenie RPC odbywa się w lava-rpc.el, ale nie powinno być trudne do naśladowania. Możesz zobaczyć wezwanie do przesłania strunowego kawałka jsona tutaj .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.