无论是开发前端应用还是开发后端应用或者是后台接口,都难免会有遇到网络请求的问题。有时候客户端发送的一个后端死活无法识别,或者是识别了也浪费了大量时间。导致这个问题出现的根本原因不是我们的基础不够牢靠,是我们只能专注于一个领域,导致做前端的无法去了解后台接口,做接口的也无法去知道前端的运行过程,这偏文章不是什么深奥的文章,但是是我们实际开发都会遇到的一个问题。所以我对网络请求的数据前后端对接方式做了一下总结,希望对各位开发者带来一点点帮助。本文是针对Android端使用Retrofit构建请求和服务端Springboot框架做的分析,当然原理都是一样,不是使用这些框架的也可以做做参考,有写的不对的地方欢迎读者指正。现在进入正题:
首先先了解一下Retrofit构造请求的常用的几个标签的用法。
1、Retrofit用@Body标签时不能添加@FormUrlEncoded与@Multipart标签,使用时:
@POST("/api/phone/addPhone")
Observable addPhone(@Body PhoneNumberBean bean);
在请求中传递的数据格式为:{"key":"value","key":"value"}
2、Retrofit用@Field标签时方法上必须添加@FormUrlEncoded标签,使用时:
@FormUrlEncoded
@POST("/api/user/login")
Observable login(@Field("phone")String phone,@Field("password")String password);
传递的数据格式为"key"="value"&"key"="value"
3、Retrofit用@PartMap和@Part标签时方法上必须添加@Multipart标签,使用时:
@Multipart
@POST("/uploadapi/do_upload")
//图片上传
Observable postImg(@PartMap() HashMap partMap);
或者@Part(“key”)RequestBody key,@Part MultipartBody.Part file,此处就不贴代码了。
传递的数据格式为:
图片来源于:https://blog.csdn.net/ssssny/article/details/77086702
目前我了解到的是这三种常用请求参数形式不可混用,每次只能单独使用其中一种。
下面我们再看看Springboot后台如何接收这几种方式的数据。
1、当Retrofit使用@Body标签时,Springboot后台需要使用@RequestBody标签,使用的格式和请求的格式差不多:
@Autowired
private PhoneNumberService phoneNumberService;
@RequestMapping(value = "addPhone",method = RequestMethod.POST)
public BaseResponseBean addPhone(@RequestBody PhoneNumberBean bean){
return phoneNumberService.addPhone(bean);
}
2、当Retrofit使用@Field标签时,Springboot后台需要使用@Param标签,使用时格式和请求的格式差不多:
@Autowired
private UserService userService;
@RequestMapping(value = "register",method = RequestMethod.POST)
public BaseResponseBean register(@Param("phone")String phone,@Param("code")String code,@Param("password")String password){
return userService.register(phone,code,password);
}
3、当Retrofit使用@PartMap或者@Part标签时,Springboot后台需要使用@RequestPart标签,使用时格式和请求的格式差不多:@RequestPart(“key”) byte[] value;由于此处我的项目中没有用到,我就不贴代码了,大家网上去搜索,可以搜到很多方式。