Обработчик для добавления HTTP-заголовков в HTTP-запрос, не вызываемый при использовании Axis Client API - PullRequest
7 голосов
/ 13 октября 2010

Я использую Axis API для доступа к Axis HTTP серверу. Документацию по API можно найти здесь .

Я использую следующий код для добавления обработчиков на сервер. service имеет тип java.xml.rpc.Service

    HandlerRegistry registry = service.getHandlerRegistry();
    QName serviceName = new QName(url, "MyServiceClass");

    List<HandlerInfo> handlerChain = new ArrayList<HandlerInfo>();
    HandlerInfo handlerInfo = new HandlerInfo(MyHandler.class, null, null);
    handlerChain.add(handlerInfo);
    registry.setHandlerChain(serviceName, handlerChain);

Я знаю, что имя службы правильное, поскольку я получаю правильные выходные данные при последующих вызовах объекта службы.

Каким-то образом обработчик не вызывается. Вот класс Handler. Мое намерение состоит в том, чтобы добавить пользовательские заголовки к HTTP-запросу перед пересылкой запроса на сервер.

import javax.xml.namespace.QName;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;

public class MyHandler extends BasicHandler {

    @Override
    public void init() {
        System.out.println("init called");
        super.init();
        System.out.println("init called");
    }

    @Override
    public void cleanup() {
        super.cleanup();
        System.out.println("cleanup called");
    }

    @Override
    public void invoke(MessageContext mc) throws AxisFault {
        System.out.println("invoke called");
    }

    public QName[] getHeaders() {
        System.out.println("getHeaders");
        return new QName[1];
    }
}

Что не так с приведенным выше кодом?

Есть ли другой способ изменить заголовки HTTP с помощью Apache Axis API?

Ответы [ 3 ]

7 голосов
/ 20 октября 2010

Ока.Это должно сработать:

1 - Создайте файл wsdd (скажем, /tmp/test.wsdd), содержащий это:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <handler name="test" type="java:axistest.TestHandler" />
 <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender">
   <requestFlow>
    <handler type="test"/>
   </requestFlow>
 </transport>
</deployment>

2 - Убедитесь, что все библиотеки осей находятся в вашем пути к классам, и затем запустите:

java org.apache.axis.utils.Admin client /tmp/test.wsdd

3 - Шаг 2 создаст файл client-config.wsdd.Скопируйте его в свой проект и убедитесь, что он будет в пути к классу при запуске проекта.

4 - ВСЕ вызовы веб-службы (через транспорт Http) будут маршрутизироваться через класс TestHandler1

Здесьмой класс TestHandler1 (небольшая модификация обработчика ur для доступа к заголовкам MIME):

package axistest;

import javax.xml.namespace.QName;
import javax.xml.soap.MimeHeaders;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;

public class TestHandler1 extends BasicHandler {

@Override
public void init() {
    System.out.println("init called");
    super.init();
    System.out.println("init called");
}

@Override
public void cleanup() {
    super.cleanup();
    System.out.println("cleanup called");
}

@Override
public void invoke(MessageContext mc) throws AxisFault {
    System.out.println("invoke called");
    System.out.println("=----------------------------------=");
    MimeHeaders mimeHeaders = mc.getMessage().getMimeHeaders();
    mimeHeaders.addHeader("X-Test", "Hello");
    System.out.println("Headers : \n " + mimeHeaders);
}

public QName[] getHeaders() {
    System.out.println("getHeaders");
    return new QName[1];
}

}

когда я запускаю это на своем компьютере, я вижу, что эти методы-обработчики вызываются:

- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
init called
init called
invoke called
=----------------------------------=
Headers : 
 org.apache.axis.message.MimeHeaders@761eec35
.
.
.
1 голос
/ 16 октября 2010

Кстати, читая об использовании обработчиков, я нашел эту страницу. Посмотрите, поможет ли это: http://soa.sys -con.com / node / 39721

0 голосов
/ 16 октября 2010

Мы добавляем пользовательские заголовки в запрос SOAP. Однако мы реализовали это, внедрив заголовки в объект-заглушку Axis для веб-службы во время выполнения. Таким образом, они не меняются для каждого запроса, но введенные заголовки используются для всего выполнения наших тестов

Если вы считаете, что это также ваш вариант использования, я могу найти этот код и обновить с тем, что мы сделали.

...