描述
我这里的测试是通过get方式向接口传递几个参数后返回型号在icgoo的实时报价数据...
准备工作
1.下载django-piston,并将该app放到项目的根目录下;
2.在项目根目录下新建一个名字为API的app,我在里面创建了五个文件;
2.1 : __init__.py 空
2.2 : handlers.py 用来存放接口的定义
2.3 : urls.py 用来存放接口的url
2.4 : authentication.py 用来存放权限校验类,我是从piston里copy过来的,在其中加了一个自定义校验
2.5 : my_pycurl.py 是一个封装了curl操作的方法,供调用接口里使用
3.在根urls加入 url(r'^api/', include('API.urls', namespace='django-piston')),
## 因为这次做接口不是单纯的发送或单纯的接收,所以上面3步,我分别在jiayou3与v45各做了一份;其中v45使用了handler.py,urls.py,authentication.py三个文件,而jiayou3使用了my_pycurl.py文件
从url开始
每一个接口都是一个url,它对应着get,post,put,delete各种操作,各不侵犯,严格遵守;
#v45->API->urls.py
#coding=utf-8
from django.conf.urls.defaults import *
from piston.resource import Resource
from authentication import CustomAuthentication , HttpBasicAuthentication
from handlers import DataFromIcgooHandler
#提示信息'jiayou3',这个basic验证会调用系统的auth来进行匹配,成功即通过;
_auth = CustomAuthentication(realm='jiayou3')
_AUTHENTICATORS = [_auth]
datafromicgoo_handler = Resource(DataFromIcgooHandler,authentication=_AUTHENTICATORS)
urlpatterns = patterns('',
url(r'^data_from_icgoo/', datafromicgoo_handler, { 'emitter_format': 'json' }),
)
## 解释一下
## 接口url就是 '/api/data_from_icgoo/';
## 在handlers 里定义了一下 DataFromIcgooHandler类,用来驱动这个接口,下面会讲到;
## 同时要调用这个接口还需要通过验证,authentication=_AUTHENTICATORS , 必须是我定义的用户名及密码才可以通过;
## CustomAuthentication就是我自定义的一个验证方法
## 'emitter_format': 'json' 表示返回的数据是json,你还可以自定义为yaml,xml等
hanlder开始工作
# v45->API->handlers.py
#coding=utf-8
from piston.handler import BaseHandler
from ajax_show_stock.jiayou import JiayouInterface
class DataFromIcgooHandler(BaseHandler):
allowed_methods = ('GET',)
def read(self, request):
'''
根据参数返回icgoo的实时数据
'''
if request.method == 'GET':
data = request.GET
else:
data = request.POST
partno = data.get('partno','')
quantity = data.get('quantity',1)
try:
quantity = int(quantity)
except Exception,e:
quantity = 1
supplier = data.get('supplier','999')
real = data.get('real','0')#'1'为去官网找原始数据(主要是我们没有,mouser等官网有的)
if real == '0':
real = False
else:
real = True
test = JiayouInterface(partno,quantity)
if supplier == '999':
supplier = None
if not real:
results = test.getAllPriceToJiayou(supplier,True)
else:
results = test.getRealTimeToJiayou(supplier)
return results
# allowed_methods = ('GET',) 表示个接口只允许get操作,如果你还需要别的操作自行添加,如 allowed_methods = ('GET','POST','DELETE',)
# GET操作会自动去寻找read函数,同理POST等也有其对应的函数名;
# 获取参数后就就可以开始一系列的动作了,然后将值返回即可,返回的是一个json字符串,到时候你可以用json.loads(results)进行结构还原;
看到这里是不是很简单,不错,此时这个接口已经定义好了,就等着别人来使用它们了.......
使用接口
jiayou3 -> sale -> views.py
## 在需要使用该接口的地方类似以下调用即可;
if request.method == 'GET':
paras = request.GET
else:
paras = request.POST
url = 'http://localhost:8000/api/data_from_icgoo/?' + urllib.urlencode(paras)
data = request_curl(url,'GET')
## request_curl 就是 my_pycurl.py里的一个方法,它用来接用接口
## data 就对应着我们上面 handlers里的返回的 results
my_pycurl.py
import pycurl
import StringIO
import urllib
USERNAME = 'admin'
PASSWD = 'admin'
HOST = 'http://localhost:8000'
def request_curl(url, request_method='GET', **data):
url = url.encode('utf-8', 'ignore')
curl = pycurl.Curl()
res = StringIO.StringIO()
curl.setopt(pycurl.URL, url)
curl.setopt(pycurl.WRITEFUNCTION, res.write)
#curl.setopt(pycurl.FOLLOWLOCATION,1)
curl.setopt(pycurl.USERPWD, '%s:%s' % (USERNAME, PASSWD))
if request_method == 'POST':
curl.setopt(pycurl.POSTFIELDS, urllib.urlencode(data))
elif request_method == 'PUT':
curl.setopt(pycurl.PUT, 1)
elif request_method == 'DELETE':
curl.setopt(pycurl.CUSTOMREQUEST, 'delete')
else:
curl.setopt(pycurl.HTTPGET, 1)
#This will tell libcurl not to use any signal related code that causes in a multithreaded python script this kind of error.
curl.setopt(pycurl.NOSIGNAL, 1)
curl.setopt(pycurl.MAXREDIRS,5)
#-----------
curl.setopt(pycurl.CONNECTTIMEOUT,30)
curl.setopt(pycurl.TIMEOUT,60)
#------
#curl.setopt(pycurl.USERAGENT,'Mozilla/5.0(Windows;U;Windows NT 5.1;zh-CN;rv:1.9.2.9)Gecko/20100824 Firefox/3.6.9')
curl.perform()
#print type(res.getvalue())
return res.getvalue()