我对 retrofit 和自定义 RequestInterceptor 有疑问。我正在尝试向我发出的每个请求添加带有内容类型的 header ,所以我制作了这样的自定义 RequestInterceptor:
new RestAdapter.Builder().
setEndpoint(Configuration.BASE_ENDPOINT).
setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Content-type", "application/json");
}
}).
build();
但是当我尝试调用某些 API 时抛出 NullPointerException
。
我将问题追溯到 RequestBuilder 类的这一行:
headers.add(new Header("Content-Type", contentTypeHeader));
错误:
on line 344 : ArrayList headers is null.
你知道我做错了什么吗?我在其他项目中使用了这个确切的代码,它工作得很好。
谢谢
最佳答案
似乎是 Retrofit 中的错误。 RequestBuilder 类中的 header 列表是延迟初始化的,如果您仅通过 RequestInterceptor
添加 "Content-Type"
header ,则 header 列表不会被初始化。只要您添加不同于 "Content-Type"
的额外 header ,此问题就会消失。 “Content-Type”
header 在代码中的处理方式不同,如果它是唯一的 header ,则会出现此问题。
如果 "Content-Type"
是您想要拦截的唯一 header ,那么为了解决这个问题,我会简单地使用 @Headers("Content-type : application/json")
并且你将能够绕过它。
@Headers("Content-type: application/json")
@GET("/some_resource_path")
Response getData();
我创建了一个问题 here
关于java - 改造 header NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24627695/