BizTalk场景下多部分HTTP表单POST格式疑问(附Python可行示例)
多部分表单数据构造问题及解决方案
我尝试在BizTalk中通过多部分表单发送数据,BizTalk擅长调用API但不擅长提交网页表单,因此采用原始文本格式实现。本次问题核心并非BizTalk专属,而是如何正确构造待提交的多部分表单数据。
我参考相关资料后,当前构造的原始格式如下(包含input-format、to、from三个字段及文件上传):
--_BiztalkUploadEDIMultipartBoundary_ Content-Disposition: form-data; name="input-format" X12 --_BiztalkUploadEDIMultipartBoundary_ Content-Disposition: form-data; name="to" 073123123 --_BiztalkUploadEDIMultipartBoundary_ Content-Disposition: form-data; name="from" 006123123 --_BiztalkUploadEDIMultipartBoundary_ Content-Type: application/binary; name=filename-2021021054572-G873RRFC.edm Content-Transfer-Encoding: binary Content-Disposition: form-data; name=file; filename=filename-2021021054572-G873RRFC.edm ISA*00* *00* *01*006123123 *01*073123123 *210210*2122*+*00502*000002744*1*P*^~GS*CU* etc ~IEA*1*000002744~ --_BiztalkUploadEDIMultipartBoundary_--
我存在以下疑问:
- 普通数据字段是否需要添加
Content-Type? - 当前收到报错提示“
to和from字段传递错误”,该如何修正? - 表单字段名与值之间是否需要空行?Sample 1和Sample 2哪种格式正确?
Sample 1:
Content-Disposition: form-data; name="input-format" X12
Sample 2:
Content-Disposition: form-data; name="input-format" X12
同事已通过如下Python示例成功提交数据:
import requests url = "http://x.x.x.x:5712/UPLOAD" payload = {'input-format': 'X12', 'to': '073123123', 'from': '808123123', 'name': 'input-data'} files = [ ('input-data', ('808150895_073394164.63490032', open(r'\\vhdc-wwqrm21m\EDI\MO\808150895_073394164.33490128', 'rb'), 'application/octet-stream')) ] headers = {} response = requests.request("POST", url, headers=headers, data=payload, files=files) print(response.text)
问题解答
1. 普通数据字段是否需要添加Content-Type?
普通表单字段(非文件类型)无需强制指定Content-Type,默认会使用text/plain; charset=utf-8编码格式。只有当接口明确要求特定内容类型时,才需要显式添加该头部。
2. “to和from字段传递错误”的修正方案
对比同事的Python代码,问题出在这几个地方:
- 字段值不匹配:你构造的
from字段值是006123123,但成功示例中是808123123,先确认接口要求的正确值; - 引号格式错误:你用了HTML转义的
",实际多部分表单中应该使用普通双引号",或者在字段名无特殊字符时直接省略引号; - 缺少必填字段:Python代码里的
payload包含name: input-data字段,你当前的构造里没有这个字段,需要补充。
3. 表单字段名与值之间的空行规范
Sample 2的格式是正确的。按照HTTP多部分表单的规范,每个表单部分的头部信息(比如Content-Disposition)和字段值之间必须用一个空行分隔。Sample 1没有空行,会导致服务器把头部和值当成同一内容解析,无法正确识别字段值。
修正后的多部分表单示例
--_BiztalkUploadEDIMultipartBoundary_ Content-Disposition: form-data; name="input-format" X12 --_BiztalkUploadEDIMultipartBoundary_ Content-Disposition: form-data; name="to" 073123123 --_BiztalkUploadEDIMultipartBoundary_ Content-Disposition: form-data; name="from" 808123123 --_BiztalkUploadEDIMultipartBoundary_ Content-Disposition: form-data; name="name" input-data --_BiztalkUploadEDIMultipartBoundary_ Content-Type: application/octet-stream Content-Disposition: form-data; name="input-data"; filename="filename-2021021054572-G873RRFC.edm" ISA*00* *00* *01*006123123 *01*073123123 *210210*2122*+*00502*000002744*1*P*^~GS*CU* etc ~IEA*1*000002744~ --_BiztalkUploadEDIMultipartBoundary_--
内容的提问来源于stack exchange,提问作者NealWalters
相关产品推荐
相关产品推荐

