使用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>


说明成功进行了通信。

目录
相关文章
|
6天前
|
XML JSON 数据库
Python的标准库
Python的标准库
117 77
|
20天前
|
机器学习/深度学习 算法 数据挖掘
数据分析的 10 个最佳 Python 库
数据分析的 10 个最佳 Python 库
60 4
数据分析的 10 个最佳 Python 库
|
7天前
|
XML JSON 数据库
Python的标准库
Python的标准库
33 11
|
20天前
|
人工智能 API 开发工具
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
吴恩达发布的开源Python库aisuite,提供了一个统一的接口来调用多个大型语言模型(LLM)服务。支持包括OpenAI、Anthropic、Azure等在内的11个模型平台,简化了多模型管理和测试的工作,促进了人工智能技术的应用和发展。
80 1
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
|
7天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
45 8
|
14天前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
27 4
|
15天前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
24 3
|
开发者 Python
根据不同的请求返回不同的内容 | 手把手教你入门Python之一百一十二
本节实现根据不同的请求返回不同的内容,使浏览器访问 /register 或 /login 使返回不同的内容。
根据不同的请求返回不同的内容 | 手把手教你入门Python之一百一十二
|
13天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
12天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。