Bagaimana cara menguji REST API dengan Emacs?

34

Saya sedang menyusun aplikasi, dan ingin dapat menguji titik akhir api. Saya pikir Emacs akan menjadi cara yang keren untuk pergi - terutama jika respons JSON dapat diuraikan dan data pengembalian digunakan dalam tes berikutnya.

Ada ide tentang bagaimana cara melakukannya, atau ini gila?

Ryan White
sumber
Cara termudah adalah dengan memanggil perintah shell curl, dan hasil parse dengan json read.
Malabarba

Jawaban:

45
  • restclient adalah mode paling "interaktif".

    Ini adalah alat untuk menjelajahi dan menguji layanan web HTTP REST secara manual. Menjalankan kueri dari lembar kueri teks biasa, menampilkan hasil sebagai XML, JSON, dan bahkan gambar yang dicetak dengan cantik.

    restclient

    Anda dapat memeriksa contoh alur kerja di http://jakemccrary.com/blog/2014/07/04/using-emacs-to-explore-an-http-api/ .

  • request.el - HTTP swiss knife.

    (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 - "Idenya adalah untuk selalu menggunakan panggilan balik untuk mengumpulkan respons."

    Formulir panggilan balik JSON memungkinkan data yang dikumpulkan:

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

Pertanyaan lama, ya ... Tetapi jika ada orang Google ini; opsi lain menggunakan Org Babel dan ob-http... (Dapat diinstal dari melpa .)

Dengan org-babel, Anda dapat membuat .orgfile yang berisi " http" blok kode. Ketika blok ini dievaluasi, mereka akan membuat permintaan HTTP dan mengembalikan respons sebagai hasilnya.

Jika blok ini memiliki #+NAME:atribut " ", Anda dapat menggunakan hasilnya di org-babelblok lain . Hal ini memungkinkan untuk beberapa pemrograman melek yang cukup rapi menggunakan hasil permintaan HTTP.

Misalnya, berikut ini adalah dokumen Org kecil yang menunjukkan pembuatan permintaan HTTP dan menguraikan JSON yang dikembalikan di 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.

Ini adalah seperti apa ini org-mode: ob-http dalam mode-org

Memukul C-c C-cdi blok bawah (Yang Ruby) akan secara otomatis mengevaluasi yang teratas untuk ketergantungannya (Itulah :varbit di header blok.). Ini berarti bahwa httppermintaan dibuat terlebih dahulu, dan kemudian hasilnya diteruskan ke Ruby untuk diproses lebih lanjut.

Anda dapat melakukan ini dengan blok sebanyak yang Anda suka dan dengan banyak bahasa.

Jika ini sesuai dengan kebutuhan Anda, ob-httpperlu sedikit penyesuaian manual setelah Anda menginstalnya agar berfungsi. (Jangan khawatir, itu tidak banyak)

Setelah menginstal ob-http, Anda perlu menyesuaikan dua variabel:, org-src-lang-modesdan org-babel-load-languages.

Jadi, dengan menjalankan M-x customize-variable, Anda dapat menyesuaikan masing-masing untuk menyertakan yang berikut:

org-src-lang-modes: Anda ingin menyesuaikan variabel ini untuk memasukkan satu lagi pemetaan bahasa, sehingga Anda bisa memasukkan satu nilai lagi ke akhir daftar:

String: http
Symbol: ob-http

Maka Anda dapat C-x C-smenyimpan penyesuaian itu.

org-babel-load-languages: Anda akan ingin menambahkan satu item lagi ke daftar orgbahasa yang diaktifkan . " http".

Meskipun, Anda mungkin perlu menambahkannya ke daftar secara manual jika opsi tersebut tidak ada dalam opsi yang memungkinkan, Anda dapat melakukannya dengan mengklik "Status" dan memilih " :" untuk menampilkan ekspresi Lisp ... Kemudian Anda akan menambahkan yang berikut hanya sebelum tanda kurung penutupan terakhir:

(http . t)

Setelah itu, cepat C-x C-sdan M-x org-reloadharus semua yang Anda butuhkan ..!

Archenoth
sumber
bagaimana ob-http dapat digunakan untuk mengirim file?
Anuvrat Parashar
2

Saya menulis httprepl untuk tujuan ini. Ini memberi Anda pengganti berbasis comint di mana Anda dapat mengeluarkan permintaan http.

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

Anda dapat dengan mudah menambahkan fungsi yang mengonsumsi hasil permintaan. Ini biasanya digunakan untuk mencetak cantik dll tetapi parsing ke struktur elisp harus sederhana menggunakan builtin json library.

Greg Sexton
sumber
-1

Sangat mungkin untuk dilakukan karena saya melakukan hampir hal yang sama sendiri. Ada beberapa peringatan. Pertama-tama saya memiliki pustaka xmlrpc.el patch lokal . Ini memecahkan dua masalah, ketidakcocokan dengan emacs modern dan kemampuan untuk meneruskan header otentikasi dalam permintaan. Data yang saya proses adalah JSON dalam XML tetapi Anda mungkin dapat melewati langkah XML tergantung pada pengaturan Anda.

Semua pengangkatan RPC berat dilakukan di lava-rpc.el tetapi seharusnya tidak sulit untuk diikuti. Anda dapat melihat panggilan untuk mengirimkan sepotong json yang diikat di sini .

stsquad
sumber