本指南将引导您完成使用Spring创建“hello world”RESTful Web服务的过程,该服务在响应中包含用于跨源资源共享(CORS)的头文件。

因安全考虑,浏览器会禁止跨域请求。跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。Spring本身也提供了跨域资源请求的解决方案。

我利用业余时间,翻译了Spring官网的例子,方便中文不好的同学,将陆续发到头条上,欢迎大家关注,也可以上我个人BLOG:itmanclub.com,上面有已经翻译过的。

您将构建一个接受HTTP GET请求的服务:

http://localhost:8080/greeting

并以JSON表示的问候语进行响应:

{"id":1,"content":"Hello, World!"}

您可以自定义参数来请求:

http://localhost:8080/greeting?name=User

name参数值覆盖默认值“world”,并反映在响应中:

{"id":1,"content":"Hello, User!"}

此服务与之前构建RESTfulWeb服务中描述的略有不同,因为它将使用Spring框架的CORS支持来添加相关的CORS响应头。

程序结构

└── src └── main └── java └── hello

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework gs-rest-service-cors 0.1.0org.springframework.boot spring-boot-starter-parent 2.1.6.RELEASEorg.springframework.boot spring-boot-starter-web 1.8org.springframework.boot spring-boot-maven-plugin 

Spring Boot将会你做如下的事:

  • 将 classpath 里面所有用到的jar包构建成一个可执行的 JAR 文件,方便执行你的程序
  • 搜索public static void main()方法并且将它当作可执行类
  • 根据springboot版本,去查找相应的依赖类版本,当然你可以定义其它版本。

创建资源表示类

既然已经设置了项目和构建系统,就可以创建Web服务了。从考虑服务交互开始这个过程。

服务将处理get请求/greeting,也可以在查询字符串中使用name参数。GET请求应该返回一个200 OK的响应,其中主体中的JSON表示一个greeting。它应该是这样的:

{ "id": 1, "content": "Hello, World!"}

id字段是greeting的唯一标识符,content是greeting的文本表示形式。

要为greeting表示建模,请创建一个资源表示类。为id和content数据提供一个具有字段、构造函数和访问器的普通Java对象:

src/main/java/hello/Greeting.java

package hello;public class Greeting { private final long id; private final String content; public Greeting() { this.id = -1; this.content = ""; } public Greeting(long id, String content) { this.id = id; this.content = content; } public long getId() { return id; } public String getContent() { return content; }}

正如您在下面的步骤中看到的,Spring使用Jackson JSON库自动将Greeting的实例封装成JSON。

接下来,您将创建资源控制器,它将为这些greetings提供服务。

创建控制器

在Spring构建RESTfulWeb服务的方法中,HTTP请求由控制器处理。@Controller注释用来代表控制器,下面的GreetingController通过返回greeting类的新实例来处理获取请求/greeting :

src/main/java/hello/GreetingController.java

package hello;import java.util.concurrent.atomic.AtomicLong;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class GreetingController { private static final String template = "Hello, %s!"; private final AtomicLong counter = new AtomicLong(); @GetMapping("/greeting") public Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) { System.out.println("==== in greeting ===="); return new Greeting(counter.incrementAndGet(), String.format(template, name)); }}

这个控制器简洁明了,但在里面有很多东西。让我们一步一步地把它分解。

@RequestMapping注释确保到/greeting的HTTP请求映射到 greeting()方法。

上面的示例使用@GetMapping注释作为@RequestMapping(method = RequestMethod.GET)的快捷方式。

@RequestParam将查询字符串参数name的值绑定到greeting()方法的name参数中。此查询字符串参数不是必须的,如果请求中没有此参数,则使用默认值“world”。

id用counter.incrementAndGet()来自动生成的。

传统的MVC控制器和上面的RESTful Web服务控制器之间的一个关键区别是HTTP响应主体的创建方式。这个RESTful Web服务控制器不呈现为HTML视图,而是简单地填充并返回一个Greeting对象。对象数据将作为JSON直接写入HTTP响应。

为了实现这一点,greeting()方法上的@ResponseBody注释告诉Spring MVC它不需要通过服务器端视图层呈现greeting对象,而是直接返回的greeting对象。

Greeting 对象必须转换为JSON。由于Spring的HTTP消息转换器支持,您不需要手动执行此转换。因为Jackson在类路径上,所以Spring的MappingJackson2HttpMessageConverter 会自动选择将Greeting实例转换为json。

启用CORS

控制器方法的CORS配置

为了让RESTful Web服务在其响应中包含CORS访问控制头,您只需向处理程序方法添加一个 @CrossOriginn注释:

src/main/java/hello/GreetingController.java

 @CrossOrigin(origins = "http://localhost:9000") @GetMapping("/greeting") public Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) { System.out.println("==== in greeting ===="); return new Greeting(counter.incrementAndGet(), String.format(template, name)); }

此@CrossOrigin注释仅为此特定方法启用跨源请求。默认情况下,它允许使用@RequestMapping 注释中指定的所有源、所有headers、HTTP方法以及30分钟的超时。您可以通过指定注释属性之一的值来自定义此行为:origins、methods、allowedHeaders、exposedHeaders、allowCredentials或maxAge。在本例中,我们只允许http://localhost:9000发送跨源请求。

也可以在控制器类级别添加此注释,以便对此类的所有处理程序方法启用CORS。

全局CORS配置

您还可以定义一些全局CORS配置。这类似于使用基于过滤器的解决方案,但可以在SpringMVC中声明,并与细粒度@CrossOrigin配置结合使用。默认情况下,所有的origins和get、head和post方法都是允许的。

src/main/java/hello/GreetingController.java

 @GetMapping("/greeting-javaconfig") public Greeting greetingWithJavaconfig(@RequestParam(required=false, defaultValue="World") String name) { System.out.println("==== in greeting ===="); return new Greeting(counter.incrementAndGet(), String.format(template, name)); }

src/main/java/hello/Application.java

 public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000"); } }; }

您可以轻松地更改任何属性(例如示例中的allowedOrigins),并且只将这个CORS配置应用于特定的路径模式。全局和控制器级CORS配置也可以混用。

创建Application

src/main/java/hello/Application.java

package hello;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.web.servlet.config.annotation.CorsRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}

运行并测试程序

运行Application.java,然后在浏览器中访问: http://localhost:8080/greeting 返回如下:

{"id":1,"content":"Hello, World!"}

在 给一个name参数,访问http://localhost:8080/greeting?name=User,返回

{"id":2,"content":"Hello, User!"}

此更改表明GreetingController中的@RequestParam安排按预期工作。name参数已被赋予默认值“world”,但始终可以通过查询字符串显式重写。

请注意,id自动变化了,这是使用了counter.incrementAndGet()的原因

现在,要测试CORS头文件是否丰存在,并允许来自其他来源的JavaScript客户端访问该服务,您需要创建一个JavaScript客户端来使用该服务。

首先,创建一个名为hello.js的简单javascript文件,其内容如下:

public/hello.js

$(document).ready(function() { $.ajax({ url: "http://localhost:8080/greeting" }).then(function(data, status, jqxhr) { $('.greeting-id').append(data.id); $('.greeting-content').append(data.content); console.log(jqxhr); });});

此脚本使用jquery来调用http://localhost:8080/greeting上的rest服务。它由index.html加载,如下所示:

public/index.html

  Hello CORS

The ID is

The content is

这基本上是在使用jquery调用用RESTful Web服务时创建的REST客户端,稍作修改以使用本地主机端口8080上运行的服务。

因为REST服务已经在本地主机端口8080上运行,所以您需要确保从另一个服务器和/或端口启动客户机。这不仅可以避免两个应用程序之间的冲突,还可以确保客户机代码的来源与服务的来源不同。要启动在本地主机上运行的客户端,端口9000:

mvn spring-boot:run -Dserver.port=9000

一旦客户端启动,在浏览器中打开http://localhost:9000,您将看到:

如果服务响应包含CORS头,那么id和content将呈现到页面中。但是,如果缺少CORS头(或者没有为客户端定义足够的CORS头),那么浏览器将使请求失败,并且不会将值呈现到DOM中:

祝贺你!您刚刚开发了一个RESTful Web服务,包括与Spring的跨源站资源共享。

java http服务_springboot官方例子中文翻译--RESTful服务启用CORS支持相关推荐

  1. libmodbus官方手册中文翻译

    最近做libmodbus相关内容,因为中文没有libmodbus各个函数的详细解释,所以在此把要用的libmodbus的官方手册包括所有的函数都翻译整理一下,给自己和大家们学习,欢迎大家交流指正.手册 ...

  2. CMake官方教程中文翻译

    看见一博主翻译的一篇官方cmke教程,觉得很不错就转载并稍作一些细小修改,我提供的3.16版本的文档是最新的,博主之前翻译的是3.7的,内容比3.16少一点点,想看3.16完整内容,下面也有链接. 提 ...

  3. 微服务实践 | 焱融云前端微服务架构的设计要点

    什么是微服务 微服务是一种开发软件的架构和组织方法,其中软件由通过明确定义的 API 进行通信的小型独立服务组成,这些服务由各个小型独立团队负责,每个服务可被独立部署,服务之间是松耦合的,每个服务仅关 ...

  4. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

  5. ElasticSearch Java High level Rest Client 官方文档中文翻译(一)

    ElasticSearch Java High level Rest Client 官方文档中文翻译 一 纯粹记录自己在看官网的es rest high level api 时的翻译笔记,可以对照着官 ...

  6. Java中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

    做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云 ...

  7. 撒花!中文翻译仓库链接已加入 ML.NET 官方示例网站首页

    从2018年12月02日决定开始做ML.NET 示例中文版https://github.com/feiyun0112/machinelearning-samples.zh-cn,然后以每天一篇的速度进 ...

  8. java restful中文乱码_使用RestTemplate访问RESTful服务乱码处理

    在接口服务开发中,我们经常用到Spring模板类RestTemplate访问restful服务.但RestTemplate处理中文乱码问题比较麻烦.以我们项目Spring版本4.1.3.RELEASE ...

  9. C# SolidWorks 二次开发 API --- 2018版 中文翻译 之官方示例

    这是2018版 自带帮助文件的API例子中文导航,如果有错误的,请指出来 时间原因,我没有一一测试,只是大概过滤了一下. 共计750个例 子: 中文标题 Web Link 将绘图表缩放到窗口中的最大尺 ...

最新文章

  1. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
  2. 没有数据的MySql导出架构
  3. BZOJ1485: [HNOI2009]有趣的数列
  4. Redis(零):背景
  5. 关于ActiveMQ序列化对象爆“Forbidden class xxx! ...”问题的解决
  6. 近期计算机视觉相关算法竞赛汇总—总奖池超553万人民币
  7. Oracle的tnsnames.ora配置(PLSQL Developer)
  8. MOS9.0 bootstrap 离线Bulid
  9. 农业知识图谱(KG):农业领域的信息检索,命名实体识别,关系抽取,分类树构建,数据挖掘...
  10. centos7中firewall防火墙命令详解
  11. 分布式存储系统学习笔记(二)—分布式文件系统(2)—淘宝文件系统(TFS)
  12. javascript的constructor属性介绍
  13. 计算机专业基础 -- 网络相关AJAX基础知识
  14. 通配符 [概述][Java]
  15. 微信平台分账产品怎么选?
  16. JavaScript XHR使用 JSONPlaceholder API 并本地搭建JSON server REST API
  17. 项目经理常用软件大全
  18. 使用python监控NTP系统(时钟服务器)
  19. spring全集 - - - 第五章RESTful开发
  20. 分布式 b2b b2c o2o电子商务 云平台

热门文章

  1. PHP 运行 php-fpm 报错
  2. python自动化开发-[第十四天]-javascript(续)
  3. stm32中的延时函数
  4. 2010年过年左右时的艾米果
  5. 敏捷练习 讨论 谁是你生命中的贵人
  6. Ubuntu用户连续N次输入错误密码进行登陆时自动锁定X分钟
  7. centos 7安装zabbix 3.0
  8. linux常见的查看命令
  9. FTP相关命令(手机FTP服务启动应用)
  10. 使用ftp命令之后,如何退出