《一》四种网络请求方式:
- GET : 向服务器发起数据请求,获取信息。类似于数据库的select操作,只是查询,不会影响资源的内容。
- POST : 向服务器发送数据,该请求会改变数据的种类等资源。类似于数据库的insert操作,会创建新的内容。
- DELETE:用来删除某一个资源。类似于数据库的delete操作。
- PUT : 向服务器发送数据,从而改变信息。类似于数据库的update操作,用来修改内容。
《二》Retrofit通过注解的方式,配置不同的网络请求。主要涉及到@Path、@Query、@QueryMap、@Body、@Field的用法等。
假设你的BASE_URL = "http://192.168.0.1/"
1、GET请求:
(1)情形一:
@Query
仅带查询参数:http://192.168.0.1/weather?city=北京
@GET("weather")
Observable<WeatherEntity> getWeather(@Query("city") String city);
(2)情形二:
@Path
请求参数直接跟在请求路径下:http://192.168.0.1/weather/北京
@GET("weather/{city_name}")
Observable<Object> getWeather(@Path("city_name") String city_name);
(3)情形三:
@Path和@QueryMap结合
此种情形用得比较少:http://192.168.0.1/weather/北京?user_id=1&user_name=jojo
@GET("weather/{city_name}")
Observable<Object> getWeather(@Path("city_name")String city_name, @QueryMap Map<String, String> queryParams);
HashMap<String, String> queryParams= new HashMap<>();
hashMap.put("user_id","1");
hashMap.put("user_name","jojo");
2、POST请求:
(1)情形一: http://192.168.0.1/comment
body参数:{"comment_id":"1","content":"我是评论","user_id":"1001"}
@Filed 方式处理
@FormUrlEncoded //使用@Field时记得添加@FormUrlEncoded
@POST("comment")
void doComments(@Field("comment_id")String comment_id, @Field("content")String content, @Field("user_id") String user_id);
@FieldMap 方式处理
@FormUrlEncoded
@POST("comment")
void doComments(@FieldMap Map<String, String> paramsMap );
通过键值对,以表单的形式提交:
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("comment_id","1");
hashMap.put("content","我是评论");
hashMap.put("user_id","1001");
@Body方式处理
@POST("comment")
void doComments(@Body Object reqBean);
@POST("comment")
void doComments(@Body List<Object> requestList);
(2)情形二:Retrofit文件上传: http://192.168.0.1/upload/
/**
* 文件上传
*/
@POST("upload/")
Observable<Object> uploadFile(@Body RequestBody requestBody);
只不过文件上传传入的是RequestBody类型,下面是构建RequestBody的方式:
File file = new File(mFilePath); //mImagePath为上传的文件绝对路径
//构建body
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file))
.build();
3、PUT请求:
(1)情形一:http://192.168.0.1/comment/88
@PUT("comment/{comment_id}")
void comment(@Path("comment_id") String comment_id);
(2)情形二:http://192.168.0.1/comment/88?user_id=1001
@PUT("comment/{comment_id}")
void comment(@Path("comment_id") String comment_id @Query("user_id") String user_id);
(3)情形三:http://192.168.0.1/comment/88?user_id=1001
加body参数:{"content":"我是评论","type":"1"}
此类请求的应用场景:适合于body中需要传入多个请求参数,这样可以将多个请求的参数字段封装到一个实体中,这样就不用写多个@Filed了。
public class RequestBean {
public String content;
public String type;
//实际中可能还有多个请求字段
}
RequestBean requestBean = new RequestBean();
requestBean .content = "我是评论";
requestBean .type = "1";
@PUT("comment/{comment_id}")
void comment(@Path("comment_id") String comment_id @Query("user_id") String user_id @Body RequestBean reqBean);
4、DELETE请求:
假如删除评论:http://192.168.0.1/comment/88
@DELETE("comment/{comment_id}")
void comment(@Path("comment_id") String comment_id);
其他可能的delete请求,配置方式都是类似的,这里就不多举例了。主要是要好好理解下面这些常用的请求参数注解的作用和用法。
综上所述,可以归纳出上面几个注解的用法:
@Path : 请求的参数值直接跟在URL后面时,用@Path配置
@Query: 表示查询参数,以?key1=value1&key2=value2的形式跟在请求域名后面时使用@Query
@QueryMap :以map的方式直接传入多个键值对的查询参数
@Field: 多用于post请求中表单字段,每个@Field后面,对应一对键值对。
@FieldMap :以map的方式传入多个键值对,作为body参数
@Body: 相当于多个@Field,以对象的形式提交
注意:Filed和FieldMap需要FormUrlEncoded结合使用,否则会抛异常!
更多配置URL请求路径的注解的了解可以参考:
Retrofit网络请求参数注解
Retrofit常用注解解释
最后,附上我的一个Kotlin编写+组件化开发的开源项目Designer
Kotlin+组件化开发实践—开源项目Designer-App
Designer项目算是倾注了我蛮多心血了,每个页面和功能都当成是上线的App来做,App的logo还特地做了UI设计😃力求做到精致和完善,其中还包括了很多自己项目开发中的经验汇总和对新技术的探索和整合,希望对各位读者有所帮助,欢迎点个star,follow,或者给个小心心,嘻嘻😝也可以分享给你更多的朋友一起学习,您的支持是我不断前进的动力。如果有任何问题,欢迎在GitHub上给我提issue或者留言。