【问题标题】:How to read the header in the web server response如何读取 Web 服务器响应中的标头
【发布时间】:2018-10-16 08:44:35
【问题描述】:

告诉我如何通过@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>

【问题讨论】:

    标签: java xml soap


    【解决方案1】:

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

    尝试将header 选项添加到您的@WebResult 注释中。

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

    public abstract boolean header
    

    “如果为真,则从邮件头而不是邮件正文中提取结果。”

    但似乎为了这样做,您必须为 JAXB 编写适当的类(我不确定)。

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

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

    【讨论】:

    • 1.我试过了,但不幸的是它没有帮助。 2.所以现在我正在做,但是我想通过注解,但是东西从来没有找到例子。通过注释创建带有标头的请求,但没有找到从答案中获取标头的单个示例(((
    【解决方案2】:

    实现第二句

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

    【讨论】:

      【解决方案3】:

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

          @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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-04
        • 2012-03-20
        • 2013-09-23
        • 1970-01-01
        相关资源
        最近更新 更多