首页 > 解决方案 > 如何读取 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>

标签: javaxmlsoap

解决方案


执行第二句

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();
            }
...

推荐阅读