Rest 概要

el/2024/4/13 15:13:54

REST = RESTful = Representational State Transfer。是在因特网上提供计算机系统之间的互操作性的一种方式。基于Http协议的资源传递,包括JSON、XML和文本等。

统一接口

  • 资源识别(Identification of resources)

    • URI(Uniform Resource Identifier )
  • 资源操作(Manipulation of resources through representations)

    • HTTP verbs:GET、PUT、POST、DELETE
  • 自描述消息(Self-descriptive messages)

    • Content-Type
    • MIME-Type
    • Media Type: application/javascript、 text/html
  • 超媒体(HATEOAS)

    • Hypermedia As The Engine Of Application State

REST 服务端实践

1、Spring Boot REST:

  • 定义相关

    • @Controller
    • @RestController
  • 映射相关

    • @RequestMapping
    • @PathVariable:获取路径参数
  • 请求相关

    • @RequestParam
    • @RequestHeader
    • @CookieValue
    • RequestEntity:包括请求头和请求体等信息配置
  • 响应相关

    • @ResponseBody
    • ResponseEntity:包括返回头和返回体等信息配置

@RequestMapping 为例讲解,源码如下,其他的源码亦可如此分析:

package org.springframework.web.bind.annotation;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;@Target({ElementType.METHOD, ElementType.TYPE})     //注解作用范围 类或方法
@Retention(RetentionPolicy.RUNTIME)                 //作用范围,一般自定义注解使用 RetentionPolicy.RUNTIME
@Documented                                         //生成文档
@Mapping                                            //继承@Mapping注解
public @interface RequestMapping {String name() default "";@AliasFor("path")    //和path等效String[] value() default {};  @AliasFor("value")   //和value等效String[] path() default {};RequestMethod[] method() default {}; //可取值 RequestMethod.GET等String[] params() default {};    //参数名称String[] headers() default {};   //头信息String[] consumes() default {};  //客户端请求的数据要求,一般使用MediaType.APPLICATION_JSON_VALUE等String[] produces() default {};  //服务器返回的数据规定,一般使用MediaType.APPLICATION_JSON_VALUE等
}

举例:
导入依赖:

        <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId></dependency>

返回 XML 格式的数据:

@RestController
public class RestTestController {@RequestMapping(method = RequestMethod.GET,value = "/test",produces = MediaType.APPLICATION_XML_VALUE)public User getUserData() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
}

返回 json 格式的数据:

@RestController
public class RestTestController {@RequestMapping(method = RequestMethod.GET,value = "/test",produces = MediaType.APPLICATION_JSON_VALUE)public User getUserData() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
}

2、Swagger、Spring RestDocs等,这里就不拓展了。

REST 客户端实践

1、Apache HttpClient
导入依赖:

        <!--httpclient--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>

HttpClient工具类代码:


import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;/***@描述: http工具*/
public class HttpClientUtil {public static String doGet(String url, Map<String, String> param) {// 创建Httpclient对象CloseableHttpClient httpclient = HttpClients.createDefault();String resultString = "";CloseableHttpResponse response = null;try {// 创建uriURIBuilder builder = new URIBuilder(url);if (param != null) {for (String key : param.keySet()) {builder.addParameter(key, param.get(key));}}URI uri = builder.build();// 创建http GET请求HttpGet httpGet = new HttpGet(uri);// 执行请求response = httpclient.execute(httpGet);// 判断返回状态是否为200if (response.getStatusLine().getStatusCode() == 200) {resultString = EntityUtils.toString(response.getEntity(), "UTF-8");}} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}httpclient.close();} catch (IOException e) {e.printStackTrace();}}return resultString;}public static String doGet(String url) {return doGet(url, null);}public static String doPost(String url, Map<String, String> param) {// 创建Httpclient对象CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpResponse response = null;String resultString = "";try {// 创建Http Post请求HttpPost httpPost = new HttpPost(url);// 创建参数列表if (param != null) {List<NameValuePair> paramList = new ArrayList<>();for (String key : param.keySet()) {paramList.add(new BasicNameValuePair(key, param.get(key)));}// 模拟表单UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);httpPost.setEntity(entity);}// 执行http请求response = httpClient.execute(httpPost);resultString = EntityUtils.toString(response.getEntity(), "utf-8");} catch (Exception e) {e.printStackTrace();} finally {try {response.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return resultString;}public static String doPost(String url) {return doPost(url, null);}public static String doPostJson(String url, String json) {// 创建Httpclient对象CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpResponse response = null;String resultString = "";try {// 创建Http Post请求HttpPost httpPost = new HttpPost(url);// 创建请求内容StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);httpPost.setEntity(entity);// 执行http请求response = httpClient.execute(httpPost);resultString = EntityUtils.toString(response.getEntity(), "utf-8");} catch (Exception e) {e.printStackTrace();} finally {try {response.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return resultString;}
}

2、Spring RestTemplate ,这里就不扩展来了,感兴趣的可以自己去了解下,再微服务当中也常用的技术。


http://www.ngui.cc/el/4466040.html

相关文章

构建一个REST风格的Web服务

你需要什么 大约15分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2 你会建立什么 您将在以下地址构建一个将接受HTTP GET请求的服务&#xff1a; http://localhost:8080/greeting 会返回一个JSON 格式的数据&#xff1a; {"id":1,"content"…

调度任务Scheduling Tasks

你需要什么 大约15分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2 你会建立什么 您将构建一个应用程序&#xff0c;该应用程序使用Spring的 Scheduled 注解&#xff0c;每5秒打印一次当前时间。 构建步骤 1、添加maven依赖 <dependency><groupId>…

消费RESTful Web服务

你需要什么 大约15分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2 你会建立什么 您将构建一个使用Spring RestTemplate的应用程序来获取 http://gturnquist-quoters.cfapps.io/api/random 中的随机Spring Boot数据。 构建步骤 1、添加maven依赖&#xff1a; &l…

上传文件Uploading Files

你需要什么 大约15分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2 你会建立什么 您将创建一个接受文件上传的Spring Boot Web应用程序。您还将构建一个简单的HTML界面来上传测试文件。 构建步骤 1、添加maven依赖。 <dependency><groupId>org.spri…

Redis安装和常见问题解决

安装 redis 安装指令&#xff1a; yum install epel-release --下载fedora的epel仓库 yum install redis -- 安装redis数据库开启和关闭服务 redis 其他常用指令&#xff1a; redis-server /etc/redis.conf --开启redis服务 redis-cli -- 进入redis服…

使用Redis进行消息传递

你需要什么 大约 15 15 分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2Redis server 你会建立什么 您将构建一个使用StringRedisTemplate发布字符串消息的应用程序&#xff0c;并使用MessageListenerAdapter为其提供POJO订阅。 使用Spring Data Redis作为发布消…

thymeleaf 怎么降低对html的解析标准

正常情况下&#xff0c;如果不做任何配置的话&#xff0c;thymeleaf会以严格的html标准来要求html文件的标签以及js代码遵守规范。但是我们知道html代码是一种不是那么严格的语言&#xff0c;导致很多码农编码时并不是那么严格按照规范&#xff0c;比如<meta>、<link&…

利用 redis 实现延迟消息队列

有一些应用场景&#xff0c;比如下完订单后&#xff0c;20分钟没有付款&#xff0c;可以取消订单。这里会用到延迟消息队列。由于不想维护各种 MQ&#xff0c;如果你的项目里面用了 redis 的话&#xff0c;可以选择利用 redis 的特性来实现延迟消息队列。 设计原理&#xff1a;…

redis 常用命令行指令汇总

Redis 配置 Redis 配置放在文件名为 redis.conf 的文件中。 1、获取配置信息 语法&#xff1a; CONFIG GET CONFIG_SETTING_NAME 样例&#xff1a; 192.168.56.101:0>CONFIG GET port 1) port 2) 6379 2、 编辑配置 语法&#xff1a; CONFIG SET CONFIG_SETTING_NA…

用RabbitMQ发送消息

你需要什么 大约 15 15 分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2RabbitMQ服务器 你会建立什么 您将构建一个使用Spring AMQP的RabbitTemplate发布消息并使用MessageListenerAdapter在POJO上订阅消息的应用程序。 构建步骤 1、安装 RabbitMQ。 2、添加 …