Как я добавляю Заголовок SOAP с помощью JAX-WS Java

Из определения POST в RFC2616 можно сделать вывод, что СЛЕДУЕТ создавать только один ресурс (как определено в RFC). Например, в этом разделе говорится о « созданной сущности » (единственном числе) по всему абзацу. Более очевидным разделом является рекомендуемый ответ для случаев, когда новые ресурсы создаются с помощью POST:

Если ресурс был создан на исходном сервере, ответ
[ 114] ДОЛЖЕН быть 201 (Создан) и содержать объект, который описывает статус запроса
и ссылается на новый ресурс, а также заголовок Location
(см. Раздел 14.30 [ 111]). [тысяча сто двадцать две] blockquote>

Насколько мне известно, вы можете вернуть только одно местоположение в заголовке местоположения. s>

Вышеупомянутый RFC2616 устарел (спасибо @Eric Stein) , Обновленная семантика POST может быть найдена в RFC7231 . Опять же, рекомендуемый ответ намекает на семантику:

Если один или несколько ресурсов были созданы на исходном сервере как результат
успешной обработки запроса POST, исходный сервер
СЛЕДУЕТ отправлять ответ 201 (Создано), содержащий поле заголовка Location
, которое предоставляет идентификатор для созданного первичного ресурса
( Раздел 7.1.2 ]) и представление, которое описывает состояние запроса
при обращении к новому ресурсу (ресурсам).

blockquote>

Хотя POST МОЖЕТ создавать несколько ресурсов, он ДОЛЖЕН создавать только один корневой ресурс (или, по крайней мере, это то, что предлагает формулировка).

В целом, существует только несколько жестких ограничений относительно того, что разрешено и запрещено, таким образом, формулировка RFC (ДОЛЖНА, МОЖЕТ, ...). Пока вы не видите НЕОБХОДИМО или НЕ ДОЛЖНО в соответствующем RFC, вы можете делать все, что пожелаете, но можете нарушать передовой опыт.

23
задан 6 May 2009 в 17:07
поделиться

2 ответа

вы, возможно, захотите взглянуть на обработчики и цепочки обработчиков. - Мне недавно пришлось добавить cookie для данного вызова Webservice, и именно так я это сделал, просто создал обработчик, который перехватил начальный вызывая и вставляя cookie, вы также можете манипулировать заголовками вызовов с помощью Pivot Handler

1
ответ дан 29 November 2019 в 03:00
поделиться

Спасибо Нуно,

Как только я пойму, как правильно войти в stackoverflow .com Я поступлю правильно с вашим ответом.

А пока вот код, который я получил:

FooService service = new FooService();
service.setHandlerResolver(new HandlerResolver() {
    public List<Handler> getHandlerChain(PortInfo portInfo) {
        List<Handler> handlerList = new ArrayList<Handler>();
        handlerList.add(new RGBSOAPHandler());
        return handlerList;
    }
});
FooPort port = service.getFooPort();
FooPayload payload = new FooPayload();
payload.setHatSize(3);
payload.setAlias("The Hat");
...
port.processRequest(payload);

и

class RGBSOAPHandler implements SOAPHandler<SOAPMessageContext> {

    public Set<QName> getHeaders() {
        return new TreeSet();
    }

    public boolean handleMessage(SOAPMessageContext context) {
        Boolean outboundProperty = 
            (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (outboundProperty.booleanValue()) {
            SOAPMessage message = context.getMessage();
            try {
                SOAPEnvelope envelope = context.getMessage()
                        .getSOAPPart().getEnvelope();
                SOAPFactory factory = SOAPFactory.newInstance();
                String prefix = "X";
                String uri = "http://...wsssecurity...";
                SOAPElement securityElem = 
                        factory.createElement("Security",prefix,uri);
                SOAPElement tokenElem = 
                        factory.createElement("BinarySecurityToken",prefix,uri);
                tokenElem.addTextNode("kjh...897=");
                securityElem.addChildElement(tokenElem);
                SOAPHeader header = envelope.addHeader();
                header.addChildElement(securityElem);

            } catch (Exception e) {
                System.out.println("Exception in handler: " + e);
            }
        } else {
            // inbound
        }
        return true;
    }

    public boolean handleFault(SOAPMessageContext context) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void close(MessageContext context) {
        //
    }
}
18
ответ дан 29 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: