当前位置: 首页 > java >正文

SpringBoot网络请求RestTemplate Util工具类

SpringBoot网络请求RestTemplate Util工具类

  • 1. 配置RestTemplate
  • 2.RestTemplateUtil工具类

1. 配置RestTemplate

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();requestFactory.setConnectTimeout(60000);requestFactory.setReadTimeout(60000);//使用okhttp//RestTemplate restTemplate = new RestTemplate(new OkHttp3ClientHttpRequestFactory());RestTemplate restTemplate = new RestTemplate(requestFactory);return restTemplate;}}

2.RestTemplateUtil工具类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;/*** RestTemplateUtil工具类*/
@Component
public class RestTemplateUtil {@Autowiredprivate RestTemplate restTemplate;/*  private static class SingletonRestTemplate {static final RestTemplate INSTANCE = new RestTemplate();}private RestTemplateUtil() {}public static RestTemplate getInstance() {return SingletonRestTemplate.INSTANCE;}*//*** post 请求** @param url  请求路径* @param data body数据* @return*/public String post(String url, String data) {HttpHeaders headers = new HttpHeaders();headers.add("Accept", "application/json");headers.add("Content-Encoding", "UTF-8");headers.add("Content-Type", "application/json; charset=UTF-8");HttpEntity<String> requestEntity = new HttpEntity<>(data, headers);return restTemplate.postForObject(url, requestEntity, String.class);}/*** get 请求** @param url   请求路径* @param token JWT所需的Token,不需要的可去掉* @return*/public String get(String url, String token) {HttpHeaders headers = new HttpHeaders();headers.add("Accept", "application/json");headers.add("Content-Encoding", "UTF-8");headers.add("Content-Type", "application/json; charset=UTF-8");if (token != null) {headers.add("Authorization", token);}HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);String responseBody = response.getBody();return responseBody;}/*** get 请求** @param url   请求路径* @return*/public  <T> T getWithSession(String url, String sessionId, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.add("session_id", sessionId);return get(url, httpHeaders, responseType, uriVariables).getBody();}// ----------------------------------GET-------------------------------------------------------/*** GET请求调用方式** @param url 请求URL* @param responseType 返回对象类型* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> get(String url, Class<T> responseType) {return restTemplate.getForEntity(url, responseType);}/*** GET请求调用方式** @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> get(String url, Class<T> responseType, Object... uriVariables) {return restTemplate.getForEntity(url, responseType, uriVariables);}/*** GET请求调用方式** @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> get(String url, Class<T> responseType, Map<String, ?> uriVariables) {return restTemplate.getForEntity(url, responseType, uriVariables);}/*** 带请求头的GET请求调用方式** @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return get(url, httpHeaders, responseType, uriVariables);}/*** 带请求头的GET请求调用方式** @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType, Object... uriVariables) {HttpEntity<?> requestEntity = new HttpEntity<>(headers);return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);}/*** 带请求头的GET请求调用方式** @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return get(url, httpHeaders, responseType, uriVariables);}/*** 带请求头的GET请求调用方式** @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<?> requestEntity = new HttpEntity<>(headers);return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);}// ----------------------------------POST-------------------------------------------------------/*** POST请求调用方式** @param url 请求URL* @param responseType 返回对象类型* @return*/public  <T> ResponseEntity<T> post(String url, Class<T> responseType) {return restTemplate.postForEntity(url, HttpEntity.EMPTY, responseType);}/*** POST请求调用方式** @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType) {return restTemplate.postForEntity(url, requestBody, responseType);}/*** POST请求调用方式** @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType, Object... uriVariables) {return restTemplate.postForEntity(url, requestBody, responseType, uriVariables);}/*** POST请求调用方式** @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {return restTemplate.postForEntity(url, requestBody, responseType, uriVariables);}/*** 带请求头的POST请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> post(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return post(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的POST请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> post(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return post(url, requestEntity, responseType, uriVariables);}/*** 带请求头的POST请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> post(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return post(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的POST请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> post(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return post(url, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的POST请求调用方式** @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> post(String url, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) {return restTemplate.exchange(url, HttpMethod.POST, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的POST请求调用方式** @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> post(String url, HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables) {return restTemplate.exchange(url, HttpMethod.POST, requestEntity, responseType, uriVariables);}// ----------------------------------PUT-------------------------------------------------------/*** PUT请求调用方式** @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> put(String url, Class<T> responseType, Object... uriVariables) {return put(url, HttpEntity.EMPTY, responseType, uriVariables);}/*** PUT请求调用方式** @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> put(String url, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);return put(url, requestEntity, responseType, uriVariables);}/*** PUT请求调用方式** @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> put(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);return put(url, requestEntity, responseType, uriVariables);}/*** 带请求头的PUT请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> put(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return put(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的PUT请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return put(url, requestEntity, responseType, uriVariables);}/*** 带请求头的PUT请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> put(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return put(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的PUT请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return put(url, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的PUT请求调用方式** @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> put(String url, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) {return restTemplate.exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的PUT请求调用方式** @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> put(String url, HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables) {return restTemplate.exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);}// ----------------------------------DELETE-------------------------------------------------------/*** DELETE请求调用方式** @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, Class<T> responseType, Object... uriVariables) {return delete(url, HttpEntity.EMPTY, responseType, uriVariables);}/*** DELETE请求调用方式** @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, Class<T> responseType, Map<String, ?> uriVariables) {return delete(url, HttpEntity.EMPTY, responseType, uriVariables);}/*** DELETE请求调用方式** @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);return delete(url, requestEntity, responseType, uriVariables);}/*** DELETE请求调用方式** @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);return delete(url, requestEntity, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式** @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return delete(url, httpHeaders, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式** @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);return delete(url, requestEntity, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式** @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return delete(url, httpHeaders, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式** @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);return delete(url, requestEntity, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return delete(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return delete(url, requestEntity, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return delete(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式** @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return delete(url, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的DELETE请求调用方式** @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) {return restTemplate.exchange(url, HttpMethod.DELETE, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的DELETE请求调用方式** @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> delete(String url, HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables) {return restTemplate.exchange(url, HttpMethod.DELETE, requestEntity, responseType, uriVariables);}// ----------------------------------通用方法-------------------------------------------------------/*** 通用调用方式** @param url 请求URL* @param method 请求方法类型* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) {return restTemplate.exchange(url, method, requestEntity, responseType, uriVariables);}/*** 通用调用方式** @param url 请求URL* @param method 请求方法类型* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public  <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables) {return restTemplate.exchange(url, method, requestEntity, responseType, uriVariables);}}
http://www.xdnf.cn/news/10234.html

相关文章:

  • Kerberos面试内容整理-会话密钥的协商与使用
  • WIN11+eclipse搭建java开发环境
  • 端午安康(Python)
  • C++深入类与对象
  • 电脑重装或者开机出现错误
  • 【harbor】--基础使用
  • 利用aqs构建一个自己的非公平独占锁
  • 【数据集】全球无缝高分辨率1 km 月均地表温度和气温(2001-2020)
  • 小白的进阶之路系列之八----人工智能从初步到精通pytorch综合运用的讲解第一部分
  • 【C++】 类和对象(上)
  • Matlab数据类型
  • 界面形成能的理解
  • Python简易音乐播放器开发教程
  • day61—DFS—省份数量(LeetCode-547)
  • 【计算机网络】 ARP协议和DNS协议
  • 38.springboot使用rabbitmq
  • qwen 2.5 并行计算机制:依靠 PyTorch 和 Transformers 库的分布式能力
  • GB 36246-2018 中小学合成材料面层运动场地检测
  • 【七. Java字符串操作与StringBuilder高效拼接技巧】
  • 新闻数据加载(鸿蒙App开发实战)
  • 飞致云开源社区月度动态报告(2025年5月)
  • uniapp 键盘顶起页面问题
  • G25-05-31Rust开源项目日报 Top10
  • C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件
  • Ubuntu搭建DNS服务器
  • python:PyMOL 能处理 *.pdb 文件吗?
  • 俄军操作系统 Astra Linux 安装教程
  • 机器学习:欠拟合、过拟合、正则化
  • Android15 userdebug版本不能remount
  • reverse_ssh 建立反向 SSH 连接指南 混淆AV [好东西哟]