Como testar a API REST com o Emacs?

34

Estou montando um aplicativo e quero poder testar os pontos finais da API. Imaginei que o Emacs seria um ótimo caminho a percorrer - especialmente se as respostas JSON pudessem ser analisadas e os dados de retorno usados ​​em testes subsequentes.

Alguma idéia de como fazer isso, ou isso é loucura?

Ryan White
fonte
A maneira mais fácil é chamar um comando curl shell e analisar os resultados com o json read.
Malabarba 22/10

Respostas:

45
  • restclient é o modo mais "interativo".

    Esta é uma ferramenta para explorar e testar manualmente os serviços da Web HTTP REST. Executa consultas a partir de uma planilha de consulta em texto sem formatação, exibe os resultados como XML, JSON e imagens pares bastante impressas.

    restclient

    Você pode verificar um exemplo de fluxo de trabalho em http://jakemccrary.com/blog/2014/07/04/using-emacs-to-explore-an-http-api/ .

  • request.el - faca suíça 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 - "A idéia é sempre usar retornos de chamada para coletar a resposta."

    O formulário de retorno de chamada JSON permite que apenas os dados sejam coletados:

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

Pergunta antiga, sim ... Mas no caso de alguém pesquisar no Google; outra opção é usar o Org Babel e ob-http... (Pode ser instalado a partir do melpa .)

Com org-babel, você pode criar um .orgarquivo contendo " http" blocos de código. Quando esses blocos são avaliados, eles fazem a solicitação HTTP e retornam a resposta como resultado.

Se esses blocos tiverem um #+NAME:atributo " ", você poderá usar os resultados em qualquer outro org-babelbloco. Isso permite uma programação alfabética bastante elegante usando os resultados de solicitações HTTP.

Por exemplo, aqui está um pequeno documento organizacional demonstrando a solicitação HTTP e a análise do JSON retornado no 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.

Isto é o que parece em org-mode: ob-http no modo organizacional

Bater C-c C-cno bloco inferior (o Ruby) avaliará automaticamente :varo bloco superior quanto à sua dependência (esse é o bit no cabeçalho do bloco). Isso significa que a httpsolicitação é feita primeiro e, em seguida, os resultados são passados ​​ao Ruby para processamento adicional.

Você pode fazer isso com quantos blocos desejar e com quantos idiomas.

Se isso atender às suas necessidades, será ob-httpnecessário um pouco de ajustes manuais após a instalação para que funcione. (Não se preocupe, não é tanto assim)

Após a instalação ob-http, você precisa personalizar duas variáveis:, org-src-lang-modese org-babel-load-languages.

Portanto, executando M-x customize-variable, você pode personalizar cada um para incluir o seguinte:

org-src-lang-modes: Você deseja personalizar essa variável para incluir mais um mapeamento de idioma, para poder inserir mais um valor no final da lista:

String: http
Symbol: ob-http

Então você pode C-x C-ssalvar essa personalização.

org-babel-load-languages: Você deseja adicionar mais um item à lista de orgidiomas ativados . " http"

No entanto, pode ser necessário adicioná-lo à lista manualmente, se a opção não estiver nas opções possíveis, você pode fazer isso clicando em "State" e escolhendo " :" para mostrar a expressão Lisp ... Em seguida, adicione o seguinte apenas antes do último parêntese de fechamento:

(http . t)

Depois disso, um rápido C-x C-se M-x org-reloaddeve ser tudo o que você precisa ..!

Archenoth
fonte
como o ob-http pode ser usado para postar arquivos?
Anuvrat Parashar
2

Escrevi o updprepl exatamente para esse fim. Ele fornece uma substituição baseada em comint, na qual você pode emitir solicitações http.

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

Você pode facilmente adicionar funções que consomem o resultado de solicitações. Eles geralmente são usados ​​para imprimir bastante etc, mas a análise de uma estrutura elisp deve ser simples usando a biblioteca json embutida.

Greg Sexton
fonte
-1

É perfeitamente possível, porque eu mesmo faço quase exatamente a mesma coisa. Existem algumas ressalvas. Primeiro de tudo, tenho uma biblioteca xmlrpc.el com patch local . Isso resolve dois problemas, uma incompatibilidade com o emacs moderno e a capacidade de passar cabeçalhos de autenticação na solicitação. Os dados que estou processando são JSON em XML, mas você pode pular a etapa XML, dependendo da sua configuração.

Todo o levantamento pesado de RPC é feito no lava-rpc.el, mas não deve ser difícil de seguir. Você pode ver a chamada para enviar uma parte estrita de json aqui .

stsquad
fonte