- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试以特定方式处理没有 Accept
header 的请求,但无论我做什么,Jersey 似乎都一心想填写一个,所以它看起来总是请求有一个 Accept
header ,即使它没有。
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);
}
}
这个测试结果:
org.junit.ComparisonFailure:
Expected :No Accept Header
Actual :text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
不知何故有一个默认的 Accept
header text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
在某处设置。它没有记录,我很想弄清楚如何禁用它。我查看了 Jersey 源代码,但似乎无法找到发生这种情况的位置或原因。
更新:当我使用 curl 在没有 Accept header 的情况下命中端点时,没有生成 Accept header ,因此问题出在 Jersey 客户端或 Jersey 测试环境中。
更新 2:当使用默认的 Grizzly2 测试容器或 JDK 测试容器时会出现此错误,但不会使用 In Memory 测试容器。
最佳答案
不确定这是否对其他人有帮助,但我们看到类似的行为使用我们的客户端代码调用生产中的服务。我们正在使用 Jersey 2.21.1。
扩展了原始帖子中的代码,发现以下内容为真:
Accept
header 为空,则 Jersey 添加默认值 Accept
header 是一个空的 String
则使用一个空的 Accept
header Accept
header 有一个值,它就会被使用 我不确定是否有办法告诉 Jersey 在使用 null 时不要添加默认值。
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);
}
}
关于java - 如何让 Jersey Test/Client 不填写默认的 Accept header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900870/
在 HTTP 中,您可以在请求中指定您的客户端可以使用 accept header 接受响应中的特定内容,其值如 application/xml。内容类型规范允许您在内容类型中包含参数,例如chars
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
我的 RESTFul API 只能响应 JSON 编码的数据(即我所有的 header 都有 Content-Type: application/json)。如果请求具有不允许 JSON 的 Acce
我有 C linux TCP 客户端/服务器应用程序。我想出了一个奇怪的场景,但我不知道这个应用程序是否有任何后果。我有一个可以接受 N 个连接的服务器端,例如这个服务器将接受 100 个连接。在这种
我试图找出 的可能值范围接受 和 接受-联系 header 字段,但我在 RFC 中找不到完整列表。有谁知道他们在哪里?我经常看到 Accept: application/sdp;level=1,
在 TCP 套接字代码中,我们创建了 2 个套接字。第一个接受新连接,第二个接受来自客户端的数据并在新连接建立时创建。 TCP header 中的哪个控制位允许服务器知道将此段传递给 ServerSo
我可以设置 Request.Content-Type = ... , Request.Content-Length = ... 如何设置Accept和Accept-Language? 我想上传一个文件
假设A是服务器,B是客户端。 B 创建一个到服务器 A 的套接字 b 并 ServerSocket.accept() 创建一个相应的套接字 a 对于客户端 B 现在,如果服务器 A 关闭了 a 但客户
如果客户端connect()先于服务端accept()成功,那么客户端如何知道服务端accept()成功呢?如果在 connect() 成功和服务器 accept() 之间的时间间隔调用 send()
这是我的代码: void error(const char *msg) { perror(msg); exit(1); } void sServer::acceptClientConn
在我的 pom.xml 中有以下详细信息 org.codehaus.jackson jackson-core-asl 1.9.13
假设我有两个如下所示的端点: @GET @Path("/blah") @Produces(MIME_TYPE_1) public Thing getThing() { .... } @GET
我的 Controller : @RestController public class ClawerController { @RequestMapping("/hello"
我不想要可视化 merge 工具,我也不希望必须 vi 冲突文件并手动在 HEAD(我的)和导入的更改(他们的)之间进行选择。大多数时候,我要么想要他们的所有更改,要么想要我的所有更改。通常这是因为我
我正在使用 spring 4.1.1.RELEASE 并包括: pom 中的 jackson-core-asl 1.9.13 和 jackson-mapper-asl 1.9.13 来创建一个带有 R
我正在尝试开发自己的基于非阻塞 NIO 消息的通信库。我已经阅读了 1000 个关于它的教程和书籍章节,我认为最终我得到了一些可以在很少的同时连接下工作的东西。但是当我在服务器端共存许多连接时,我遇到
我正在尝试编写一个 Bind 元编程模板辅助元函数,将模板参数绑定(bind)到某物。 我有一个简单的模板元函数的工作实现: template struct MakePair { using
我使用 spring 构建 Restful API,当我访问以下方法时: // get the entity in DB by using id number @RequestMapping(
只是想知道是否有一种方法可以通过 ASP.NET Core 中的属性强制检查 HTTP header 值是否属于一组给定值(例如 application/json,应用程序/xml) 我知道有 Pro
我是一名优秀的程序员,十分优秀!