【问题标题】:Wrong headers when trying to GET image尝试获取图像时错误的标题
【发布时间】:2012-12-25 08:43:12
【问题描述】:

我正在尝试使用 Spring for Android 和 Robospice 获取图像。根据 GitHub 上的各种示例,我使用 createRestTemplate 方法设置了我的 SpiceService,这是我设置我的标题。我还设置了 Gson、Form 和 StringHttp 消息转换器。

此设置仅在获取纯 JSON 时工作正常,但当我尝试获取图像时,标头会设置为一些默认值,这意味着我丢失了我的 Auth 标头并且请求失败。

我也尝试在请求本身内设置一个新的resttemplate。

我在这里错过了什么。

编辑: 用于下载 json 的 Request:

public class GetMeRequest extends SpringAndroidSpiceRequest<User> {
public static final String TAG = "GetMeRequest";

public GetMeRequest() {
    super(User.class);
}

@Override
public User loadDataFromNetwork() throws Exception {
    Log.d( TAG, "================loading from network" );
    ResponseObject response = getRestTemplate().getForObject( ApiCalls.USERS_ME_URI, ResponseObject.class );

    Log.d(TAG, response.toString());
    if(!response.data.users.isEmpty() && response.data.users != null){
        return response.data.users.get(0);
    }
    return null;
   }
}

图片请求长这样,基本是BigBinaryRequest

public class ImageRequest extends SpringAndroidSpiceRequest<InputStream> {
protected String url;
protected File cacheFile;
protected String auth;

public ImageRequest(String url, File cacheFile, String auth) {
    super(InputStream.class);
    this.url = url;
    this.cacheFile = cacheFile;
    this.auth = auth;
}

@Override
public InputStream loadDataFromNetwork() throws Exception {
    try {
        java.io.InputStream is = new URL(url).openStream();
        // touch
        cacheFile.setLastModified(System.currentTimeMillis());

        FileOutputStream fileOutputStream = new FileOutputStream(cacheFile);
        Utils.copyLargeFile(is, fileOutputStream);
        return new FileInputStream(cacheFile);
    } catch (MalformedURLException e) {
        Log.e(getClass().getName(), "Unable to create image URL", e);
        return null;
    } catch (IOException e) {
        Log.e(getClass().getName(), "Unable to download image", e);
        return null;
    }
}
}

现在看看这两个,我发现我使用了 getRestTemplate 方法,它可能会用我的标题获取 RestTemplate。这可能是问题所在,但有人可以给我一个关于如何进行的提示吗?

编辑2: 还有我 SpiceService 中的 createRestTemplate 方法

@Override
public RestTemplate createRestTemplate() {
    RestTemplate restTemplate = new RestTemplate() {
        @Override
        protected ClientHttpRequest createRequest( URI url, HttpMethod method ) throws IOException {
            ClientHttpRequest request = super.createRequest( url, method );
            HttpHeaders headers = request.getHeaders();
            headers.setAcceptEncoding( ContentCodingType.GZIP );
            headers.set("Accept", "*/*");
            headers.setUserAgent(P1Application.USER_AGENT);
            headers.setContentType(new MediaType("application","json"));
            headers.set("Authorization", ((P1Application)getApplication()).getAuth());
            return request;
        }
    };


    // set timeout for requests
    ClientHttpRequestFactory factory = restTemplate.getRequestFactory();
    if ( factory instanceof HttpComponentsClientHttpRequestFactory ) {
        HttpComponentsClientHttpRequestFactory advancedFactory = (HttpComponentsClientHttpRequestFactory) factory;
        advancedFactory.setConnectTimeout( TIMEOUT );
        advancedFactory.setReadTimeout( TIMEOUT );
    } else if ( factory instanceof SimpleClientHttpRequestFactory ) {
        SimpleClientHttpRequestFactory advancedFactory = (SimpleClientHttpRequestFactory) factory;
        advancedFactory.setConnectTimeout( TIMEOUT );
        advancedFactory.setReadTimeout( TIMEOUT );
    }

    GsonHttpMessageConverter jsonConverter = new GsonHttpMessageConverter();
    FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
    StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
    final List< HttpMessageConverter< ? >> listHttpMessageConverters = restTemplate.getMessageConverters();

    listHttpMessageConverters.add( jsonConverter );
    listHttpMessageConverters.add( formHttpMessageConverter );
    listHttpMessageConverters.add( stringHttpMessageConverter );
    restTemplate.setMessageConverters( listHttpMessageConverters );
    return restTemplate;
}

【问题讨论】:

  • 我不知道。 /we/ 缺少的是代码。
  • @Marcel 愚蠢的我......我只是假设这里的每个人都是通灵者。添加了两个 Request 类的代码。第一个使用正确的标头按预期工作,第二个使用一组默认标头发送
  • 您的代码有一些我不理解的地方(我猜也不需要)。然而,最大的问题是为什么你不使用RestTemplate 来检索你的图像?这很好用:blog.springsource.org/2009/03/27/rest-in-spring-3-resttemplate -> "Retrieving the photos" 或 jira.springsource.org/browse/SPR-7357
  • @Marcel 那是因为我是这个游戏的新手,只是跟着 RoboSpice 的例子。 =)你是对的。根据您提供的来源使用 RestTemplate 使其按预期设置我的标题。把它放在一个答案中,我会接受它。

标签: android spring resttemplate robospice


【解决方案1】:

您也可以并且应该使用RestTemplate 来检索图像:http://blog.springsource.org/2009/03/27/rest-in-spring-3-resttemplate/ -> “检索照片”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多