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)
    
  4. 此时报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]
    
  4. 按照提示,找到[2, 14]的位置,发现是xml version这里,去掉两个单词之间的空格,再次请求,报错500,但是服务端没有信息显示。

  5. 发现是请求地址写错了,请求地址应与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>
    

    说明成功进行了通信。

python 自动化接口 soap 协议 1.传参:参数我是按照字符串的形式传进去的,注意是三引号字符串,当时原本想的是传参的区域改变完数据直接加上三引号来拼接,结果是不行的,需要 json .dumps格式就行了。 2.读文件:这个地方遇到的一个坑是自认为解析完之后就可以了,和request爬虫一个原理,这个地方同样需要 json 来转化。 遇到的第二个问题,接口有限制1分钟之内不能重复 发送 请求 ,所以捕捉异...
两种方法可参考: Call a SOAP Service with plain old requests Calling a SOAP WebService with Python Suds
背景:练习 requests 请求 的时候向一个网站发起post 请求 ,携带的参数为我已经添加了头部和数据但是返回是这样的这是因为我在写 requests .post(url=url,data=data,headers=headers)这里写错了。应该是: 因为要注意的是: 于是最后 请求 成功。 1.传统的ajax 请求 时候,默认为"文本"类型。 2.传统的form提交的时候,默认为"Form"类型。 3.axios传递字符串的时候,默认为"Form"类型。 4.axios传递对象的时候,默认为" JSON "类型C
上文中webservice学习(1) , 使用 soap lib建立了一个超简单的webservice服务,也是用suds调用成功了,那如果想 使用 http包自己组成一个 soap 消息来调用接口怎么办呢? 这个时候我们就想到 使用 wsdl这个文件了,我看了些wsdl的文档,也参照这其他人 使用 java,php等语言实现的 soap 消息调用的格式来写,但是怎么调试都没成功。。 就是说他总是会返回500或
使用 Python 通过 requests 发送 HTTP 请求 ,并 使用 BeautifulSoup 分析HTML页面来抓取https://www.taobao.com/
url = "https://www.taobao.com/" response = requests .get(url) html_doc = response .content.decode('utf-8') soup = BeautifulSoup(html_doc, 'html.parser') print(soup.prettify()) 这个代码会 发送 HTTP 请求 到淘宝主页,然后 使用 BeautifulSoup 对返回结果进行解析,最后将结果打印出来。如果你想要抓取某个具体的信息,可以通过解析 HTML 页面中的标签信息来实现。
Kuo-Teng: 对于 InnoDB 表,行数仅仅是一个用于 SQL 优化的粗略估计值。这也适用于 InnoDB 表进行了分区的情况。这是因为 InnoDB 存储引擎使用多版本并发控制 (MVCC) 机制来管理事务,以实现高并发性能。在 MVCC 机制下,每个事务都有自己的版本号,因此行数的计算变得复杂,无法得到准确的行数。因此,InnoDB 表的行数是一个近似值,可能与实际值相差较大。 在实际使用中,如果需要获取 InnoDB 表的准确行数,可以使用 SELECT COUNT(*) 命令。但是,由于 InnoDB 表的行数计算比较耗时,因此对于大表,可能需要花费较长的时间来计算行数。如果只需要获取一个大致的行数,可以使用 TABLE_ROWS 字段,但是需要注意其精度较低。 什么是慢查询?如何优化? Kuo-Teng: 在工程中,10s是完全不可接受的。1s已经算做是慢查询了,需要进行优化。