前言

最近在开发一些http server类型程序,通过spring boot构建一些web程序,这些web程序之间通过http进行数据访问、共享,如下图,
假设现在client发起一次保存数据的请求到server,server可能会返回如下类似的数据
{
"status":1,
"message":"xxxxxx"
}
然后client通过解析json获得status来判断当前的请求操作是否成功,开发过程中通过都是这么做的,但是这样在restful设计中不怎么好,其实这个status字段的表达完全可以通过http status来表示,类似404、500、502这种都有明确的定义并且相互理解、沟通起来也方便。
文章主要记录一下我是如何在spring boot中实现自定反馈状态码的,以及我找到的三种实现方式。
第一种,使用**@ResponseStatus** 。这是一个注解,可以作用在方法和类上面,如下使用,
在方法上使用方式,
@RequestMapping(value = "/user", method = RequestMethod.GET)
@ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR,reason="server error")
public String getUser(){
return "im zhangsan";
}
启动web程序,通过postman访问http://127.0.0.1:8100/user,会出现下面结果,
{
"timestamp": 1497850427325,
"status": 500,
"error": "Internal Server Error",
"message": "server error",
"path": "/user"
}
这里我一开始觉得很奇怪,为什么我的getUser方法中没有错误,结果还是出现了500错误?原因就是@ResponseStatus注解的问题,我后面猜测它会强制的将映射转化成500的状态码。这种应用场景我想不太明白在什么地方会用到。
在类中使用方式,
@ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR,reason="111")
public class ServerException extends Exception {
}
这种使用方式就是将自定义异常和状态码结合在一起,合理使用自定义异常机制可以最大化的提高程序的健壮性,下面看如何使用,
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String getUser(@RequestParam String userName) throws ServerException{
if(StringUtils.isEmpty(userName)){
throw new ServerException();
}
return "im zhangsan";
}
这段代码的意思是当userName字段为null的时候会抛出ServerException异常,但是ServerException类被标记了@ResponseStatus注解,因此会直接报500错误,如果觉得500不适合还可以定义其它的错误代码。
这种方式看着已经很好了,可以按照逻辑自定义反馈码,程序够健壮。这种方式也有不好地方,如果反馈码太多需要定义太多的异常类,并且错误内容reason还是不能手动定义。
到这里,我基本上放弃了@ResponseStatus的使用了。
第二种,使用HttpServletResponse,HttpServletResponse是javax.servlet下的一个接口,如下使用,
@RequestMapping(value = "/user", method = RequestMethod.GET)
public void getUser(HttpServletResponse response) throws IOException{
response.setStatus(500);
response.getWriter().append("server error");
}
这种方式可以很好的实现同时满足自定义反馈码+消息内容,一般的实现方式也都是这样。但是这样也不是太好,
response.setContentType("application/json");和response.setCharacterEncoding("UTF-8"); ,这样做有些多余,重复的工作太多,虽然可以进行封装。@ResponseBody出现冲突,其次就是不能利用@ResponseBody自动封装json的特性,在spring mvc框架中如果在方法上加上@ResponseBody是可以对返回值自动进行json封装的。再找找其他的,如果没有找到,估计也只能接受这个不完美的东西了。
后来在翻阅spring boot文档的时候找到了ResponseEntity这么一个东西,这就是我要说的第三种方式。
第三种,使用ResponseEntity
不多说,直接上代码,
@RequestMapping(value = "/user", method = RequestMethod.GET)
public ResponseEntity<Map<String,Object>> getUser() throws IOException{
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "zhangsan");
return new ResponseEntity<Map<String,Object>>(map,HttpStatus.OK);
}
通过postman查看返回结果,如下,
{
"name": "zhangsan"
}
可以直接将map对象帮我转化成json对象,并且可以获得自定义状态码,很好,很强大。
这种方式很和我意,
相比于前面两种,这种方式很对我胃口。
仔细看了ResponseEntity的说明,发现spring mvc其它很多地方也都有使用,如下,下面内容摘自org.springframework.http.ResponseEntity文件注释,
In RestTemplate, this class is returned by getForEntity() and exchange() :
ResponseEntity<String> entity = template.getForEntity("http://example.com", String.class);
String body = entity.getBody();
MediaType contentType = entity.getHeaders().getContentType();
HttpStatus statusCode = entity.getStatusCode();
Can also be used in Spring MVC, as the return value from a @Controller method:
@RequestMapping("/handle")
public ResponseEntity<String> handle() {
URI location = ...;
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setLocation(location);
responseHeaders.set("MyResponseHeader", "MyValue");
return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}
这就是上面说过的。
Or, by using a builder accessible via static methods:
@RequestMapping("/handle")
public ResponseEntity<String> handle() {
URI location = ...;
return ResponseEntity.created(location).header("MyResponseHeader", "MyValue").body("Hello World");
}
自定义http反馈码在设计优良的restful api中起到关键作用,http反馈码是业内统一、共识的,建议在尽量不要通过解析json来获得status判断操作结果。
总结
以上就是这篇文章的全部内容了,希望本文的内容对给各位iOS开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# spring
# boot
# 自定义
# springboot
# 状态码
# 状态机
# SpringMVC 异常处理机制与自定义异常处理方式
# 如何基于SpringMVC实现断点续传(HTTP)
# SpringMVC如何自定义响应的HTTP状态码
# 很好
# 太多
# 看着
# 都有
# 转化成
# 还可以
# 帮我
# 返回值
# 第三种
# 都是
# 我是
# 我想
# 就会
# 也有
# 看了
# 不太
# 不需要
# 是这样
# 和我
相关文章:
如何彻底删除建站之星生成的Banner?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
临沂网站制作企业,临沂第三中学官方网站?
建站与域名管理如何高效结合?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
如何快速使用云服务器搭建个人网站?
官网网站制作腾讯审核要多久,联想路由器newifi官网
建站之星在线客服如何快速接入解答?
平台云上自助建站如何快速打造专业网站?
如何用花生壳三步快速搭建专属网站?
活动邀请函制作网站有哪些,活动邀请函文案?
宿州网站制作公司兴策,安徽省低保查询网站?
如何在局域网内绑定自建网站域名?
Swift开发中switch语句值绑定模式
,如何利用word制作宣传手册?
为什么Go需要go mod文件_Go go mod文件作用说明
公司网站的制作公司,企业网站制作基本流程有哪些?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
青岛网站建设如何选择本地服务器?
如何通过虚拟主机空间快速建站?
如何基于PHP生成高效IDC网络公司建站源码?
如何零基础在云服务器搭建WordPress站点?
,巨量百应是干嘛的?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
如何在阿里云ECS服务器部署织梦CMS网站?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
实例解析angularjs的filter过滤器
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
建站之星多图banner生成与模板自定义指南
英语简历制作免费网站推荐,如何将简历翻译成英文?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
移民网站制作流程,怎么看加拿大移民官网?
电商网站制作公司有哪些,1688网是什么意思?
制作网站的模板软件,网站怎么建设?
ppt制作免费网站有哪些,ppt模板免费下载网站?
广州商城建站系统开发成本与周期如何控制?
如何选择建站程序?包含哪些必备功能与类型?
韩国服务器如何优化跨境访问实现高效连接?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
定制建站如何定义?其核心优势是什么?
,网站推广常用方法?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
*请认真填写需求信息,我们会在24小时内与您取得联系。