我正在尝试使用适用于Android和Robospice的Spring获取图像。根据GitHub上的各种示例,我使用createRestTemplate方法设置了我的SpiceService,并且这是我设置了标头。我还设置了Gson,Form和StringHttp消息转换器。尝试获取图像时出现错误标题
这个设置工作得很好,当只有普通的JSON,但是当我试图获取图像的头部设置为一些默认值,这意味着我失去了我的身份验证头,请求失败。
我也尝试在请求本身内设置一个新的resttemplate。
我在这里错过了什么。
编辑: 用于下载一个JSON的请求:
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。这可能是问题,但有人可以给我一个关于如何进行的提示吗?
EDIT2: 从我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;
}
我不知道。我们缺少的是代码。 –
@Marcel愚蠢的我......我只是假设这里的每个人都是精神病患者。添加了两个Request类的代码。第一个按预期工作,使用正确的标题,第二个使用默认标题集发送 – Qw4z1
关于你的代码有几件事我不明白(我猜也不需要)。但是,最大的问题是你为什么不使用'RestTemplate'来检索你的图像?这工作得很好:http://blog.springsource.org/2009/03/27/rest-in-spring-3-resttemplate/ - >“检索照片”或https://jira.springsource.org/browse/SPR-7357 –