在上传图片的过程中 我们经常上传一张图片的同时还要上传 其他一些附加信息 这里我是使用Retrofit 进行图片上传的  这里我就 已经认为你会Retrofit的基本使用了

现在上关键代码 

1.

MultipartBody.Builder form = new MultipartBody.Builder();


form.setType(MultipartBody.FORM);
//设置表单字段
form.addFormDataPart("width", width);
form.addFormDataPart("height", height);
//设置图片信息
File file = new File("图片地址");
RequestBody fileBody = RequestBody.create(MediaType.parse("image/*"), file);form.addFormDataPart("upfile", file.getName(), fileBody);

Builder 是MultipartBody中的一个内部类 其实就是建造者模式  利用这个建造者 设置 MIME  类型, 这里是表单形式,接下来 就是设置 文字 信息 ,最重要的就是RequestBody的出创建,里面包含了 请求信息 。

填写好要上传的字段之后 创建MultipartBody  partBody = form.build();

那Retrofit如何使用这个 partBody 呢


/*
 * 发表图片上传
 * @param file
 * @return
 */
@POST("api/image/upload")
Call<UploadImageResult> uploadPublishImage(@Body MultipartBody data);

如果你使用过Retrofit的话 看到 这点 应该就不会再问啥了


2.

上面这中方式比较优雅  下面还有另一种  图片 上传方式  

RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpeg"), new File(“文件路径"));


同样也是 创建一个RequestBody 那如何使用呢 看请求代码



@Multipart
@POST("api/image/upload")
Call<UploadFileResult> uploadImage(@Part("upfile\"; filename=\"image.jpg\"") RequestBody file,@Part("width") int width, @Path("height")int height);



下面的这段代码看着比较乱 明显没有第一种看着 优雅



3.还有一种情况 就是我们有时候可能 一个接口要一次上传好多字段,结果我们一个请求接口里面总是写好多的参数,看起来乱乱的,一个不小心就要写错位置


那如何比较清晰一点呢,很简单 就是利用Map, Map的数据结构 就是键值对, key就是你要上传的参数名称,value就是你要上传的值


Map<String, String> data = new HashMap<>();
data.put("type", type);
data.put("reason", reason);
data.put("other_id",id);

这个 map你可以无限写参数 对应也很明确,再也不用一个请求接口写好多参数,老长老长了。

那如何请求呢


/* 举报接口
 * @return
 */
@FormUrlEncoded
@POST("api/report/create")
Call<BaseResult> reportSomeBody(@FieldMap Map<String, String> data);



就是用到了 这几几个注解 千万不要写错了 一个不可以少 有了这几个 以后就可以优雅的写很多参数了,上面的这个是post请求,那就有人要问了,那get请求如果也是很多参数那怎么办


当然 有@FieldMap这个注解 就会有@QueryMap这个注解 对应于Get请求,其他的 请自行补脑。