GET RESTful With Python
Python调用RESTful:http://blog.akiban.com/get-restful-with-python/
本文就是参考该英文做了一下试验,后续补充一下翻译。
This post will take a look at our REST API by creating a Python script to interact with the entity endpoint.
One of the key benefits of using standard technologies, formats, and protocols is the incredible amount of existing tooling that you get for free. Since we’ve been busy building our new service, backed by our ever changing database, we haven’t gotten around to client libraries yet.
However, we do speak JSON through REST over HTTPS. Every language already has battle hardened libraries for working with those. For Python, it doesn’t get much better than the requests library. Their motto is HTTP for Humans and it makes working with RESTful services a breeze.
需求:
As in Schemaless SQL, we’ll be using a DataSpace with a single entity named hopes.
On the service side, just copy and deploy the hopes DataSpace and make note of the credentials.
On the client side, we just need to install the requests library.
$ pip install requests
Hello, World
We’ll be using an external JSON configuration file, named config.json, for simplicity. Create the JSON files as below with real values from the Deployments page.
{
"host": "host",
"port": "port",
"user": "user",
"pass": "pass"
}
The simplest endpoint exposed by the Akiban Server is version. It has no dependencies and will always work if valid credentials are supplied.
We’ll start our script, named akiban_rest.py, with the code below to load our configuration and execute a version request.
import json
import requests config = {}
with open('config.json') as cfg:
config = json.load(cfg) resp = requests.get(
'https://%s:%s/v1/version' % (config['host'], config['port']),
auth = (config['user'], config['pass'])
) print resp.text
Running that will give output like below, though the specific server_version may vary.
$ python akiban_rest.py
[{"server_name":"Akiban Server","server_version":"1.6.1-SNAPSHOT.2606"}]
Congrats! You're now talking to the Akiban REST API. We'll be wrapping the rest of the Entity Resources to provide convenient access from the command line.
Helpers
A few helpers are in order. One for building the URI string, one for pretty-printing our JSON response, and a variable for holding the configured credentials.
def url(endpoint):
return 'https://%s:%s/v1%s' % (config['host'], config['port'], endpoint) def dump(response):
print json.dumps(json.loads(response.text), indent=2) AUTH = (config['user'], config['pass'])
Commands and Arguments
The overall script architecture will be quite simple. A single function per endpoint we're exposing, a map to name it, and very simple command line argument handling.
Note that a real library would want a number of things that have been omitted for brevity, such as argument checking and specific error messages.
def version():
return requests.get(url('/version'), auth=AUTH) commands = {
'version': version
} cmd_name = sys.argv[1]
cmd_args = sys.argv[2:]
cmd = commands.get(cmd_name)
resp = cmd(*cmd_args)
dump(resp) We can now run the version command.
$ python akiban_rest.py version
[
{
"server_version": "1.6.1-SNAPSHOT.2606",
"server_name": "Akiban Server"
}
]
GET and POST
Now we can begin interacting with our hopes entity. New methods for retrieving all, or specific, instances with GET and creating a new instance with POST.
def entity_get_all(entity):
return requests.get(url('/entity/%s' % entity), auth=AUTH) def entity_get(entity, ids):
return requests.get(url('/entity/%s/%s' % (entity, ids)), auth=AUTH) def entity_post(entity, json):
return requests.post(url('/entity/%s' % entity), data=json, auth=AUTH) commands = {
'version': version,
'all': entity_get_all,
'get': entity_get,
'create': entity_post
}
The create, get, and get_all commands now function.
$ python akiban_rest.py create hopes '{"desc": "Part IV: A New Hope", "date": "2013-04-04 16:58:30", "bumpcount": 0}'
{
"id": 1
}
$ python akiban_rest.py create hopes '{"desc": "Another", "date": "2013-04-04 16:58:35", "bumpcount": 0}'
{
"id": 2
}
$ python akiban_rest.py get hopes 1
[
{
"date": "2013-04-04 16:58:30",
"bumpcount": 0,
"id": 1,
"desc": "Part IV: A New Hope"
}
]
$ python akiban_rest.py all hopes
[
{
"date": "2013-04-04 16:58:30",
"bumpcount": 0,
"id": 1,
"desc": "Part IV: A New Hope"
},
{
"date": "2013-04-04 16:58:35",
"bumpcount": 0,
"id": 2,
"desc": "Another"
}
]
PUT and DELETE
We can now finish out the entity endpoint by adding commands for replacing and deleting. Note that the dump has been tweaked to handle no_content responses, like delete.
def dump(response):
if response.status_code != requests.codes.no_content:
print json.dumps(json.loads(response.text), indent=2) def entity_put(entity, ids, json):
return requests.put(url('/entity/%s/%s' % (entity, ids)), data=json, auth=AUTH) def entity_delete(entity, ids):
return requests.delete(url('/entity/%s/%s' % (entity, ids)), auth=AUTH) commands = {
'version': version,
'all': entity_get_all,
'get': entity_get,
'create': entity_post,
'replace': entity_put,
'delete': entity_delete
}
And to demonstrate.
$ python akiban_rest.py replace hopes 2 '{"id": 2, "desc": "A better name", "date": "2013-04-04 16:58:35", "bumpcount": 100}'
{
"id": 2
}
$ python akiban_rest.py delete hopes 1
$ python akiban_rest.py all hopes
[
{
"date": "2013-04-04 16:58:35",
"bumpcount": 100,
"id": 2,
"desc": "A better name"
}
]
Summary
We started out with an empty DataSpace and a blank akiban_rest.py file. After loading our example hope and deploying it, we could start to interact with it through a simple REST call. Fifty lines of Python later and we now have a respectable command line script for viewing, creating, updating, and deleting our entities.
All of the code from this post is available in this Gist. Who knows, this might just grow into our Python client library!
android调用RESTful:http://bbs.it-home.org/thread-10447-1-1.html
GET RESTful With Python的更多相关文章
- openstack命令行
openstack的每一个子项目(project)都有自己对应的命令行API,所有的这些API都是基于RESTful的,python代码实现的API.也就是说,这些API都是基于HTTP实现的,所以A ...
- 使用Empire自动获取域管理员
使用Empire自动获取域管理员 译:backlion 前言 自从Empire和BloodHound被应用来,对AD渗透已经可以获取到内网环境95%的信息量.作者发现自己一遍又一遍地在做同样重复的事 ...
- TDengine概述以及架构模型
TDengine TDengine是一个高效的存储.查询.分析时序大数据的平台,专为物联网.车联网.工业互联网.运维监测等优化而设计. 您可以像使用关系型数据库MySQL一样来使用它. TDengin ...
- 使用python的Flask实现一个RESTful API服务器端[翻译]
最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...
- Python flask 基于 Flask 提供 RESTful Web 服务
转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...
- python Eve RESTFul 尝试笔记
0.前言 最近重点研究了yeelink平台的原理和使用,yeelink平台和多数云平台设计一样应用了RESTFul框架.嵌入式侧(或者是客服端侧)的相关技术研究的比较充分(个人这么认为),是不是该弄弄 ...
- 使用python的Flask实现一个RESTful API服务器端
使用python的Flask实现一个RESTful API服务器端 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文 ...
- 让python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求
这两天在用python的bottle框架开发后台管理系统,接口约定使用RESTful风格请求,前端使用jquery ajax与接口进行交互,使用POST与GET请求时都正常,而Request Meth ...
- 使用 Python & Flask 实现 RESTful Web API
环境安装: sudo pip install flask Flask 是一个Python的微服务的框架,基于Werkzeug, 一个 WSGI 类库. Flask 优点: Written in Pyt ...
随机推荐
- HDU 4891 The Great Pan
模拟题. #include<map> #include<set> #include<ctime> #include<cmath> #include< ...
- logging模块介绍
在我们的实际开发过程中,我们有时候需要记录一些重要操作,或者程序运行情况,我们就需要在程序里面写入日志,来达到更快的排错跟记录重要操作的目的.在Python中logging模块就很好的解决了这个问题, ...
- 四川oi 萌萌哒 (分层并查集)
萌萌哒 时间限制: 1 Sec 内存限制: 256 MB提交: 12 解决: 2[提交][状态][讨论版] 题目描述 一个长度为 n 的大数,用 S1S2S3...Sn表示,其中 Si表示数的第 ...
- leetcode88 Merged Sorted Array
题意:两个已排好序的数组,合并成新的数组. 解题思路:刚开始做题,完全找不到思路,想用最简单的插入法做,提示超时了大概是for用多了哈哈··看了下别人的方法果断佩服,利用好已排序这个特点,从后往前添加 ...
- UML动态模型(顺序图、协作图、状态图)
顺序图:用来表示用例中的行为顺序,当执行一个用例行为时,顺序图中的每条信息 对应了一个类操作或状态机中引起转换的事件.顺序图展示对象之间的交互,这些交互是指在场景或用例的时间六中发生的,顺序图属于动态 ...
- JZYZOJ1349 SPOJ839 星屑幻想 xor 网络流 最大流
http://172.20.6.3/Problem_Show.asp?id=1349 调了两个小时发现数组开小了[doge].题意:给出几个点,有的点的权值确定,连接两点的边的权值为两点值的异或和,求 ...
- 数据库系统入门 | Oracle Linux上部署Oracle 11g服务,并实现SSH远程登录管理
文章目录 写在前面 一.实验内容 二.实验前期准备 1.软件目录 2.准备一些配置文件.脚本文件 三.实验方案(具体步骤) (一)在虚拟机上安装Oracle Linux (二)在Linux上安装Ora ...
- Codeforces Round #345 (Div. 1) D. Zip-line 上升子序列 离线 离散化 线段树
D. Zip-line 题目连接: http://www.codeforces.com/contest/650/problem/D Description Vasya has decided to b ...
- (转)c#中判断是不是数字和字母
一.判断字母string str = Console.ReadLine();if (char.isLetter(str)){ }else if (char.IsDigit(str)){ }if(ch& ...
- Sqlserver数据库还原.bak文件失败的两个问题
一.SQL Server数据库备份还原后,在数据库名称后会出现“受限制访问”字样 解决方案:将数据库限制访问改为:SINGLE_USER 数据库-->属性-->选项-->状 ...