Pertanyaan Bagaimana cara mendapatkan Jersey Test / Klien untuk tidak mengisi header Terima default?


Saya mencoba menangani permintaan tanpa Accept tajuk dengan cara tertentu, tetapi Jersey tampaknya sangat ingin mengisi satu, tidak peduli apa yang saya lakukan, sehingga selalu terlihat seperti permintaan memiliki Accept tajuk, bahkan jika tidak.

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;

import static org.junit.Assert.assertEquals;

public class JerseyTestTest extends JerseyTest {

    @Path("hello")
    public static class HelloResource {
        @GET
        public String getHello(@Context HttpHeaders httpHeaders) {
            String acceptHeader = httpHeaders.getHeaderString(HttpHeaders.ACCEPT);
            return acceptHeader != null ? acceptHeader : "No Accept Header";
        }
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(HelloResource.class);
    }

    @Test
    public void test() {
        final String hello = target("hello").request()
                .header(HttpHeaders.ACCEPT, null) // null means remove header
                .get(String.class);
        assertEquals("No Accept Header", hello);
    }
}

Hasil tes ini:

org.junit.ComparisonFailure: 
Expected :No Accept Header
Actual   :text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

Entah bagaimana ada default Accept tajuk text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 yang diatur di suatu tempat. Ini tidak didokumentasikan, dan saya ingin tahu cara menonaktifkannya. Saya telah melihat melalui sumber Jersey, tetapi tidak dapat menemukan di mana ini terjadi atau mengapa.

Perbarui: ketika saya menggunakan curl untuk menekan titik akhir tanpa header Accept, tidak ada header Accept yang dihasilkan, jadi masalahnya terletak pada Klien Jersey atau lingkungan Uji Jersey, entah bagaimana.

Perbarui 2: Bug ini ditampilkan saat menggunakan wadah uji standar Grizzly2 atau wadah uji JDK, tetapi BUKAN dengan wadah uji Memori.


7
2017-12-01 00:54


asal


Jawaban:


Tidak yakin apakah ini membantu orang lain tetapi kami melihat perilaku serupa yang memanggil layanan dalam produksi dengan kode klien kami. Kami menggunakan Jersey 2.21.1.

Memperluas kode dari pos asli dan menemukan yang berikut ini benar:

  • jika Accept header nol maka Jersey menambahkan default
  • jika Accept tajuk kosong String lalu kosong Accept header digunakan
  • jika Accept header memiliki nilai yang digunakan

Saya tidak yakin apakah ada cara untuk memberitahu Jersey untuk tidak menambahkan nilai default ketika nol digunakan.

public class JerseyAcceptHeaderTest extends JerseyTest {

    @Path("hello")
    public static class HelloResource {
        @GET
        public String getHello(@Context HttpHeaders httpHeaders) {
            String acceptHeader = httpHeaders.getHeaderString(HttpHeaders.ACCEPT);
            System.out.println("SERVER RECEIVED:" + acceptHeader);

            if (acceptHeader == null) {
                return "Null Accept Header";
            } else if (acceptHeader.equals("")) {
                return "No Accept Header";
            } else {
                return acceptHeader;
            }
        }
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(HelloResource.class);
    }

    /**
     * this seems to be a bug in Jersey
     * it overrides a null Accept header
     */
    @Test
    public void test_accept_header_with_null() {
        final String acceptHeader = target("hello").request()
                .header(HttpHeaders.ACCEPT, null)
                .get(String.class);
        assertEquals("Null Accept Header", acceptHeader);
    }

    @Test
    public void test_accept_header_with_empty_string() {
        final String acceptHeader = target("hello").request()
                .header(HttpHeaders.ACCEPT, "")
                .get(String.class);
        assertEquals("No Accept Header", acceptHeader);
    }

    @Test
    public void test_accept_header_with_spaced_string() {
        final String acceptHeader = target("hello").request()
                .header(HttpHeaders.ACCEPT, "  ")
                .get(String.class);
        assertEquals("No Accept Header", acceptHeader);
    }

    @Test
    public void test_accept_header_with_value() {
        final String acceptHeader = target("hello").request()
                .header(HttpHeaders.ACCEPT, "application/json")
                .get(String.class);
        assertEquals("application/json", acceptHeader);
    }

}

0
2018-02-05 20:20