Как прочитать заголовок в ответе веб-сервера - PullRequest
0 голосов
/ 16 октября 2018

Подскажите, как прочитать заголовок в ответе веб-сервера с помощью аннотаций @WebMethod и @WebResult.Конечно, я могу сделать это с помощью 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>

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

реализовано второе предложение

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();
            }
...
0 голосов
/ 16 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...