• 使用pycURL发送请求


    pycURl是python编写的ibcurl.的接口,今天在使用的时候,出现了一个小问题,我发送的数据对方无法正常接收,后来才知道是content-type设置不正确的原因.

    pyCURL默认的Content-Type是application/x-www-form-urlencoded,也就是说,如果没有明确设定,则发送的数据是url编码之后的数据.

    可是如果用这个工具发送json字符串 的request body,则必须显式指定json对应的内容类型Content-Type:application/json;charset=xxxx,否则接收方收到的数据是错误的.

    以下是我写的一个简易curl,具有基本的获取响应数据,和上传文件,携带cookie,保存cookie等功能.

    
    
    import os
    import pycurl
    import urllib
    from StringIO import StringIO

    '''
    url:请求的url cookies:携带的cookie posdata:请求体,可以是字符串,或者其他可以urlencode的类型 uploadfiles:上传文件的参数,格式为{'name':filename,'path':filepath} referer:来源 httpheader:自定义header头 ua:客户端代理名 cookiejar:存储请求响应后的cookie的文件路径 customrequest:自定义请求方法 注意: 1.暂时没有进行ssl验证 2.由于后续需要对请求获取各种数据,比如HTTP_CODE,所以请求发出后并没有关闭,而是将pycurl.Curl对象返回方便查询 ''' def myCurl(url,cookies='',postdata='',uploadfiles='',referer='',httpheader='',ua='',cookiejar='',customrequest=''): buffer = 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, 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') else: c.setopt(pycurl.USERAGENT,ua) if(httpheader): c.setopt(pycurl.HTTPHEADER,httpheader) if(referer): c.setopt(pycurl.REFERER, referer) if(cookies): c.setopt(pycurl.COOKIE,cookies) c.setopt(pycurl.URL,url) if(customrequest): c.setopt(pycurl.CUSTOMREQUEST, customrequest) if(postdata): if isinstance(postdata,str):#字符串不要使用urlencode postfields=postdata else: postfields=urllib.urlencode(postdata) c.setopt(c.POSTFIELDS, postfields) if(uploadfiles):#如果需要上传文件 multipartFormData=[] fileTuple=(uploadfiles['name'], ( # upload the contents of this file c.FORM_FILE, uploadfiles['path'], )) multipartFormData.append(fileTuple) if (postdata): #除了文件还要上传其他一些数据,也要加上 for index in postdata: if(isinstance(postdata[index],int)): postdata[index]=str(postdata[index]) multipartFormData.append((index,postdata[index])) c.setopt(c.HTTPPOST, multipartFormData) if cookiejar: c.setopt(pycurl.COOKIEJAR, cookiejar) res=c.perform() if cookiejar: cookieStr = '' for line in open(cookiejar): if (line.find('#') == 0 or line == ' '): # 注意换行并不是空字符串,也要去掉 continue line = line.strip(' ') # 去掉空字符串 lineArr = line.split(' ') # 根据制表符切开 length = len(lineArr) name = lineArr[length - 2] value = lineArr[length - 1] cookieStr = cookieStr + name + '=' + value + '; ' cookieStr.strip('; ') os.remove(cookiejar) if cookiejar: data = {'c': c, 'data': buffer.getvalue(),'cookies':cookieStr} else: data = {'c': c, 'data': buffer.getvalue()} #c.close() # getinfo must be called before close. return data

     

  • 相关阅读:
    一个总成本花费100W的失败项目的小小反省
    从绝望中寻找希望
    一个合格程序员该做的事情——你做好了吗?
    Go to 北京!
    深入浅出Oracle分析函数
    最适合web开发人员使用的速查表
    采用axis2c进行webservice发布的流程4在生成的代码中添加事务处理逻辑
    采用axis2c进行webservice发布的流程1
    rhel6.0及centos6.0 忘记root密码解决办法
    采用axis2c进行webservice发布的流程3通过wsdl文件,自动生成C的服务端代码
  • 原文地址:https://www.cnblogs.com/ch459742906/p/7806565.html
Copyright © 2020-2023  润新知