retrofit2 post 文字,单图片,多图

参考文章

你真的会用Retrofit2吗?Retrofit2完全教程
Retrofit中@Body的使用
Android 手把手教你使用Retrofit2
Android 主流开源框架(四)Retrofit 使用详解

方案1:请求链接带参数,文字信息放Body
方案2:文字图片一起传递
方案3:全部都是body上传文字
方案4:全部都是body上传文字(带有结构的格式)
方案5:请求链接带参数,body含有文字,并且上传单张图片
方案6:上传多张图片,文件
方案7:全部都是body上传文字,上传的还是数组对象

方案1:请求链接带参数,文字信息放Body
后台开发人员说要采用post请求,然后文字要放在body里面的,链接后面也有参数。比如这样
xxxx.com?userId=8948&passkey=jfeowijfew

    api
    @Multipart
    @POST("xxxxx.php")
    Observable sendFrdMsg(@QueryMap HashMap paramsMap,@Part("Msg") RequestBody Msg);

paramsMap 里面存放的是链接后面的参数
Msg 存放的是body里面的参数

  HashMap map = new HashMap();
        map.put("userId",8948+"");
        map.put("passkey",jfeowijfew);
        RequestBody firstBody = RequestBody.create( MediaType.parse("multipart/form-data"), Msg);
  //请求服务器
 api.sendFrdMsg(map,firstBody)

方案2: 文字图片一起传递 参考文章

@Multipart
@POST("/xxx")
Observable> addInfo(@Part List requestBodyMap);
       List parts = new ArrayList<>();
        parts.add(toRequestBodyOfText("name", userName));//文字
        parts.add(toRequestBodyOfImage("image",foundImage));//图片
 //文字
private MultipartBody.Part toRequestBodyOfText (String keyStr, String value) {
        MultipartBody.Part body = MultipartBody.Part.createFormData(keyStr, value);
        return body;
    }
    //keyStr决定了你要上传到服务器的名称
    //pFile.getName() 表示文件的名称
   //图片
    private MultipartBody.Part toRequestBodyOfImage(String keyStr, File pFile){
        RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), pFile);
        MultipartBody.Part filedata = MultipartBody.Part.createFormData(keyStr, pFile.getName(), requestBody);
        return filedata;
    }

方案3:全部都是body上传文字

    @FormUrlEncoded
    @POST("test.php")  
    Observable postAnnouncement3(@FieldMap Map map);
    Map map = new HashMap<>();
    map.put("userName","zzzzz");
    api.postAnnouncement3(map);

方案4:全部都是body上传文字(带有结构的格式)
接口:

    @FormUrlEncoded
    @POST("xxxx.php")  
    Observable postment(@FieldMap Map map);

后台需要的格式为

{
  key0:value0,
  key1:value1,
  user:{
    "sex":1,
    "name":"张三"
  }
}

看到这样的方式,首先我想到的是采用@FieldMap Map map 来上传

Map map = new HashMap
map.put("key0","value0");
map.put("key1","value1");
UserBean user = new UserBean();
user.setSex(1);
user.setName("张三");
map.put("user",user.toString());

结果我发现上述方法后台无法获取user里面的数据
又改

Map map = new HashMap
map.put("key0","value0");
map.put("key1","value1");
Map objMap= new HashMap
objMap.put("sex",1);
objMap.put("name","张三");
map.put("user",objMap);

然后我又发现上述方法还是无法让后台获取user里面的数据
此时的我


aaa.jpg

怎么办好捉急啊,后面后台PHP开发人员说拼凑好了,OK,那行吧

Map map = new HashMap
map.put("key0","value0");
map.put("key1","value1");
map.put("user[sex]",1);
map.put("user[name]","张三");


//=====第二种方案,这种方案只针对,后台不需要key的方式,比如socket传递参数。或者只有一个key的传递方式
public class PostModel{
  private String key0;
  private String key1;
  private User user;
 static User{
    private int sex;
    private String name;
  }
}
Map map = new HashMap
PostModel postModel = new PostModel();
postModel.setKey0 = "value0";
postModel.setKey1 = "value1";
postModel.getUser().setSex = 1;
postModel.getUser().setName= "张三";

当时第一次使用这样的格式的时候,我还是懵逼的,怎么还有这样的操作?但是还真能拼凑出后台需要的格式,突然我就不知道要说啥了。哎


dddd.jpg

方案5:请求链接带参数,body含有文字,并且上传图片

接口:
   //注意我使用了@QueryMap   @PartMap
    @Multipart
    @POST("aaaaPhoto.php")
    Observable postNewCompanyLicence(@QueryMap Map map,
                                                  @Part MultipartBody.Part photo1,
                                                  @Part MultipartBody.Part photo2,
                                                  @PartMap Map map2);
   //....省去代码
       Map map = new HashMap(1);
        map.put("ObjectRoleID", "1234");
        Map map2 = new HashMap(7);
        map2.put("B_Photo_W", toRequestBodyOfText(bean.getB_Photo_W() + ""));
        map2.put("B_Photo_H", toRequestBodyOfText(bean.getB_Photo_H() + ""));
        map2.put("S_Photo_W", toRequestBodyOfText(bean.getS_Photo_W() + ""));
        map2.put("S_Photo_H", toRequestBodyOfText(bean.getS_Photo_H() + ""));
        map2.put("UserID", toRequestBodyOfText("aaaa"));
        map2.put("PassKey", toRequestBodyOfText("bbbb")));
        map2.put("PhotoAlbumID",toRequestBodyOfText("ccccc"));

        File bigFile = new File(bean.getBigPicPath());//图片的地址
        File smlFile = new File(bean.getSmlPictPath());
        RequestBody bigImageBody0 = RequestBody.create(MediaType.parse("multipart/form-data"), bigFile);
        RequestBody smlImageBody0 = RequestBody.create(MediaType.parse("multipart/form-data"), smlFile);
        //这里的Photo  S_Photo是作为key
        MultipartBody.Part bigPart = MultipartBody.Part.createFormData("Photo", bigFile.getName(), bigImageBody0);
        MultipartBody.Part smlPart = MultipartBody.Part.createFormData("S_Photo", smlFile.getName(), smlImageBody0);
        api.postNewCompanyLicence(map, bigPart, smlPart, map2)



        public RequestBody toRequestBodyOfText (String value) {
        RequestBody body = RequestBody.create(MediaType.parse("text/plain"), value);
        return body ;
    }
   //....省去代码

方案6:上传多张图片,文件

接口
    @Multipart
    @POST()
    Observable upload(@Url String url,@Part List requestBodyMap);
//注意这里我写的是file[]
  List parts = filesToMultipartBodyParts("file[]",files);
//url是我请求的地址,parts是我需要上传的文件,files是List
        BaseRequest.postUpLoadFile(url, parts, new SPSuccessListener() {
            @Override
            public void onRespone(String msg, Object response) {
            }
        }, new SPFailuredListener() {
            @Override
            public void onRespone(String msg, int errorCode) {
            }
        });

 /**
    * @date: 2019/6/18 0018
    * @author: gaoxiaoxiong
    * @description:多文件上传
     * @keyStr 作为上传的名字name,多图上传需要加上[]
    **/
    public  List filesToMultipartBodyParts(String keyStr,List files) {
        List parts = new ArrayList<>(files.size());
        for (File file : files) {
            RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
            MultipartBody.Part part = MultipartBody.Part.createFormData(keyStr, file.getName(), requestBody);
            parts.add(part);
        }
        return parts;
    }

方案7:全部都是body上传文字,上传的还是数组对象
后台需要的格式

{
  userList:[
      {
        "name":王五
      },
      {
       "name":张三
      }
}

//=================第二种==========
{
  userName:"张三",
  userList:[
      {
        "name":王五
      },
      {
       "name":张三
      }
   ]
}
第一种 接口
@POST()
Observable upload(@Url String url, @Body Map> requestBody);

第二种 map方式
@POST()
Observable upload(@Url String url, @QueryMap Map map);
//1、创建一个对象
UserModel.class
class UserModel{
    private String userName;
    private List userList;
  //省略 get/set
}

class UserFrends{
  private String name;
   //省略 get/set
}
UserModel userModel = UserModel();
UserFrends userFrends = UserFrends();
userModel.getUserList().add(userFrends)
map.put("key",gson.toJson(userModel ))

注意
1、@Body不能与@FormUrlEncoded共用
2、我们平时使用@Body其实是转化成Json格式数据传递给后台
3、使用@Body,是非表单数据

你可能感兴趣的:(retrofit2 post 文字,单图片,多图)