使用Android上的Retrofit在对象内部键入文件

时间:2015-01-27 17:37:42

标签: android ruby-on-rails paperclip retrofit

我正在开发一款Android应用,通过Retrofit向服务器(rails)发送请求。

我目前的问题是文件上传。在服务器端,我有回形针来处理文件上传。

我似乎无法在一个对象中包含一个TypedFile,我想将其作为参数发送 这是我正在调用的api方法,其参数为

@Multipart
@POST("/containers/{id}/items")
void addItem(@Path("id") int id,
             @Part("item")NewItemData newItemData,
             Callback<String> callback);

基本上我想发布这个对象(包含TypedFile

public class NewItemData{
    String original_filename;
    String content_type;
    TypedFile file;
    String description;
    String location;
    int container_id;
    ...
}

修改 我忘了告诉你我是如何创建对象的

public NewItemData(Context context, String file_path){
    String mime_type = FileUtilities.getMimeType(file_path);
    String[] file_name_parts = file_path.split("/");
    String file_name = file_name_parts[file_name_parts.length-1];
    this.original_filename = file_name;
    this.full_file_path = file_path;
    this.content_type = mime_type;
    File file_tmp = new File(file_path);
    this.file = new TypedFile("application/octet-stream", file_tmp);
    this.description = "";
    this.location = "";
}

结束修改

这是我得到的错误:

retrofit.RetrofitError: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 2

这是NewItemData转换为json

的对象
{"original_filename":"IMG_20150121_221732.jpg","content_type":"image/jpeg","description":"","file":{},"location":"","container_id":0}

正如您所见,&#34;文件&#34;字段是空的,所以我假设上面的错误指的是&#34; file&#34; =&GT; {}而不是二进制文件

到目前为止,我所尝试的并没有奏效,所以我的问题是:

  • 可以发布&#34;包装&#34;多部分模式中的对象?
  • 如果是的话,我应该写什么注释以及在哪里?
  • 我应该实现自定义序列化程序吗?

如果您需要其他信息,请询问 谢谢

1 个答案:

答案 0 :(得分:1)

创建restAdapter实例时,只需添加此行即可添加转换器 .addConverterFactory(GsonConverterFactory.create()),如下所示

Retrofit retrofit = new Retrofit.Builder() .baseUrl(RestConnection.BASE_URL_MULTIMEDIA) .addConverterFactory( GsonConverterFactory.create()) .client(client) .build();