Próbuję przyjąć dowolny zestaw nagłówków HTTP i zrzucić go do wystąpienia WebResource. Interfejs WebResource pozwala to zrobić za pomocą parametrów zapytania, ponieważ oferuje zarówno

        webResource.queryParam(key, value)

I

        webResource.queryParams(MultivaluedMap<String, String> queryMap)

API nie pozwala jednak na zrobienie tego samego z nagłówkami. Jest tylko jedna funkcja,

            webResource.header(key, value)

Co pozwala na wprowadzenie pary klucz-wartość dla nagłówka HTTP, ale bez funkcji

 webResource.headers(MultivaluedMap<String, String> headersMap)

Aby rozwiązać problem, próbowałem pobrać konstruktora z WebResource i iterować po nim, dodając nagłówki jeden po drugim

        WebResource.Builder builder = webResource.getRequestBuilder();
    for(Map.Entry<String, String> headersMapEntry : headersMap.entrySet()){
        builder = builder.header(
                       headersMapEntry.getKey(), headersMapEntry.getValue());
    }

Ale wydaje się, że to nie rozwiązuje mojego problemu.

Czy ktoś ma pomysł, jak mogę obejść ten problem z Jersey, aby zrzucić dowolną mapę do nagłówków mojego WebResource?

Dzięki, David.

4
David Karam 21 lipiec 2011, 19:51
Jak iterowanie mapy i ustawianie poszczególnych nagłówków nie rozwiązuje problemu?
 – 
Christopher Currie
2 sierpień 2011, 20:32
Hej Christopher, twoje pytanie brzmi dokładnie, dlaczego jest mi tak ciężko. Iteruję ręcznie, używając powyższego kodu lub „webResource.getRequestBuilder().header(key, value);” i albo nie ustawia poprawnie nagłówka (sprawdzam pakiety wychodzące wysyłane na Wireshark), getRequestBuilder() w kodzie źródłowym Jersey to po prostu "return new Builder()", co budzi wątpliwości, czy to zrobić, ale jeśli sprawdzisz wszystkie inne funkcje, które zwracają Builder (cookie(), encję, ...), użyją one również getRequestBuilder().
 – 
David Karam
4 sierpień 2011, 12:35

3 odpowiedzi

Najlepsza odpowiedź

Okazało się, że jedynym sposobem na obejście tego jest najpierw wyodrębnienie requestBuildera z webResource za pomocą metody getRequestBuilder(), a następnie użycie requestBuilder do zbudowania i wykonania reszty żądania.

5
David Karam 23 sierpień 2011, 00:48
Nie wiem. Nie pracowałem z tym od dawna. Chociaż pamiętam, że to była kompletna niespodzianka. Chciałbym wrócić i sprawdzić to ponownie.
 – 
David Karam
29 listopad 2013, 00:57

Ponieważ nie możesz wywołać rzeczywistego żądania, jeśli pobrałeś RequestBuilder lub PartialRequestBuilder, musisz pobrać:

WebResource.Builder builder = webResource.getRequestBuilder();

WebResource.Builder ma pobierać, publikować itp.:

response = builder.post(ClientResponse.class, body);
0
Akos K 11 grudzień 2014, 12:15

Ten post dokładniej wyjaśnia ten problem i rozwiązanie na przykładach: http:// juristr.com/blog/2015/05/jersey-webresource-ignores-headers/

0
Peter Isberg 12 sierpień 2015, 14:17