4

我目前正在使用 Spring Android Resttemplate 与 java 支持的 REST API 进行交互。实际上,我正在使用android 注释向这个后端服务发送 http 调用,我必须说它很震撼。基本上,Android 注释允许您为服务调用定义一个接口以及用于每个可用 api 调用的 http 方法:它将生成与编组/解编组等低级内容相关的所有样板代码,调用正确的根据接口定义的http方法。

现在,我想为 http 请求设置一些标头:知道我只有对定义所有调用的 Service 接口的引用,如何实现这一点?我也可以引用 RestTemplate 对象,但现在似乎有设置标题的方法。

任何帮助将不胜感激谢谢

4

1 回答 1

3

我接近它的方法是ApiClient在应用程序类中创建一个实例并设置一个自定义 REST 模板。

就我而言,我使用 Jackson 进行 JSON 消息转换:

RestTemplate restTemplate = new RestTemplate(fac);
MappingJacksonHttpMessageConverter converter =
        new MappingJacksonHttpMessageConverter();
converter.getObjectMapper().configure(Feature.UNWRAP_ROOT_VALUE, true);
restTemplate
        .getMessageConverters()
        .add(converter);
mClient.setRestTemplate(restTemplate);

我的请求工厂fac看起来像这样:

ClientHttpRequestFactory fac = new HttpComponentsClientHttpRequestFactory() {

    @Override
    protected HttpUriRequest createHttpRequest(HttpMethod httpMethod, URI uri) {
        HttpUriRequest uriRequest = super.createHttpRequest(httpMethod, uri);
        // Add request headers
        uriRequest.addHeader(
                "Content-Type",
                MediaType.APPLICATION_JSON_VALUE);
        return uriRequest;
    }

    @Override
    public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod)
            throws IOException {
        if (Config.DEBUG_REQUESTS) {
            Log.d(TAG, uri);
        }
        return super.createRequest(uri, httpMethod);
    }

};

警告

尽管这适用于我们办公室的所有 Android 设备,但我最近发现似乎并非所有设备都添加了标题!我不确定这是为什么(或具体是哪些设备),但我正在研究它,并在找到解决方案后尝试更新此答案。

于 2012-09-14T08:30:23.740 回答