Subir una imagen a Google appengine utilizando Robospice con Retrofit

Estoy intentando usar Robospice con Retrofit para subir una imagen a mi blobstore de Google appengine. Puedo obtener la URL de subida proporcionada por GAE, pero cuando intento enviar la URL con la imagen como POST de varias partes obtengo una excepción:

E // RequestRunner.java: 134 (24689): Thread-3363 Se ha producido una excepción durante la ejecución de la red de solicitud: null

E // RequestRunner.java: 134 (24689): retrofit.RetrofitError

E // RequestRunner.java: 134 (24689): en retrofit.RestAdapter $ RestHandler.invokeRequest (RestAdapter.java:343)

E // RequestRunner.java: 134 (24689): en retrofit.RestAdapter $ RestHandler.invoke (RestAdapter.java:222)

E // RequestRunner.java: 134 (24689): en $ Proxy0.uploadImage (Método nativo)

E // RequestRunner.java: 134 (24689): en ginger.connexus.network.UploadImage.loadDataFromNetwork (UploadImage.java:24)

E // RequestRunner.java: 134 (24689): en ginger.connexus.network.UploadImage.loadDataFromNetwork (UploadImage.java:1)

E // RequestRunner.java: 134 (24689): en com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork (CachedSpiceRequest.java:45)

E // RequestRunner.java: 134 (24689): en com.octo.android.robospice.request.RequestRunner.processRequest (RequestRunner.java:130)

E // RequestRunner.java: 134 (24689): en com.octo.android.robospice.request.RequestRunner $ 1.run (RequestRunner.java:197)

E // RequestRunner.java: 134 (24689): en java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:390)

E // RequestRunner.java: 134 (24689): en java.util.concurrent.FutureTask.run (FutureTask.java:234)

E // RequestRunner.java: 134 (24689): en java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1080)

E // RequestRunner.java: 134 (24689): en java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:573)

E // RequestRunner.java: 134 (24689): en java.lang.Thread.run (Thread.java:841)

D // RequestProgressManager.java: 75 (24689): Enviando progreso COMPLETO

Mi interfaz de API

public interface MyApi { @Multipart @POST("/{uploadurl}") MyImage uploadImage( @Path("uploadurl") String uploadurl, @Part("stream") long streamId, @Part("image") TypedFile image); } 

Mi Retrofit Gson Spice Servicio

 public class MyService extends RetrofitGsonSpiceService { private final static String BASE_URL = "theinternet"; @Override protected String getServerUrl() { return BASE_URL; } @Override public void onCreate() { super.onCreate(); addRetrofitInterface(MyApi.class); } } 

Mi clase Retrofit Spice Request

 public class UploadImage extends RetrofitSpiceRequest<MyImage, MyApi> { private final String uploadurl; private final long streamId; private final TypedFile image; public UploadImage(String uploadurl, long streamId, File image) { super(MyImage.class, MyApi.class); this.uploadurl = uploadurl; this.streamId = streamId; this.image = new TypedFile("image/jpeg", image); } @Override public MyImage loadDataFromNetwork() throws Exception { return getService().uploadImage(uploadurl, streamId, image); } } 

Mi llamada de ejecución

 UploadImage upload = new UploadImage(uploadUrl, streamId, file); getSpiceManager().execute(upload, new MyImageUploadListener()); 

Intente utilizar @EncodedPath lugar de @Path y realice la codificación de URL.

 public interface MyApi { @Multipart @POST("/{uploadurl}") MyImage uploadImage(@EncodedPath("uploadurl") String uploadUrlEncoded, ... ); } 

Para lidiar con el problema de "% 2F", usaría el siguiente fragmento

 String encodedValue = URLEncoder.encode(String.valueOf(uploadUrl), "UTF-8"); // URLEncoder encodes for use as a query parameter. Path encoding uses %20 to // encode spaces rather than +. Query encoding difference specified in HTML spec. // Any remaining plus signs represent spaces as already URLEncoded. encodedValue = encodedValue.replace("+", "%20"); String uploadUrlEncoded = encodedValue.replace("%2F", "/"); 
  • Retrofit: parámetros de consulta múltiples en el comando @GET?
  • RoboSpice y ORMLite - Acceso a los datos
  • Retrofit / Robospice: ¿Obtener los encabezados de respuesta de una solicitud exitosa?
  • Cambiar ConnectionTimeout de Retrofit OkHttpClient en tiempo de ejecución
  • Uso de RoboSpice y RxJava
  • Borrar datos antiguos de caché con robospice ormlite
  • ¿Es realmente necesario RoboSpice shouldStop ()?
  • No hay ningún error de este tipo al usar robospice-retrofit y getstream.io
  • Qué es la Biblioteca RoboSpice en android
  • Android: cómo recuperar el objeto JSON en caso de una excepción con RoboSpice
  • Guardando colección extranjera en ORMLite con Robospice y Scala
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.