Python发送form-data请求及拼接form-data内容的方法


Posted in Python onMarch 05, 2016

 网上关于使用python 的发送multipart/form-data的方法,多半是采用

ulrlib2 的模拟post方法,如下:

import urllib2

boundary='-------------------------7df3069603d6' 
data=[] 
data.append('--%s' % boundary) 
data.append('Content-Disposition: form-data; name="app_id"\r\n') 
data.append('xxxxxx') 
data.append('--%s' % boundary) 
data.append('Content-Disposition: form-data; name="version"\r\n') 
data.append('xxxxx') 
data.append('--%s' % boundary) 
data.append('Content-Disposition: form-data; name="platform"\r\n') 
data.append('xxxxx') 
data.append('--%s' % boundary) 
data.append('Content-Disposition: form-data; name="libzip"; filename="C:\Users\danwang3\Desktop\libmsc.zip"') 
data.append('Content-Type: application/octet-stream\r\n') 
 
fr=open('C:\Users\danwang3\Desktop\libmsc.zip') 
content=fr.read() 
data.append(content) 
print content 
fr.close() 
data.append('--%s--\r\n'%boundary) 
httpBody='\r\n'.join(data) 
 
print type(httpBody) 
print httpBody 
 
postDataUrl='http://xxxxxxxx' 
req=urllib2.Request(postDataUrl,data=httpBody)

经过测试,使用上述方法发送一段二进制文件的时候,服务器报错,数据有问题!

问题就出在    '\r\n'.join(data)的编码,data内部拥有二进制数据,通过这种编码,可能是把数据转换为utf-8格式,当然有问题。

搜索了很多资料,查到可以使用requests库提交multipart/form-data 格式的数据

一个multipart/form-data 的表单数据,在http里面抓包如下:

#Content-Disposition: form-data;name="app_id"


 123456

#-----------------------------7df23df2a0870

#Content-Disposition: form-data;name="version"

 

 2256

 -----------------------------7df23df2a0870

 Content-Disposition:form-data; name="platform"

 

 ios

 -----------------------------7df23df2a0870

 Content-Disposition: form-data;name="libzip";filename="C:\Users\danwang3\Desktop\libmsc.zip"

 Content-Type: application/x-zip-compressed

 

 <二进制文件数据未显示>

---------------------------7df23df2a0870—

上述数据在requests里面可以模拟为:

files={'app_id':(None,'123456'),
  'version':(None,'2256'),
  'platform':(None,'ios'),
  'libzip':('libmsc.zip',open('C:\Users\danwang3\Desktop\libmsc.zip','rb'),'application/x-zip-compressed')
 }

发送上述post请求,也就是简单的

response=requests.post(url,files=files)

就这么简单

在官方网站上,requests模拟一个表单数据的格式如下:

files = {'name': (<filename>, <file object>,<content type>, <per-part headers>)}

这一行模拟出来的post数据为:

Content-Disposition: form-data; name='name';filename=<filename>
Content-Type: <content type>
 
<file object>
--boundary

如果filename 和 content-Type不写,那么响应模拟post的数据就不会有二者。

通常使用requests 不像使用urllib2那样可以自动管理cookie,不过如果获取到cookie

可以在requests请求里面一并将cookie发送出去

requests使用的cookie格式如下:

newCookie={}
newCookie['key1']='value1'
newCookie['key2]='value2'
newCookie['key3']='value3'

发送cookie可以使用:

response=requests.post(url,cookies=newCookie)

这样就可以了

拼接form-data的post内容

#!\urs\bin\env python 
#encoding:utf-8    #设置编码方式  
  
from http2 import http 
import urllib 
 
def ReadFileAsContent(filename): 
  #print filename 
  try: 
    with open(filename, 'rb') as f: 
      filecontent = f.read() 
  except Exception, e: 
    print 'The Error Message in ReadFileAsContent(): ' + e.message  
    return '' 
  return filecontent 
 
 
def get_content_type(filename): 
  import mimetypes 
  return mimetypes.guess_type(filename)[0] or 'application/octet-stream' 
 
def isfiledata(p_str):  
  import re 
   
  r_c = re.compile("^f'(.*)'$") 
  rert = r_c.search(str(p_str)) 
  #rert = re.search("^f'(.*)'$", p_str) 
  if rert: 
    return rert.group(1) 
  else: 
    return None 
   
def encode_multipart_formdata(fields): 
  ''''' 
      该函数用于拼接multipart/form-data类型的http请求中body部分的内容 
      返回拼接好的body内容及Content-Type的头定义 
  ''' 
  import random 
  import os 
  BOUNDARY = '----------%s' % ''.join(random.sample('0123456789abcdef', 15)) 
  CRLF = '\r\n' 
  L = [] 
  for (key, value) in fields: 
    filepath = isfiledata(value) 
    if filepath: 
      L.append('--' + BOUNDARY) 
      L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, os.path.basename(filepath))) 
      L.append('Content-Type: %s' % get_content_type(filepath)) 
      L.append('') 
      L.append(ReadFileAsContent(filepath))  
    else: 
      L.append('--' + BOUNDARY) 
      L.append('Content-Disposition: form-data; name="%s"' % key) 
      L.append('') 
      L.append(value)  
  L.append('--' + BOUNDARY + '--') 
  L.append('') 
  body = CRLF.join(L) 
  content_type = 'multipart/form-data; boundary=%s' % BOUNDARY 
  return content_type, body

其中需要注意的是文件数据的字典值,其格式为f'/path/to/file',具体调用的形式如下:

form_data = [('gShopID','489'),("addItems", r"f'D:\case3guomei.xml'"), ('validateString', '92c99a2a36f47c6aa2f0019caa0591d2')] 
form_data_re = encode_multipart_formdata(form_data) 
print form_data_re

返回的内容是一个元组,第一个参数是请求头中Content-Type的值,第二个是具体post的内容。然后使用httplib的post方法就可以发送了。

Python 相关文章推荐
python图像处理之反色实现方法
May 30 Python
基于DataFrame改变列类型的方法
Jul 25 Python
pandas通过loc生成新的列方法
Nov 28 Python
如何在django里上传csv文件并进行入库处理的方法
Jan 02 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
Python 实现还原已撤回的微信消息
Jun 18 Python
Django的性能优化实现解析
Jul 30 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
Python发送邮件的实例代码讲解
Oct 16 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
python编程项目中线上问题排查与解决
Nov 01 Python
Python多线程爬虫简单示例
Mar 04 #Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 #Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 #Python
用Python编写简单的微博爬虫
Mar 04 #Python
python相似模块用例
Mar 04 #Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 #Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 #Python
You might like
深入PHP异步执行的详解
2013/06/03 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
Python通过format函数格式化显示值
2020/10/17 Python
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
预备党员思想汇报范文
2014/01/11 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
初中生期末评语大全
2014/04/24 职场文书
服务理念口号
2014/06/11 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
七一建党节演讲稿
2014/09/11 职场文书
爱晚亭导游词
2015/02/09 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python
Nginx缓存设置案例详解
2021/09/15 Servers
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python