2016-12-01 17 views
6

Tôi đang cố gắng xử lý yêu cầu không có tiêu đề Accept theo cách cụ thể, nhưng Jersey có vẻ như bị bẻ cong khi điền vào một tài khoản, bất kể tôi làm gì, vì vậy nó luôn giống như yêu cầu có tiêu đề Accept, ngay cả khi nó không.Làm thế nào để Jersey Test/Client không điền vào tiêu đề Chấp nhận mặc định?

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); 
    } 
} 

kiểm tra này kết quả trong:

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

Bằng cách nào đó có một mặc định Accept tiêu đề của text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 đó được thiết lập ở đâu đó. Nó không phải là tài liệu, và tôi rất thích tìm hiểu làm thế nào để vô hiệu hóa nó. Tôi đã xem xét qua nguồn Jersey, nhưng dường như không thể xác định vị trí của điều này đang xảy ra hoặc tại sao.

Cập nhật: khi tôi sử dụng curl để đạt điểm cuối mà không có tiêu đề Chấp nhận, không có tiêu đề Chấp nhận được tạo ra, do đó, vấn đề nằm trong Jersey Client hoặc môi trường Jersey Test, bằng cách nào đó.

Cập nhật 2: Lỗi này thể hiện khi sử dụng thùng chứa thử nghiệm Grizzly2 mặc định hoặc vùng chứa thử JDK, nhưng KHÔNG có trong vùng chứa thử nghiệm trong bộ nhớ.

+0

Nó có thể được đặt tại thời điểm UserAgent được tạo cho yêu cầu. Có một cái nhìn sâu sắc về nó https://tools.ietf.org/html/rfc7231#section-5.3.2. Ngoài ra để giải quyết ở trên, bạn có thể thử và ghi đè lên tiêu đề Chấp nhận với giá trị rỗng/trống trong lớp Tài nguyên của bạn không? – nullpointer

+0

@nullpointer Tôi tìm thấy mã ở Jersey có thêm User-Agent cho các yêu cầu và tôi không thấy bất kỳ mã nào gần đó thêm tiêu đề Chấp nhận, vì vậy không, đó không phải là khi được thêm. Tôi biết chính xác tiêu đề Accept là gì, và tôi đã đọc RFC và tham khảo chúng rất nhiều. Tôi không có ý tưởng những gì bạn có ý nghĩa bằng cách ghi đè các tiêu đề chấp nhận trong lớp tài nguyên. Lớp Tài nguyên là những gì có trên máy chủ, không có gì trong tài liệu Jersey về các tiêu đề ghi đè và tôi không cố gắng thay thế tiêu đề Chấp nhận mà tôi đang nhận. Tôi muốn xem tiêu đề Chấp nhận là gì, hoặc nếu không có gì. – postfuturist

+0

Bạn đã thử với wget hoặc curl là khách hàng? Chính xác * phương thức @Test làm gì? – gsl

Trả lời

0

Không chắc liệu điều này có giúp ích gì cho người khác hay không nhưng chúng tôi đã nhìn thấy hành vi tương tự đang gọi dịch vụ đang được sản xuất với mã khách hàng của chúng tôi. Chúng tôi đang sử dụng Jersey 2.21.1.

mở rộng mã khỏi bài đăng gốc và tìm thấy những điều sau là đúng:

  • nếu Accept tiêu đề là null thì Jersey cho biết thêm mặc định
  • nếu Accept tiêu đề là một sản phẩm nào String sau đó là một sản phẩm nào Accept tiêu đề được sử dụng
  • nếu tiêu đề Accept có giá trị được sử dụng

Tôi không chắc chắn nếu có một cách để nói với Jersey không thêm giá trị mặc định khi một null được sử dụng.

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); 
    } 

} 
Các vấn đề liên quan