使用Python的requests库发送SOAP请求,错误码415

简介: 使用Python的requests库发送SOAP请求,错误码415

1. 背景

这个项目之前是采用的Python的requests库以POST的方式向服务器传送json字符串的形式,这次由于合作方的变化,要采用web services的形式,按照SOAP协议,传送XML格式的数据到服务端。


本着少改动的原则,决定继续使用Python的requests库,将原来的json字符串拼成XML格式,再发送给服务端。


在改动的过程中,遇到了一些问题,并逐个进行了解决。下面是详细的过程。


2. tomcat启动问题

1.首先有个服务端,合作方已经部署在了tomcat上,并把压缩包发了过来;第一步肯定是先运行tomcat;

2.运行tomcat后,localhost:8080显示tomcat已经启动,但是服务的域名localhost:8080/TPService/TPServicePort?wsdl却显示404,如图所示:

3.然后发现运行起来的tomcat是9.0版本,而合作方发来的tomcat是7.0版本;

4.使用的是windows电脑,将环境变量中的CATALINA_HOME的值改为7.0版本的tomcat文件夹路径,即可启动7.0版本的tomcat,并能够成功访问localhost:8080/TPService/TPServicePort?wsdl

3. 报415错误

  1. 首先并不急于将完整的数据发送给服务端,而是仅仅想把与服务端的连接成功建立。此时的代码大概如下:
import requests
url = 'http://localhost:8080/TPService/TPServicePort?wsdl'
payload = {'a':'test'}
response = requests.post(url, json=payload, timeout=5)


2.此时会报415错误;到服务端查看,发现如下报错信息:

Unsupported Content-Type: application/json Supported ones are: [text/xml]
com.sun.xml.ws.server.UnsupportedMediaException: Unsupported Content-Type: application/json Supported ones are: [text/xml]

3.按照提示,增加headers,将content-type的值设置为text/xml,此时代码如下:

import requests
from requests.structures import CaseInsensitiveDict
url = 'http://localhost:8080/TPService/TPServicePort?wsdl'
headers = CaseInsensitiveDict()
headers['Content-Type'] = 'text/xml'
payload = {'a': 'b'}
response = requests.post(url, headers=headers, json=payload, timeout=5)
print(response.status_code)


  1. 此时报500错误,说明通信连接已经建立了;

4. 按照SOAP格式拼装xml

  1. 一开始拼接的xml如下:
<?xml version ="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S='http://schemas.xmlsoap.org/soap/envelope/'>
  <S:Body>
    <n:uploadTestData xmlns:n="http://localhost:8080/TPService/TPServicePort?wsdl">
      <a>test</a>
    </n:uploadTestData>
  </S:Body>
</S:Envelope>

2.此时代码大概如下:

import requests
from requests.structures import CaseInsensitiveDict
url = 'http://localhost:8080/TPService/TPServicePort?wsdl'
headers = CaseInsensitiveDict()
headers['Content-Type'] = 'text/xml'
payload = ‘’‘
<?xml version ="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S='http://schemas.xmlsoap.org/soap/envelope/'>
  <S:Body>
    <n:uploadTestData xmlns:n="http://localhost:8080/TPService/TPServicePort?wsdl">
      <a>test</a>
    </n:uploadTestData>
  </S:Body>
</S:Envelope>
’‘’
response = requests.post(url, headers=headers, data=payload, timeout=5)
print(response.status_code)


3.然后这时会报错500如下:

Couldn't create SOAP message due to exception: XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[2,14]
Message: The processing instruction target matching "[xX][mM][lL]" is not allowed.
com.sun.xml.ws.protocol.soap.MessageCreationException: Couldn't create SOAP message due to exception: XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[2,14]

3.按照提示,找到[2, 14]的位置,发现是xml version这里,去掉两个单词之间的空格,再次请求,报错500,但是服务端没有信息显示。


4.发现是请求地址写错了,请求地址应与localhost:8080/TPService/TPServicePort?wsdl中的namespace保持一致。将代码修改为:

import requests
from requests.structures import CaseInsensitiveDict
url = 'http://localhost:8080/TPService/TPServicePort?wsdl'
headers = CaseInsensitiveDict()
headers['Content-Type'] = 'text/xml'
payload = ‘’‘
<?xml version ="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S='http://schemas.xmlsoap.org/soap/envelope/'>
  <S:Body>
    <n:uploadTestData xmlns:n="http://www.xxxx.com">
      <a>test</a>
    </n:uploadTestData>
  </S:Body>
</S:Envelope>
’‘’
response = requests.post(url, headers=headers, data=payload, timeout=5)
print(response.status_code)

6.再次发起请求,返回结果如下:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:uploadTestDataResponse xmlns:ns2="http://www.glorysoft.com">
      <return>                            {&quot;responseDate&quot;:&quot;20210420114103554&quot;,&quot;resultCode&quot;:&quot;OK&quot;,&quot;resultMessage&quot;:&quot;success&quot;}
      </return>
     </ns2:uploadTestDataResponse>
   </S:Body>
 </S:Envelope>


说明成功进行了通信。

目录
相关文章
|
3月前
|
存储 人工智能 测试技术
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
本文介绍如何使用LangChain结合DeepSeek实现多轮对话,测开人员可借此自动生成测试用例,提升自动化测试效率。
462 125
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
|
3月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
222 0
|
2月前
|
数据可视化 关系型数据库 MySQL
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
本文详解基于Python的电影TOP250数据可视化大屏开发全流程,涵盖爬虫、数据存储、分析及可视化。使用requests+BeautifulSoup爬取数据,pandas存入MySQL,pyecharts实现柱状图、饼图、词云图、散点图等多种图表,并通过Page组件拖拽布局组合成大屏,支持多种主题切换,附完整源码与视频讲解。
236 4
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
|
2月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
310 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
4月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
248 18
|
3月前
|
数据采集 Web App开发 前端开发
处理动态Token:Python爬虫应对AJAX授权请求的策略
处理动态Token:Python爬虫应对AJAX授权请求的策略
|
4月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
387 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
开发者 Python
根据不同的请求返回不同的内容 | 手把手教你入门Python之一百一十二
本节实现根据不同的请求返回不同的内容,使浏览器访问 /register 或 /login 使返回不同的内容。
根据不同的请求返回不同的内容 | 手把手教你入门Python之一百一十二
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
293 102
|
3月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
316 104

推荐镜像

更多