在web service开发中,SOAP协议作为基于XML的通信协议,通过标准化的消息格式实现不同平台、不同语言开发的服务之间的交互,而SOAP XML消息就是承载请求和响应数据的核心载体,掌握其使用方法对开发跨平台服务接口至关重要。

SOAP协议与XML消息基础
SOAP全称为简单对象访问协议,本质是遵循特定规范的XML文档,一个标准的SOAP XML消息包含以下核心部分:
- Envelope:根元素,标识当前文档是SOAP消息,必须包含SOAP的命名空间
- Header:可选部分,用于存放认证信息、事务标识等扩展数据
- Body:必选部分,存放实际的请求或响应业务数据
- Fault:可选部分,仅在消息处理出错时出现在Body中,用于返回错误信息
SOAP消息的XML声明需要放在文档最开头,指定编码格式,通常编码为UTF-8,避免中文等特殊字符出现乱码问题。
构造SOAP XML请求消息
假设我们需要调用一个查询用户信息的web service接口,接口要求传入用户ID,返回用户姓名和年龄,对应的SOAP XML请求消息格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:user="http://ippipp.com/userService">
<soap:Header>
<user:auth>
<user:appId>test_app_001</user:appId>
<user:token>abc123def456</user:token>
</user:auth>
</soap:Header>
<soap:Body>
<user:queryUserRequest>
<user:userId>10001</user:userId>
</user:queryUserRequest>
</soap:Body>
</soap:Envelope>
上述消息中,Envelope的命名空间指定了SOAP协议的版本,Header部分携带了接口认证需要的应用ID和令牌,Body部分存放了查询用户的具体请求参数,所有自定义的业务元素都放在自定义的用户服务命名空间下,避免元素名冲突。
在web service中发送SOAP XML消息
以Java语言为例,使用HttpURLConnection发送SOAP XML请求到web service服务端的代码如下:
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class SoapClient {
public static void sendSoapRequest() throws Exception {
// web service服务地址,实际开发中替换为真实地址
String serviceUrl = "http://ipipp.com/userService";
// 构造的SOAP XML请求内容
String soapXml = "<?xml version="1.0" encoding="UTF-8"?>" +
"<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" " +
"xmlns:user="http://ipipp.com/userService">" +
"<soap:Header>" +
"<user:auth>" +
"<user:appId>test_app_001</user:appId>" +
"<user:token>abc123def456</user:token>" +
"</user:auth>" +
"</soap:Header>" +
"<soap:Body>" +
"<user:queryUserRequest>" +
"<user:userId>10001</user:userId>" +
"</user:queryUserRequest>" +
"</soap:Body>" +
"</soap:Envelope>";
URL url = new URL(serviceUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置请求方法为POST
conn.setRequestMethod("POST");
// 设置请求头,指定内容类型为XML
conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
// 允许输出请求体
conn.setDoOutput(true);
// 写入SOAP XML请求内容
try (OutputStream os = conn.getOutputStream()) {
byte[] input = soapXml.getBytes("UTF-8");
os.write(input, 0, input.length);
}
// 获取响应状态码
int responseCode = conn.getResponseCode();
System.out.println("响应状态码:" + responseCode);
// 后续可添加读取响应内容的逻辑
}
}
发送请求时需要设置正确的Content-Type为text/xml,同时保证请求体的编码和XML声明中的编码一致,否则服务端可能无法正确解析消息内容。
解析SOAP XML响应消息
web service服务端处理请求后会返回SOAP XML响应消息,正常情况下的响应格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:user="http://ipipp.com/userService">
<soap:Body>
<user:queryUserResponse>
<user:userName>张三</user:userName>
<user:userAge>25</user:userAge>
</user:queryUserResponse>
</soap:Body>
</soap:Envelope>
如果请求处理出错,响应消息的Body中会包含Fault元素,格式示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>用户ID参数格式错误</faultstring>
<detail>
<user:errorDetail xmlns:user="http://ipipp.com/userService">
用户ID必须为数字类型
</user:errorDetail>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
解析响应消息时,需要先判断是否存在Fault元素,再分别处理正常响应和错误响应的内容,以下是Java解析SOAP响应XML的示例代码:
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;
public class SoapResponseParser {
public static void parseResponse(InputStream responseStream) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析响应输入流为XML文档
Document doc = builder.parse(responseStream);
// 检查是否存在Fault元素
NodeList faultNodes = doc.getElementsByTagName("soap:Fault");
if (faultNodes.getLength() > 0) {
// 处理错误信息
String faultString = doc.getElementsByTagName("faultstring").item(0).getTextContent();
System.out.println("请求出错:" + faultString);
return;
}
// 解析正常响应内容
String userName = doc.getElementsByTagName("user:userName").item(0).getTextContent();
String userAge = doc.getElementsByTagName("user:userAge").item(0).getTextContent();
System.out.println("用户姓名:" + userName + ",年龄:" + userAge);
}
}
SOAP XML消息使用注意事项
在实际使用SOAP XML消息时,需要注意以下几点:
- 所有XML标签必须正确闭合,属性值需要用双引号包裹,避免出现XML格式错误
- 命名空间需要统一,自定义业务元素的命名空间要和接口定义保持一致,防止解析失败
- 特殊字符如<、>、&等如果出现在业务数据内容中,需要进行XML转义,或者使用CDATA块包裹内容
- Header部分的内容如果涉及敏感信息,需要配合传输层加密如HTTPS使用,避免信息泄露
通过以上步骤,就可以在web service中完成SOAP XML消息的构造、发送、解析全流程操作,满足跨平台服务通信的需求。
SOAPXMLweb_serviceSOAP协议修改时间:2026-07-11 13:51:34