Python通过证书调用SOAP API遇问题:返回200但获RTL-API-1002错误
问题描述
尝试用Python发送请求建立客户端与服务端的连接,已将证书转换为.pem格式,从.pem文件中提取以-----BEGIN PRIVATE KEY-----开头、-----END PRIVATE KEY-----结尾的私钥保存为.key文件,随后将该私钥添加到服务端证书.pem文件中,以为这样能建立连接。请求返回状态码200,但未得到有效业务响应,仅收到SOAP Fault错误,错误码为RTL-API-1002,错误信息为“调用Web服务时发生错误”。
相关代码
import json import requests clientCrt = "path to client certificate\ce.crt" certificate_secret = "path to client's private key\pkey.key" url = "api_end_point_url" certServer = "path to server certificate\serv.pem" headers = {'Content-Type': 'text/xml; charset=utf-8'} payload = """<?xml version="1.0" encoding="UTF-8" standalone="no"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="..."> <soap:Header/> <soap:Body> <ns:OrigXARequest> <Request> ..... </Request> </ns:OrigXARequest> </soap:Body> </soap:Envelope>""" response = requests.get(url, data=payload, verify = certServer, headers=headers, cert=(clientCrt,certificate_secret)) print(response.status_code) print(response.content) print(response.text)
输出结果
200 b'<?xml version = "1.0" encoding = "UTF-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><soap:Fault xsi:type="soap:Fault"><faultcode>RTL-API-1002</faultcode><faultstring>Error occurred while invoking the .. Web Service.</faultstring></soap:Fault></soap:Body></soap:Envelope>' Process finished with exit code 0
解决建议
- 修正请求方法:SOAP协议默认使用
POST方法传输请求体,当前使用requests.get()会导致服务端无法正确解析SOAP payload。将请求改为requests.post():response = requests.post(url, data=payload, verify=certServer, headers=headers, cert=(clientCrt,certificate_secret)) - 还原证书配置:不需要将客户端私钥添加到服务端证书文件中。
verify参数指定的服务端证书文件只需包含服务端的CA证书或公钥证书,用于验证服务端身份;客户端证书和私钥是独立的身份凭证,保持分开存放即可。 - 补全SOAP请求参数:代码中
<Request>标签内的.....是占位符,必须替换为符合接口规范的完整业务参数,服务端可能因缺少必要参数导致调用失败。 - 修正命名空间:payload中的
xmlns:ns="..."需替换为服务端提供的正确命名空间,否则服务端无法识别请求对应的操作。 - 排查服务端日志:RTL-API-1002属于业务级错误,建议联系服务端运维人员查看详细日志,确认具体错误原因(如权限校验失败、后端服务异常、参数格式错误等)。
内容的提问来源于stack exchange,提问作者Sanjana Basu
相关产品推荐
相关产品推荐

