参考文章
你真的会用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 = 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里面的数据
此时的我
怎么办好捉急啊,后面后台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= "张三";
当时第一次使用这样的格式的时候,我还是懵逼的,怎么还有这样的操作?但是还真能拼凑出后台需要的格式,突然我就不知道要说啥了。哎
方案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,是非表单数据