如何读取 Web 服务器响应中的标头



告诉我如何通过@WebMethod@WebResult注释读取Web服务器响应中的标头。当然,我可以通过 SOAPConnection 和解析 SOAPMessage 来做到这一点,但是 javax.jws 上有很多功能,我想统一所有内容。我需要<osb:Backend/>的价值.

服务器响应:

<soapenv:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<osb:Backend xmlns:osb="http://osb.emias.mos.ru/system">СКУУ</osb:Backend>
<ipaddr xmlns="https:/bis.skyy.soapHeader/">10.0.5.147</ipaddr>
<build xmlns="https:/bis.skyy.soapHeader/">1ec22a8</build>
</env:Header>
<env:Body xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<getEmployeePacketInfoResponse2 xmlns="http://emias.gov.ru/medempregisterservicetypes/1" xmlns:ns1="http://emias.gov.ru/types/1" xmlns:ns0="http://emias.gov.ru/servicetypes/1">
<EmployeeList>
.......

接口声明:

@WebResult(name = "Backend", targetNamespace = "http://emias.gov.ru/medempregisterservicetypes/1", partName = "getMedicalEmployeePacketInfo")
@WebMethod
public String getMedicalEmployeePacketInfo2(
@WebParam(partName = "getMedicalEmployeePacketInfoRequest", name = "getEmployeePacketInfoRequest", targetNamespace = "http://emias.gov.ru/medempregisterservicetypes/1")
GetEmployeePacketInfoRequest getMedicalEmployeePacketInfoRequest
) throws FaultMessage;

请求类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"requesterSystemCode",
"healthOrgID",
"employeeList"
})
@XmlRootElement(name = "getEmployeePacketInfoRequest")
public class GetEmployeePacketInfoRequest {
@XmlElement(name = "RequesterSystemCode", required = true)
protected String requesterSystemCode;
@XmlElement(name = "HealthOrgID")
protected String healthOrgID;
@XmlElement(name = "EmployeeList", required = true)
protected GetEmployeePacketInfoRequest.EmployeeList employeeList;
....

请求示例:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://emias.gov.ru/medempregisterservicetypes/1">
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>SPU/erz</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">emias_erz</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<ns:getEmployeePacketInfoRequest2>
<ns:RequesterSystemCode>SPU</ns:RequesterSystemCode>
<ns:HealthOrgID>10000430</ns:HealthOrgID>
<ns:EmployeeList>
<ns:EmployeeID>21426012</ns:EmployeeID>
</ns:EmployeeList>
</ns:getEmployeePacketInfoRequest2>
</soapenv:Body>
</soapenv:Envelope>

1. 我没有使用过 jws,也没有尝试过这个,但它可能会有所帮助:

尝试将header选项添加到@WebResult批注中。

请参阅 https://docs.oracle.com/javaee/6/api/javax/jws/WebResult.html:

public abstract boolean header

"如果为 true,则结果是从消息标头而不是消息正文中提取的。">

但似乎为了做到这一点,你必须为 JAXB 编写适当的类(我不确定(。

2.相反,我直接做了,并使用了这种方法:

您的业务数据位于邮件正文内 -<getEmployeePacketInfoRequest2/>标记之间。这就是 JAXB 创建GetEmployeePacketInfoResponse类对象时所用的内容。因此,如果要获取此标记之外的任何内容,则必须从整个 SOAP 响应中获取它。但是你不需要手动解析它 - javax.xml.soap.SOAPMessage内置了getSOAPHeader()方法,它可以满足你的需求。然后只需将其转换为 DOM,然后执行getElementsByTagName()getElementsByTagNameNS()

实现了第二句

import lombok.val;
.... 
val soapPart = resp.getSOAPPart();
val soapEnvelope = soapPart.getEnvelope();
val soapHeader = soapEnvelope.getHeader();
val backendNode = soapHeader.getElementsByTagName("osb:Backend");
if (backendNode.getLength() > 0) {
backend = backendNode.item(0).getTextContent();
}
...

您需要在类方法中使用带注释的参数,如下所示:

@WebResult(name = "Backend", targetNamespace = "http://emias.gov.ru/medempregisterservicetypes/1", partName = "getMedicalEmployeePacketInfo")
@WebMethod
public String getMedicalEmployeePacketInfo2(
@WebParam(partName = "header", name = "ipaddr", targetNamespace = "https:/bis.skyy.soapHeader/", header = true, mode = WebParam.Mode.IN)
String header,
...
@WebParam(partName = "getMedicalEmployeePacketInfoRequest", name = "getEmployeePacketInfoRequest", targetNamespace = "http://emias.gov.ru/medempregisterservicetypes/1")
GetEmployeePacketInfoRequest getMedicalEmployeePacketInfoRequest
) throws FaultMessage;

注意header = truemode = WebParam.Mode.IN

最新更新