SpringforAndroidとRobospiceを使用して画像を取得しようとしています。GitHubのさまざまなサンプルに従って、CreateRestTemplateメソッドを使用してSpiceServiceを設定しました。これは、ヘッダーを設定したものです。また、Gson、Form、StringHttpメッセージコンバーターも設定しました。
この設定は、プレーンなJSONを取得する場合にのみ正常に機能しますが、画像をフェッチしようとすると、ヘッダーがいくつかのデフォルト値に設定されます。つまり、Authヘッダーが失われ、リクエストが失敗します。
また、リクエスト自体の中に新しい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;
}
}
}
2つを見ると、おそらくヘッダーでRestTemplateをフェッチするgetRestTemplateメソッドを使用していることがわかります。これはおそらく問題ですが、誰かが私にどのように進めるかについてのヒントを教えてもらえますか?
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;
}