Как добавить заголовок запроса в клиент на основе аннотаций Tyrus

Я пытаюсь получить доступ к конечной точке сервера websocket, используя автономный клиент tyrus (tyrus-standalone-client-1.9) с конечной точкой клиента на основе аннотаций. Я в основном следил за этот пример .

То есть конечная точка моего клиента в настоящее время выглядит так

@ClientEndpoint
public class MyClientEndpoint {

    private static CountDownLatch latch;

    private Logger logger = Logger.getLogger(this.getClass().getName());

    @OnOpen
    public void onOpen(Session session) throws Exception {
        session.getBasicRemote().sendText("initialRequest")
    }

    @OnMessage
    public void onMessage(String message, Session session) throws Exception {
        // do something
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        logger.info(String.format("Session %s close because of %s", session.getId(), closeReason));
        latch.countDown();
    }

    public static void main(String[] args) {
        latch = new CountDownLatch(1);

        ClientManager client = ClientManager.createClient();
        try {
            URI serverEndpointUri = new URI("ws://localhost/websockets/server/endpoint");
            client.connectToServer(MyClientEndpoint.class, serverEndpointUri);
            latch.await();

        } catch (DeploymentException | URISyntaxException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

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

В программной конечной точке клиента я мог бы сделать что-то вроде

final Builder configBuilder = ClientEndpointConfig.Builder.create();
configBuilder.configurator(new Configurator() {
    @Override
    public void beforeRequest(final Map<String, List<String>> headers) {
        headers.put("Cookie", Arrays.asList("X-Session=0f822c8c-bf63-4ae7-9d2f-af263f86baad"));
        headers.put("Origin", Arrays.asList("http://localhost"));
    }
});
ClientEndpointConfig clientConfig = configBuilder.build();
ClientManager client = ClientManager.createClient();
URI serverEndpointUri = new URI("ws://localhost/websockets/server/endpoint");
client.connectToServer(new MyClientEndpoint(), clientConfig, serverEndpointUri);

Но, похоже, нет возможности передать конфигурацию клиенту на основе аннотаций.

Есть ли другой способ добавить/изменить заголовки запросов, которые мне сейчас не хватает? Я бы очень хотел остаться с подходом, основанным на аннотациях, так как он кажется мне намного чище...


person dpr    schedule 04.12.2014    source источник


Ответы (1)


См. ModifyRequestResponseHeadersTest.java:183

@ClientEndpoint(configurator = MyClientConfigurator.class)
public static class MyClientEndpoint {
    public static final CountDownLatch messageLatch = new CountDownLatch(1);
    public static volatile String receivedMessage;

    @OnOpen
    public void onOpen(Session session) throws IOException {
        session.getBasicRemote().sendText(SENT_MESSAGE);
    }

    @OnMessage
    public void onMessage(String message) {
        receivedMessage = message;
        messageLatch.countDown();
    }
}

И MyClientConfigurator:

public static class MyClientConfigurator extends ClientEndpointConfig.Configurator {
    static volatile boolean called = false;

    @Override
    public void beforeRequest(Map<String, List<String>> headers) {
        called = true;
        headers.put(HEADER_NAME, Arrays.asList(HEADER_VALUE));
        headers.put("Origin", Arrays.asList("myOrigin"));
    }

    @Override
    public void afterResponse(HandshakeResponse handshakeResponse) {
        final Map<String, List<String>> headers = handshakeResponse.getHeaders();

        assertEquals(HEADER_VALUE[0], headers.get(HEADER_NAME).get(0));
        assertEquals(HEADER_VALUE[1], headers.get(HEADER_NAME).get(1));
        assertEquals(HEADER_VALUE[2], headers.get(HEADER_NAME).get(2));
        assertEquals("myOrigin", headers.get("origin").get(0));
    }
}
person Pavel Bucek    schedule 05.12.2014