Как протестировать REST API с Emacs?

34

Я собираю приложение, и хочу иметь возможность проверить конечные точки API. Я подумал, что Emacs был бы отличным способом - особенно если бы можно было проанализировать ответы JSON и данные возврата, использованные в последующих тестах.

Есть идеи, как это сделать, или это просто безумие?

Райан Уайт
источник
Самый простой способ - вызвать команду оболочки curl и проанализировать результаты с помощью json read.
Малабарба

Ответы:

45
  • restclient - самый «интерактивный» режим.

    Это инструмент для ручного исследования и тестирования веб-сервисов HTTP REST. Запускает запросы из простого текстового листа запросов, отображает результаты в виде распечатанного XML, JSON и даже изображений.

    restclient

    Вы можете проверить пример рабочего процесса на http://jakemccrary.com/blog/2014/07/04/using-emacs-to-explore-an-http-api/ .

  • request.el - 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 - «Идея в том, чтобы всегда использовать обратные вызовы для сбора ответа».

    Форма обратного вызова JSON позволяет собирать только данные:

    ;; -*- lexical-binding: t -*-
    (require 'web)
    
    (web-json-post 
      (lambda (data &rest stuff)
         (message "%S" data))
      :url "https://httpbin.org/post")
    
kmicu
источник
23

Старый вопрос, да ... Но в том случае, если кто-нибудь гуглит это; другой вариант использует Org Babel и ob-http... (может быть установлен из melpa .)

С помощью org-babelвы можете создать .orgфайл, содержащий " http" блоки кода. Когда эти блоки оценены, они сделают HTTP-запрос и вернут ответ как результат.

Если эти блоки имеют #+NAME:атрибут " ", вы можете использовать их результаты в любом другом org-babelблоке. Это позволяет довольно аккуратно и грамотно программировать, используя результаты HTTP-запросов.

Например, вот небольшой документ Org, демонстрирующий выполнение HTTP-запроса и анализ возвращаемого JSON в 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.

Вот как это выглядит в org-mode: ob-http в режиме org

Нажатие C-c C-cна нижний блок (Ruby) автоматически оценивает верхний :varблок на предмет его зависимости (это бит в заголовке блока). Это будет означать, что httpсначала выполняется запрос, а затем результаты передаются в Ruby для дальнейшей обработки.

Вы можете сделать это с таким количеством блоков, сколько хотите, и с таким количеством языков.

Если это соответствует вашим потребностям, для его работы ob-httpтребуется небольшая ручная настройка после установки. (Не волнуйтесь, это не так уж много)

После установки ob-httpвам нужно настроить две переменные:, org-src-lang-modesи org-babel-load-languages.

Таким образом, запустив M-x customize-variable, вы можете настроить каждый, чтобы включить следующее:

org-src-lang-modes: Вы захотите настроить эту переменную так, чтобы она включала еще одно сопоставление языков, поэтому вы можете вставить еще одно значение в конец списка:

String: http
Symbol: ob-http

Затем вы можете C-x C-sсохранить эту настройку.

org-babel-load-languages: Вы хотите добавить еще один элемент в список включенных orgязыков. " http"

Хотя вам может понадобиться добавить его в список вручную, если этот параметр отсутствует в возможных параметрах, вы можете сделать это, нажав «Состояние» и выбрав « :», чтобы отобразить выражение Lisp ... Затем вы добавите следующее перед последней закрывающей скобкой:

(http . t)

После этого по быстрому C-x C-sи M-x org-reloadдолжно быть все что нужно ..!

Archenoth
источник
как ob-http можно использовать для публикации файлов?
Ануврат Парашар
2

Я написал httprepl именно для этой цели. Он предоставляет вам репл на основе коминт, где вы можете отправлять http запросы.

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

Вы можете легко добавлять функции, которые потребляют результат запросов. Они обычно используются для красивой печати и т. Д., Но синтаксический анализ структуры elisp должен быть простым с использованием встроенной библиотеки json.

Грег Секстон
источник
-1

Это вполне возможно, потому что я сам делаю почти то же самое. Есть несколько предостережений, хотя. Прежде всего, у меня есть локально исправленная библиотека xmlrpc.el . Это решает две проблемы: несовместимость с современными emacs и возможность передавать заголовки аутентификации в запросе. Данные, которые я обрабатываю, - это JSON в XML, но вы можете пропустить шаг XML в зависимости от ваших настроек.

Весь тяжелый RPC-лифтинг выполняется в lava-rpc.el, но за ним не должно быть никаких трудностей. Вы можете увидеть призыв отправить строковый фрагмент json здесь .

stsquad
источник