不管是单体应用还是微服务应用, 现在都流行Restful风格,  下图是一个比较典型的使用rest的应用架构, 该应用不仅使用database数据源, 而且用到了一个Weather微服务, 另一方面, 该应用也是通过rest方式为web UI 或其他微服务应用提供服务.

=============================
通过Postman 插件测试Rest接口
=============================

之前使用postman 插件调试rest接口总报 415 Unsupported Media Type错误, 原因是: HEADERS中必须设置Content-type为application/json, 后台才能顺利接收到参数. 见下图截图. 
{
"timestamp": "2018-09-07T06:49:57.620+0000",
"status": 415,
"error": "Unsupported Media Type",
"message": "Content type 'text/plain;charset=UTF-8' not supported",
"path": "/books"
}

=============================
与 Rest 服务交互的几个环节
=============================

一. Spring 后台与其他Rest服务的数据交互
Spring 提供了 RestTemplate 类, 方便和其他Rest服务交互数据

二. 在web response中 返回 json 数据
对于Restful的视图方法, 其返回类型可以是 ResponseEntity<T> 或者 ResponseEntity<List<T>>, Spring会自动将返回值转换为json格式. 如果要输出多个对象的复合体json, 可以在java中定义一个Wrapper类组合多个Pojo类, 然后返回这个Wrapper对象即可.

三. 接收 web Request 中的 json 数据
视图方法的 @RequestBody 注释参数可以是Map类型, 也可以是Pojo类型. 如果是Pojo类型, Spring就自动完成json->object的转换, 如果是map类型, Spring就自动完成kv映射. 如果json数据是多个object的某种组合, 我们可以在java中定义一个Wrapper类组合多个Pojo类, 专门接收 Request 中的json数据.

=============================
示例代码
=============================

Pojo代码:

class Office {
private String address; public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
}
} class Car {
private String brand; public String getBrand() {
return brand;
} public void setBrand(String brand) {
this.brand = brand;
}
} /*
* Boss 类是 Office 和 Office 类的组合
*/
class Boss {
private Car car;
private Office office; public Car getCar() {
return car;
} public void setCar(Car car) {
this.car = car;
} public Office getOffice() {
return office;
} public void setOffice(Office office) {
this.office = office;
}
}

Controller和主函数代码:

@SpringBootApplication
@RestController
public class Demo1Application { // 示例: 一个对象的json response
// 测试url为 http://localhost:8080/oneOffice
// 结果为 {"address":"address1"}
@ResponseBody
@RequestMapping(value = "/oneOffice", method = RequestMethod.GET)
public ResponseEntity<Office> oneOffice() {
Office office = new Office();
office.setAddress("address1");
return new ResponseEntity<Office>(office, HttpStatus.OK);
} // 示例: 一个集合的json response
// 测试url为 http://localhost:8080/offices
// 结果为 [{"address":"address1"},{"address":"address2"}]
@ResponseBody
@RequestMapping(value = "/offices", method = RequestMethod.GET)
public ResponseEntity<List<Office>> offices() {
List<Office> offices = new ArrayList<Office>();
Office office1 = new Office();
office1.setAddress("address1");
Office office2 = new Office();
office2.setAddress("address2");
offices.add(office1);
offices.add(office2);
return new ResponseEntity<List<Office>>(offices, HttpStatus.OK);
} // 示例: 一个简单对象的 Post 示例
// 测试url为 http://localhost:8080/offices
// 提交的data为 { "address": "address1" }
@RequestMapping(value = "/offices", method = RequestMethod.POST, consumes = "application/json")
@ResponseBody
public String createOffice(@RequestBody Office office) {
if (office != null && office.getAddress() != null) {
return "OK";
} else {
return "Empty";
}
} // 示例: 一个组合对象的 response 示例
// 测试url为 http://localhost:8080/oneBoss
// 结果为 {"car":null,"office":{"address":"address1"}}
@RequestMapping(value = "/oneBoss", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Boss> oneBoss() {
Office office = new Office();
office.setAddress("address1");
Boss objectWrapper = new Boss();
objectWrapper.setOffice(office);
return new ResponseEntity<Boss>(objectWrapper, HttpStatus.OK);
} // 示例: 一个组合对象的 Post 示例
// 测试url为 http://localhost:8080/bosses
// 提交的data为 {"car":null,"office":{"address":"address1"}}
@RequestMapping(value = "/bosses", method = RequestMethod.POST, consumes = "application/json")
@ResponseBody
public String createBoss(@RequestBody Boss boss) {
if (boss != null && boss.getOffice() != null
&& boss.getOffice().getAddress() != null) {
return "OK";
} else {
return "Empty";
}
} public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}

=========================
参考
=========================
https://www.leveluplunch.com/java/tutorials/014-post-json-to-spring-rest-webservice/
https://javabeat.net/rest-api-best-practices/
https://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration
截图来自: https://github.com/hamvocke/testing-microservices-ebook/blob/master/testing-microservices.adoc

SpringBoot系列: 与Spring Rest服务交互数据的更多相关文章

  1. SpringBoot系列之Spring Data Jpa集成教程

    SpringBoot系列之Spring Data Jpa集成教程 Spring Data Jpa是属于Spring Data的一个子项目,Spring data项目是一款集成了很多数据操作的项目,其下 ...

  2. SpringBoot系列之Spring容器添加组件方式

    SpringBoot系列之Spring容器添加组件方式 本博客介绍SpringBoot项目中将组件添加到Spring容器中的方法,SpringBoot项目有一个很明显的优点,就是不需要再编写xml配置 ...

  3. SpringBoot系列:Spring Boot使用模板引擎FreeMarker

    一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...

  4. SpringBoot系列:Spring Boot使用模板引擎Thymeleaf

    一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...

  5. SpringBoot系列:Spring Boot使用模板引擎JSP

    一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...

  6. SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache

    前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...

  7. SpringBoot系列:Spring Boot集成Spring Cache,使用EhCache

    前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...

  8. SpringBoot系列:Spring Boot定时任务Spring Schedule

    Spring Schedule是Spring提供的定时任务框架,相较于Quartz,Schedule更加简单易用,在中小型应用中,对于大部分需求,Schedule都可以胜任. 一.Spring Sch ...

  9. SpringBoot系列:Spring Boot集成定时任务Quartz

    一.关于Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.在java企业级应用中,Q ...

随机推荐

  1. Hdoj 1233.还是畅通工程 题解

    Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直 ...

  2. 【BZOJ3613】[HEOI2014]南园满地堆轻絮(贪心)

    [BZOJ3613][HEOI2014]南园满地堆轻絮(贪心) 题面 BZOJ 洛谷 题解 考虑二分的做法,每次二分一个答案,那么就会让所有的值尽可能的减少,那么\(O(n)\)扫一遍就好了. 考虑如 ...

  3. 【转】让浏览器格式化显示JSON数据之chrome jsonView插件安装

    jsonView 用来让Chrome浏览器能格式化的显示JSON数据. 以上是网上找的方式,且试验成功! 步骤: 1.打开 https://github.com : 2.搜索 jsonView 链接: ...

  4. CDQ分治与整体二分学习笔记

     CDQ分治部分 CDQ分治是用分治的方法解决一系列类似偏序问题的分治方法,一般可以用KD-tree.树套树或权值线段树代替. 三维偏序,是一种类似LIS的东西,但是LIS的关键字只有两个,数组下标和 ...

  5. 对于Spring中注入对象失败的问题

    1.今天进行了一段代码,经过检查发现config配置文件没问题,注入注解也编写正确,但是RedisTemplate就是会抛出空指针异常. 进过一系列检查发现,其在用户使用该类的时候采用的是new方式创 ...

  6. 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Python3 与 C# 基础语法对比:https://www.cnblogs.com/ ...

  7. 全文检索 -- Solr从概念到实战(一)

    全文检索: 将整个文本进行“分词”处理,在索引库中为分词得到的每一个词都建立索引,和用户搜索的关键词进行匹配.实现快速查找效果. 传统sql语句实现的局限性: select song_id,song_ ...

  8. Docker自动补全容器名

    Zsh Place the completion script in your /path/to/zsh/completion (typically ~/.zsh/completion/): 下载自动 ...

  9. [bzoj1563][诗人小g]

    bzoj1563 思路 首先考虑\(n^2\)的暴力dp,用sum[i]表示前i句话的长度总和.f[i]表示前i句话最小的不协调度之和.转移的时候考虑枚举前面的每个点,找到转移的最优秀的那个点. 然后 ...

  10. 第二篇:用Android Studio编写Hello World

    将Android Studio的环境搭建好后,第一个写Hello World测试程序.Android Studio v3.2.1. 一.新建工程 点击Start a new Android Studi ...