最近公司和另外一个公司合作,该公司会定期给我们公司传送一批对我们公司有用的产品信息数据,并且要保存到数据库中,以备将来所用,当然这个任务就落在了我的身上。很快就写好了模型(用来保存产品信息的数据模型)以及接口函数,接口函数是以POST方式接收数据,写完接口函数后当然就是测试了,但是之前没测试过以post方式接收数据的api(原谅一个经验不丰富的人的无知。。。),但是还是让我找到了测试方法,不就是远程post方式提交表单嘛,网上很多例子,在此贴上我的代码,其实不难,理解了几个包的方法,这段代码还是很好理解的,如下
#coding=utf-8 import sys, urllib2, urllib,json user_agent = ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)‘ headers = { ‘User-Agent‘ : user_agent } info = [ { "id": 554888, "code": "85317", "partno": "xxx", "origin": "xxx", "product_name": "xxx", "type": "2" }, { "id": 554113, "hs_code": "8230099", "partno": "xxx", "origin": "xxx", "product_name": "xxx", "type": "2" } ] page = {"packetdata":info} page = json.dumps(page) url = ‘http://0.0.0.0:7000/api_recept_json_data/‘ data = urllib.urlencode(page) req = urllib2.Request(url,data,headers) fd = urllib2.urlopen(req,data) print fd.read()
然后运行这段代码,发现如果数据格式没错的话接收数据成功,而且数据库中会生成相应的记录,接着就是测试修复bug,增加异常处理机制等等,尽量使它能够处理各种在传送数据过程中出现的异常。然后就去向经理汇报,演示,经理看我演示完后,然后跟我说,这个测试代码有点不专业,叫我去了解一下curl命令。然后就在网上找资料学习,发现它确实是一个功能很强大的命令,个人觉得每个web后端开发人员都应该要掌握它。
curl命令可以看作是命令行浏览器,作用是发出网络请求,然后得到和提交数据,显示在标准输出上面,支持多种协议。
(1)查看网页源码
直接在curl命令后加上网址,就可以看到网页源码。我们以网址http://www.baidu.com为例,
curl http://www.baidu.com
如果要把这个网页保存下来,可以使用-o参数,curl -o [文件名] URL
如果文件不存在,会自动创建的,如果想同时获取多个文件,可使用命令
curl -o [文件名1] URL -o [文件名2] URL
-O参数,使用URL中默认文件名保存到本地
(2) 自动跳转
有的网址是自动跳转的。使用-L参数,curl就会跳转到新的网址。
比如有些网址,只有登陆了才能访问一些页面内容,此时加上这个参数,会直接跳转到登陆页面,然后获取登陆页面的源码
(3)显示头信息
-i参数可以显示http response的头信息,连同网页代码一起。
-I参数则只显示头信息
(4)显示通信过程
-v参数可以显示一次http通信的整个过程,包括端口连接和http request头信息。
如果你觉得上面的信息还不够,那么下面的命令可以查看更详细的通信过程。
curl --trace output.txt URL
或者
curl --trace-ascii output.txt URL
运行后,请打开output.txt文件查看。
(5)发送表单信息
发送表单信息有GET和POST两种方法。GET方法相对简单,只要把数据附在网址后面就行。
curl tvbs.cc/form.cgi?data=xxx
POST方法必须把数据和网址分开,curl就要用到--data参数。
比如上面例子可用如下形式命令
curl --data "packetage=[{"id": 554888,"code": "85317","partno": "xxx","origin": "xxx","product_name": "xxx","type": "2"},{"id": 554113,"hs_code": "8230099","partno": "xxx","origin": "xxx","product_name": "xxx","type": "2"}]" http://0.0.0.0:7000/api_recept_json_data/
如果你的数据没有经过表单编码,还可以让curl为你编码,参数是--data-urlencode。
如果该接口需要授权才能访问,就需要-u选项提供用户名和密码进行授权
curl -u username:password URL
(6)文件上传
可以用curl这样上传文件:
curl --form [email protected] --form press=OK [URL]
(7)Referer字段
有时你需要在http request头信息中,提供一个referer字段,表示你是从哪里跳转过来的。
curl --referer URL
(8)User Agent字段
这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。
比如下面的User Agent是
‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)‘
curl可以这样模拟:
curl --user-agent "[User Agent]" [URL]
(9)cookie
使用--cookie参数,可以让curl发送cookie。
curl --cookie "name=xxx" URL
至于具体的cookie的值,可以从http response头信息的Set-Cookie字段中得到。
(10)增加头信息
有时需要在http request之中,自行增加一个头信息。--header参数就可以起到这个作用。
curl --header "xxx: xxxxxx" URL
十一、HTTP认证
有些网域需要HTTP认证,这时curl需要用到--user/-u参数,前面提到过。
curl --use/-ur name:password URL