Skip to content

Instantly share code, notes, and snippets.

@mdeous
Created December 26, 2013 18:32
Show Gist options
  • Save mdeous/8137130 to your computer and use it in GitHub Desktop.
Save mdeous/8137130 to your computer and use it in GitHub Desktop.
Si t'as une API, prend un curly!
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# curly.py - Easily communicate with JSON APIs.
#
# TODO:
# - allow any http method
# - output equivalent curl command
# - allow http basic auth
#
from argparse import ArgumentParser
from urllib import urlencode
from urllib2 import build_opener, HTTPError
from pygments import highlight
from pygments.lexers import JsonLexer
from pygments.formatters import TerminalFormatter
COLOR_CODES = {
'green': '\033[32m',
'bgreen': '\033[1;32m',
'bgrey': '\033[1;30m',
'reset': '\033[0m'
}
def color(text, color):
return COLOR_CODES[color]+text+COLOR_CODES['reset']
def extract_values(values, rtype=dict):
exploded = map(lambda s: s.split('='), values)
return rtype(exploded)
ap = ArgumentParser(description="Easily communicate with JSON APIs")
ap.add_argument(
"url",
help="API endpoint to hit",
metavar="URL"
)
ap.add_argument(
"--post",
help="POST data to send with request",
nargs="*",
metavar="DATA"
)
ap.add_argument(
"--headers",
help="Headers to add to the request",
nargs="*",
metavar="HEADER"
)
args = ap.parse_args()
opener = build_opener()
if args.post is not None:
args.post = urlencode(extract_values(args.post))
if args.headers is not None:
args.headers = extract_values(args.headers, rtype=tuple)
opener.addheaders = args.headers
try:
resp = opener.open(args.url, data=args.post)
except HTTPError as err:
resp = err
print color("----- REQUEST -----", "green")
print "URL:", color(args.url, "bgreen")
if args.post is not None:
print "Data:", color(args.post, "bgreen")
if args.headers is not None:
print "Headers:"
for k, v in args.headers:
print " -", color("%s: %s" % (k, v), "bgreen")
print ""
print color("----- RESPONSE: %d -----" % resp.code, "green")
print resp.headers
print highlight(resp.read(), JsonLexer(), TerminalFormatter())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment