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?

Ryan White
źródło
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")
    
kmicu
źródło
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 ..!

Archenoth
źródło
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.

Greg Sexton
źródło
-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 .

stsquad
źródło