描述
写道
经过一天的资料查看及测试,已经可以成功的在jiayou3中调用icgoo的数据....
我这里的测试是通过get方式向接口传递几个参数后返回型号在icgoo的实时报价数据...
我这里的测试是通过get方式向接口传递几个参数后返回型号在icgoo的实时报价数据...
准备工作
写道
项目 jiayou3 + v45
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文件
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()