如何使用Emacs测试REST API?


34

我正在组装一个应用程序,并希望能够测试api端点。我认为Emacs是一种不错的选择-尤其是如果可以解析JSON响应并且在后续测试中使用返回数据的话。

关于如何解决这个问题的任何想法,或者这仅仅是疯狂的?


最简单的方法是调用curl shell命令,并使用json read解析结果。
马拉巴巴

Answers:


45
  • restclient是最“交互”的模式。

    这是一个手动浏览和测试HTTP REST Web服务的工具。从纯文本查询表运行查询,将结果显示为打印精美的XML,JSON甚至图像。

    休息客户

    您可以在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")
    

23

老问题,是的……但是如果有人用谷歌搜索这个,另一个选择是使用Org Babelob-http...(可以从melpa安装。)

使用org-babel,您可以制作一个.org包含“ http”代码块的文件。当评估这些块时,它们将发出HTTP请求并返回响应作为结果。

如果这些块具有“ #+NAME:”属性,则可以在其他任何org-babel块中使用它们的结果。这样就可以使用HTTP请求的结果进行一些简洁明了的编程。

例如,以下是一个Org小文档,它演示了发出HTTP请求并在Ruby中解析返回的JSON:

* 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

点击C-c C-c最下面的代码块(Ruby代码)会自动评估最上面:var的代码块的依赖关系(这就是代码块标题中的位)。这将意味着http首先发出请求,然后将结果传递给Ruby进行进一步处理。

您可以使用任意多的块和多种语言来完成此操作。

如果这符合您的需求,则ob-http在安装后需要进行一些手动调整才能使其正常工作。(不用担心,没有那么多)

安装后ob-http,您需要自定义两个变量:org-src-lang-modesorg-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应该是您所需要的..!


ob-http如何用于发布文件?
Anuvrat Parashar

2

我正是出于这个目的编写了httprepl。它为您提供了基于comint的repl,您可以在其中发出http请求。

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

您可以轻松添加使用请求结果的函数。这些通常用于漂亮的打印等,但是使用内置的json库解析为elisp结构应该很简单。


-1

完全有可能做,因为我自己几乎做同样的事情。虽然有一些警告。首先,我有一个本地补丁xmlrpc.el 。这解决了两个问题,即与现代emacs不兼容以及在请求中传递身份验证标头的能力。我正在处理的数据是XML格式的JSON,但您可以根据设置跳过XML步骤。

所有繁重的RPC提升都是在lava-rpc.el中完成的,但并不难遵循。您可以在此处看到提交字符串化json的调用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.