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

基因网站开发电子工程师证怎么考

基因网站开发,电子工程师证怎么考,wordpress文章中加入代码,小学生制作ppt的软件在项目中#xff0c;当我们需要远程调用一个 HTTP 接口时#xff0c;我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工具类。Spring 官网对它的介绍如下#xff1a; RestTemplate: The original Spring REST client with a synchronous, template met…在项目中当我们需要远程调用一个 HTTP 接口时我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工具类。Spring 官网对它的介绍如下 RestTemplate: The original Spring REST client with a synchronous, template method API. 从上面的介绍中我们可以知道RestTemplate 是一个同步的 Rest API 客户端。下面我们就来介绍下 RestTemplate 的常用功能。 RestTemplate 简单使用# RestTemplate 提供高度封装的接口可以让我们非常方便地进行 Rest API 调用。常见的方法如下 表格RestTemplate 的方法 上面的方法我们大致可以分为三组 getForObject --- optionsForAllow 分为一组这类方法是常规的 Rest APIGET、POST、DELETE 等方法调用exchange接收一个 RequestEntity 参数可以自己设置 HTTP methodURLheaders 和 body返回 ResponseEntityexecute通过 callback 接口可以对请求和返回做更加全面的自定义控制。 一般情况下我们使用第一组和第二组方法就够了。 创建 RestTemplate# Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) {RestTemplate restTemplate new RestTemplate(factory);return restTemplate; }Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() {SimpleClientHttpRequestFactory factory new SimpleClientHttpRequestFactory();factory.setReadTimeout(5000);factory.setConnectTimeout(15000);// 设置代理//factory.setProxy(null);return factory; }创建 RestTemplate 时需要一个 ClientHttpRequestFactory通过这个请求工厂我们可以统一设置请求的超时时间设置代理以及一些其他细节。通过上面代码配置后我们直接在代码中注入 RestTemplate 就可以使用了。 有时候我们还需要通过 ClientHttpRequestFactory 配置最大链接数忽略SSL证书等大家需要的时候可以自己查看代码设置。 接口调用# 1. 普通接口调用 MapString, String vars Collections.singletonMap(hotel, 42); // 通过 GET 方式调用返回一个 String 值还可以给 URL 变量设置值也可通过 uriTemplateHandler 这个属性自定义 String result restTemplate.getForObject(https://example.com/hotels/{hotel}/rooms/{hotel}, String.class, vars);String url http://127.0.0.1:8080/hello; JSONObject param new JSONObject(); //restTemplate 会根据 params 的具体类型调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中并在请求头中添加合适的 content-type // 也会根据 responseType 的类型本列子中是 JSONObject设置 head 中的 accept 字段当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 ResponseEntityJSONObject responseEntityrestTemplate.postForEntity(url,params,JSONObject.class); int statusCodeValue responseEntity.getStatusCodeValue(); HttpHeaders headers responseEntity.getHeaders(); JSONObject body responseEntity.getBody();2. 添加 Header 和 Cookie 有时候我们需要在请求中的 Head 中添加值或者将某些值通过 cookie 传给服务端那么上面这种调用形式就不太满足要求了。 UriComponents uriComponents UriComponentsBuilder.fromHttpUrl(127.0.0.1:8080).path(/test).build(true);URI uri uriComponents.toUri();RequestEntityJSONObject requestEntity RequestEntity.post(uri).// 添加 cookie(这边有个问题假如我们要设置 cookie 的生命周期作用域等参数我们要怎么操作)header(HttpHeaders.COOKIE,key1value1).// 添加 headerheader((MyRequestHeader, MyValue)accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON).body(requestParam); ResponseEntityJSONObject responseEntity restTemplate.exchange(requestEntity,JSONObject.class); // 响应结果 JSONObject responseEntityBody responseEntity.getBody();3. 文件上传 上面两个列子基本能覆盖我们平时开发的大多数功能了。这边再讲个文件上传的列子RestTemplate 功能还是蛮全的。 public Object uplaod(RequestBody JSONObject params) throws Exception{final String url http://localhost:8888/hello/m3;// 设置请求头HttpHeaders headers new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);// 设置请求体注意是 LinkedMultiValueMapFileSystemResource resource1 new FileSystemResource(D:\\dir1\\ss\\pic1.jpg);FileSystemResource resource2 new FileSystemResource(D:\\dir1\\ss\\pic2.jpg);MultiValueMapString, Object form new LinkedMultiValueMap();form.add(file, resource1);form.add(file, resource2);form.add(param1,value1);HttpEntityMultiValueMapString, Object files new HttpEntity(form, headers);JSONObject s restTemplate.postForObject(url, files, JSONObject.class);return s;}上面的代码中上传了两个本地图片通过下面代码可以顺利接收。 RequestMapping(/m3) public Object fileUpload(RequestParam(file) MultipartFile[] files, HttpServletRequest request) throws Exception {// 携带的其他参数可以使用 getParameter 方法接收String param1 request.getParameter(param1);Response response new Response();if (files null) {response.failure(文件上传错误, 服务端未拿到上传的文件);return response;}for (MultipartFile file : files) {if (!file.isEmpty() file.getSize() 0) {String fileName file.getOriginalFilename();// 参考 FileCopyUtils 这个工具类file.transferTo(new File(D:\\ fileName));logger.info(文件:{} 上传成功...,fileName);}}response.success(文件上传成功);return response;}但是我们发现上面的上传代码中上传文件的类必须使用 FileSystemResource。有时我们会碰到这种情况文件我们会从文件服务下载到内存中一个 InputStream 的形式存在那此时在使用 FileSystemResource 就不行了。 当然我们使用讨巧一点的办法也是可以的先将下载下来的 InputStream 保存到本地然后再读取到 FileSystemResource上传后再删除本地临时文件。 但是总觉得这个方法不够完美。最后发现有个同事已经写了相关的实现。这边就直接拿来用了。 // 自己实现了一个 Resource public class InMemoryResource extends ByteArrayResource {private final String filename;private final long lastModified;public InMemoryResource(String filename, String description, byte[] content, long lastModified) {super(content, description);this.lastModified lastModified;this.filename filename;}Overridepublic long lastModified() throws IOException {return this.lastModified;}Overridepublic String getFilename() {return this.filename;} }调整后的上传代码 PostMapping(/m3)public Object m3(RequestBody JSONObject params) throws Exception{final String url http://localhost:8888/hello/m3;// 设置请求头HttpHeaders headers new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);// 设置请求体注意是 LinkedMultiValueMap// 下面两个流从文件服务下载这边省略注意最后关闭流InputStream fis1 InputStream fis2 InMemoryResource resource1 new InMemoryResource(file1.jpg,description1, FileCopyUtils.copyToByteArray(fis1), System.currentTimeMillis());InMemoryResource resource2 new InMemoryResource(file2.jpg,description2, FileCopyUtils.copyToByteArray(fis2), System.currentTimeMillis());MultiValueMapString, Object form new LinkedMultiValueMap();form.add(file, resource1);form.add(file, resource2);form.add(param1,value1);HttpEntityMultiValueMapString, Object files new HttpEntity(form, headers);JSONObject s restTemplate.postForObject(url, files, JSONObject.class);return s;}4. 文件下载 private InputStream downLoadVideoFromVod(String url) throws Exception {byte[] bytes restTemplate.getForObject(url, byte[].class);return new ByteArrayInputStream(bytes); }一些其他设置# 1. 拦截器配置 RestTemplate 也可以设置拦截器做一些统一处理。这个功能感觉和 Spring MVC 的拦截器类似。配置也很简单 class MyInterceptor implements ClientHttpRequestInterceptor{Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {logger.info(enter interceptor...);return execution.execute(request,body);}}Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) {RestTemplate restTemplate new RestTemplate(factory);MyInterceptor myInterceptor new MyInterceptor();ListClientHttpRequestInterceptor list new ArrayList();list.add(myInterceptor);restTemplate.setInterceptors(list);return restTemplate; }2. ErrorHandler 配置 ErrorHandler 用来对调用错误对统一处理。 public class MyResponseErrorHandler extends DefaultResponseErrorHandler {Overridepublic boolean hasError(ClientHttpResponse response) throws IOException {return super.hasError(response);}Overridepublic void handleError(ClientHttpResponse response) throws IOException {HttpStatus statusCode HttpStatus.resolve(response.getRawStatusCode());if (statusCode null) {throw new UnknownHttpStatusCodeException(response.getRawStatusCode(), response.getStatusText(),response.getHeaders(), getResponseBody(response), getCharset(response));}handleError(response, statusCode);}Overrideprotected void handleError(ClientHttpResponse response, HttpStatus statusCode) throws IOException {switch (statusCode.series()) {case CLIENT_ERROR:HttpClientErrorException exp1 new HttpClientErrorException(statusCode, response.getStatusText(), response.getHeaders(), getResponseBody(response), getCharset(response));logger.error(客户端调用异常,exp1);throw exp1;case SERVER_ERROR:HttpServerErrorException exp2 new HttpServerErrorException(statusCode, response.getStatusText(),response.getHeaders(), getResponseBody(response), getCharset(response));logger.error(服务端调用异常,exp2);throw exp2;default:UnknownHttpStatusCodeException exp3 new UnknownHttpStatusCodeException(statusCode.value(), response.getStatusText(),response.getHeaders(), getResponseBody(response), getCharset(response));logger.error(网络调用未知异常);throw exp3;}}}Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) {RestTemplate restTemplate new RestTemplate(factory);MyResponseErrorHandler errorHandler new MyResponseErrorHandler();restTemplate.setErrorHandler(errorHandler);ListHttpMessageConverter? messageConverters restTemplate.getMessageConverters();// 通过下面代码可以添加新的 HttpMessageConverter//messageConverters.add(new );return restTemplate; }3. HttpMessageConverter 配置 RestTemplate 也可以配置 HttpMessageConverter配置的原理和 Spring MVC 中类似。 简单总结# 通过 RestTemplate我们可以非常方便的进行 Rest API 调用。但是在 Spring 5 中已经不再建议使用 RestTemplate而是建议使用 WebClient。WebClient 是一个支持异步调用的 Client。所以喜欢研究新东西的同学可以开始研究下新东西了。
http://wiki.neutronadmin.com/news/51515/

相关文章:

  • 博客网站建设设计报告网站推广方法素材
  • 一个网站可以做几级链接邯郸怎样做网站
  • 小伙做网站怎么制作公众号教程
  • 做网站服务器是必须购买的吗会展设计专业学什么
  • 写作网站哪个好用网页制作公司印章
  • 备案网站打不开什么建站公司好
  • 做番号网站犯法吗天津最新紧急通知
  • 如何用框架做网站天津最好的网站建设公司
  • 网站宣传平台抢购网站源码
  • seo网站优化价格做网站用突发性实例可以吗
  • 微网站预约网站开发网站运行平台包括
  • 网站改版注意事项直播网站开发需要多少钱
  • 网站搜索引擎优化诊断官方网站aspcms
  • 律师事务所网站建设策划方案百度云网盘登录入口
  • 华为商城的网站建设官网网站建设需求文档
  • 手机网站开发模拟手机房地产互联网推广
  • 网站设计好了如何上传到自己搭建的网上去深圳做微信商城网站
  • 那种系统做网站比较好美轮美奂的网站建设
  • 动易论坛官方网站无锡网站搜索引擎优化
  • 做外贸门户网站wordpress长文档分页
  • 网站开发客户需求文档营销助手下载app下载
  • 建设网站企业邮箱dede网站地图模板文件
  • 优秀的国外设计网站营销型网站建设0469z
  • win11优化大师网站如何seo
  • 网站如何报备软件开发定制价格表
  • wordpress数据库删除seo如何提高网站排名
  • 网龙公司有做网站吗wordpress基础安装
  • 网站怎么备案在哪里橱柜手机网站模板
  • 制作asp手机网站东莞seo优化指南
  • 河北建设工程信息网官方网站高要市建设局网站