|
1 h" J$ R$ _/ I. T' y/ u
pycURl是python编写的ibcurl.的接口,今天在使用的时候,出现了一个小问题,我发送的数据对方无法正常接收,后来才知道是content-type设置不正确的原因.pyCURL默认的Content-Type是 ( c! U( w5 M4 o M
application/x-www-form-urlencoded,也就是说,如果没有明确设定,则发送的数据是url编码之后的数据.可是如果用这个工具发送json字符串 的request body,则必须显式指定json对应的内容类型
2 K; f3 D c" T$ Z5 B1 r Content-Type:application/json;charset=xxxx,否则接收方收到的数据是错误的.以下是我写的一个简易curl,具有基本的获取响应数据,和上传文件,携带cookie,保存cookie等功能.
" q8 \, Q3 [( y' q6 ^. { import osimport pycurlimport urllibfrom StringIO import StringIOurl:请求的urlcookies:携带的cookieposdata:请求体,可以是字符串,或者其他可以urlencode的类型uploadfiles:上传文件的参数,格式为{name:filename,path:filepath}referer:来源httpheader:自定义header头ua:客户端代理名cookiejar:存储请求响应后的cookie的文件路径customrequest:自定义请求方法注意:1.暂时没有进行ssl验证2.由于后续需要对请求获取各种数据,比如HTTP_CODE,所以请求发出后并没有关闭,而是将pycurl.Curl对象返回方便查询
0 I1 M" y5 g2 {6 n: e$ b def myCurl(url,cookies=,postdata=,uploadfiles=,referer=,httpheader=,ua=,cookiejar=,customrequest=): buffer
7 c( o. Q$ Y/ X6 H$ O& Y = StringIO() c = pycurl.Curl() c.setopt(c.WRITEDATA, buffer) c.setopt(pycurl.SSL_VERIFYPEER, 0) c.setopt(pycurl.SSL_VERIFYPEER, 0) c.setopt(pycurl.SSL_VERIFYHOST, 0) c.setopt(pycurl.FOLLOWLOCATION, ; e" |. [2 y) p' n
1) if(ua == ): c.setopt(pycurl.USERAGENT,Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36 : ~: y u1 c3 `, @! K/ w8 {
) else: c.setopt(pycurl.USERAGENT,ua) if(httpheader): c.setopt(pycurl.HTTPHEADER,httpheader) 5 W- e8 z% _4 B+ b' v7 ?: u7 f t
if(referer): c.setopt(pycurl.REFERER, referer) if(cookies): c.setopt(pycurl.COOKIE,cookies) c.setopt(pycurl.URL,url)
`8 t' A! C x& B \/ w! ? if(customrequest): c.setopt(pycurl.CUSTOMREQUEST, customrequest) if(postdata): if isinstance(postdata,str): : ^# W# w8 Y6 }: K
#字符串不要使用urlencode postfields=postdata else: postfields=urllib.urlencode(postdata) c.setopt(c.POSTFIELDS, postfields)
! J y( `1 X) S: a, w) p if(uploadfiles):#如果需要上传文件 multipartFormData=[] fileTuple=(uploadfiles[name], (
7 A2 K' J1 c( b! ? # upload the contents of this file c.FORM_FILE, uploadfiles[path], )) multipartFormData.append(fileTuple) 7 y( k8 a0 ], c- B0 X2 p) z
if (postdata): #除了文件还要上传其他一些数据,也要加上for index in postdata: if(isinstance(postdata[index],int)): postdata[index] 0 R7 ?$ B" W3 r) d1 K
=str(postdata[index]) multipartFormData.append((index,postdata[index])) c.setopt(c.HTTPPOST, multipartFormData) * D$ K Y8 i k% h( n* d
if cookiejar: c.setopt(pycurl.COOKIEJAR, cookiejar) res=c.perform() if cookiejar: cookieStr
/ ~8 U. P& N: n = for line in open(cookiejar): if (line.find(#) == 0 or line == \n): # 注意换行并不是空字符串,也要去掉continue ' b; k7 v/ Y# t2 X7 Q+ F9 x5 N, X
line = line.strip(\n) # 去掉空字符串 lineArr = line.split(\t) # 根据制表符切开 length = len(lineArr) name
: l! L: i' g P = lineArr[length - 2] value = lineArr[length - 1] cookieStr = cookieStr + name +
. w* a4 _ i. ~4 ? = + value + ; cookieStr.strip(; ) os.remove(cookiejar) if cookiejar: data = { 3 U1 o( }- e. k6 W
c: c, data: buffer.getvalue(),cookies:cookieStr} else: data = {c: c, data: buffer.getvalue()}
$ O* f2 x. S8 A3 i ? #c.close() # getinfo must be called before close.return data
" B' g' v) D+ y3 z
" {* I" p2 m% d- o) V8 b& T; ~7 o, j% Q; k* @0 O3 }
5 t2 T2 s2 x' L( u% J+ a3 B
' G% N: n4 g; y4 p! w |