Git Product home page Git Product logo

walkman's Introduction

MELPA abrochard

Walkman

Write HTTP requests in Org mode and replay them at will using cURL

walkman demo gif

Features

  • write HTTP requests as org mode "walkman entries"
  • execute walkman entries via curl
  • export walkman entries to a curl command
  • import curl command to walkman entries (beta)
  • support lisp variable or functions in a walkman entry
  • execute a series of lisp callbacks, passing the status code, headers, and response body

Installation

Load up the walkman.el file.

Usage

By default, after calling M-x walkman-setup, these bindings will be added to org-mode:

C-c C-RETURN   to execute the entry at point
C-c C-'        for the walkman menu
C-c C-' c      to copy the entry at point as a curl command
C-c C-' i      to import a curl command and insert as walkman entry

How to write a walkman entry

See the sample.org file for example of walkman entries.

The general structure is

* Request Title
  GET/POST/PUT/... URL
  - Header1: value
  - Header2: value
  :FORM:
  - type: document
  - file: [[/home/user/document.jpg]]
  :END:
  #+begin_src
    {
      "body": "in any mode/format"
    }
  #+end_src
  1. First Callback
     #+begin_src emacs-lisp
       (lambda (status headers body)
         (message "status %s, headers %s, body %s" status headers body))
     #+end_src
  2. Second Callback
     #+begin_src emacs-lisp
       (lambda (status headers body)
         (message "Second callback"))
     #+end_src

Note that only the HTTP action and URL are required, everything else is up to you.

Simple GET request

* Simple GET request
  GET https://httpbin.org/get

Simple POST request with JSON body

* Simple POST request
  POST https://httpbin.org/post
  - Accept: application/json
  - Content-Type: application/json
  #+begin_src json
    {
      "data": {
        "title": "Hello",
        "hello": "world"
      }
    }
  #+end_src

Multipart upload

You can upload multipart document using the :FORM: Org drawer syntax:

* Multi part
  POST https://httpbin.org/post
  - Accept: application/json
  :FORM:
  - type: document
  - file: [[/home/username/sample_document.jpg]]
  :END:

will result in

curl --silent -i -X POST https://httpbin.org/post -F 'file=@/home/username/sample_document.jpg' -F 'type=document' -H 'Accept: application/json'

Things to know:

  1. Headers inside the org drawer :FORM: will be set with the curl -F flag for form
  2. org links to file will get their path prefixed with a @
  3. :FORM: headers must be AFTER regular headers for the parser to work properly

This is an example that will not work:

* Wrong multi part
  POST https://httpbin.org/post
  :FORM:
  - file: [[/home/username/sample_document.jpg]]
  :END:
  - Accept: application/json

because the Accept header will not be parsed correctly.

Request with lisp variable

Define my-http-status with

(setq my-http-status "400")

OR specify a file variable and run

* Embedded lisp variable
  GET https://httpbin.org/status/`my-http-status`

Request with callbacks

* Request with callbacks
  POST https://httpbin.org/post
  #+begin_src json
    {
      "some": "body"
    }
  #+end_src
  1. First callback
     #+begin_src emacs-lisp
       (lambda (status headers body)
         (message "status %s, headers %s, body %s" status headers body))
     #+end_src
  2. Second callback
     #+begin_src emacs-lisp
       (lambda (status headers body)
         (pp (assoc 'url (json-read-from-string body))))
     #+end_src

Customization

Always keep the headers

If you don't want to bother with the -v flag to keep the headers in the response buffer, you can do

(setq walkman-keep-headers t)

Custom key bindings

By default, running walkman-setup will run

(define-key org-mode-map (kbd "C-c C-'") #'walkman-transient)
(define-key org-mode-map (kbd "C-c <C-return>") #'walkman-at-point)

If you want to setup your own binding, don't run walkman-setup and instead bind

  • walkman-at-point for quick execution under the cursor
  • walkman-transient for the transient-based interactive menu

TODO

  • insert response in org doc?
  • execute all requests sequentially
  • unit tests
  • option to run async
  • multiple backends

Similar projects

walkman's People

Contributors

abrochard avatar conao3 avatar dcaixinha avatar stig avatar tarsius avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.