2012-12-25 1 views
1

J'essaie d'aller chercher une image en utilisant Spring pour Android et Robospice. J'ai mon SpiceService mis en place avec une méthode createRestTemplate selon les différents échantillons sur GitHub et c'est là que j'ai défini mes en-têtes. J'ai également placé des convertisseurs de message de Gson, de forme et de StringHttp. Cette configuration fonctionne correctement lorsque j'obtiens un JSON simple, mais lorsque j'essaie de récupérer une image, les en-têtes sont définis sur des valeurs par défaut, ce qui signifie que je perds mon en-tête Auth et que la requête échoue.Mauvais en-têtes lors de la tentative d'obtention de l'image

J'ai également essayé de définir un nouveau resttemplate dans la demande elle-même.

Qu'est-ce qui me manque ici?

EDIT: La demande utilisé pour le téléchargement d'un 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; 
    } 
} 

La demande d'image ressemble à ceci et est essentiellement un 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; 
    } 
} 
} 

Vous voyez maintenant deux je vois que je utilisez la méthode getRestTemplate qui récupère probablement le RestTemplate avec mes en-têtes. C'est probablement le problème, mais quelqu'un peut-il s'il vous plaît me donner un indice sur la façon de procéder?

Edit2: Et la méthode createRestTemplate de mon SpiceService

@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; 
} 
+1

Je ne sais pas. Ce que/nous manquons est le code. –

+0

@Marcel stupide moi ... J'ai juste supposé que tout le monde ici est psychique. Code ajouté pour les deux classes Request. Le premier fonctionne comme prévu avec des en-têtes corrects et le second est envoyé avec un jeu d'en-têtes par défaut – Qw4z1

+0

Il y a quelques petites choses sur votre code que je ne comprends pas (je n'ai pas besoin non plus, je suppose). Cependant, la grande question est pourquoi vous n'utilisez pas le 'RestTemplate' pour récupérer vos images? Cela fonctionne très bien: http://blog.springsource.org/2009/03/27/rest-in-spring-3-resttemplate/ -> "Récupérer les photos" ou https://jira.springsource.org/browse/SPR-7357 –

Répondre

Questions connexes