Spring远程调用HttpClient/RestTemplate的方法

一、HttpClient

两个系统间如何互相访问?两个tomcat上的项目如何互相访问?

采用HttpClient实现跨系统的接口调用。

介绍:

官网:http://hc.apache.org/index.html

现在也叫:HttpComponents

HttpClient可以发送get、post、put、delete、...等请求

使用:

导入坐标

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.4</version>
</dependency>
//1、使用HttpClient发起Get请求
public class DoGET {

  public static void main(String[] args) throws Exception {
    // 创建Httpclient对象,相当于打开了浏览器
    CloseableHttpClient httpclient = HttpClients.createDefault();

    // 创建HttpGet请求,相当于在浏览器输入地址
    HttpGet httpGet = new HttpGet("http://www.baidu.com/");

    CloseableHttpResponse response = null;
    try {
      // 执行请求,相当于敲完地址后按下回车。获取响应
      response = httpclient.execute(httpGet);
      // 判断返回状态是否为200
      if (response.getStatusLine().getStatusCode() == 200) {
        // 解析响应,获取数据
        String content = EntityUtils.toString(response.getEntity(), "UTF-8");
        System.out.println(content);
      }
    } finally {
      if (response != null) {
        // 关闭资源
        response.close();
      }
      // 关闭浏览器
      httpclient.close();
    }

  }
}

//2、使用HttpClient发起带参数的Get请求
public class DoGETParam {

  public static void main(String[] args) throws Exception {
    // 创建Httpclient对象
    CloseableHttpClient httpclient = HttpClients.createDefault();
    // 创建URI对象,并且设置请求参数
    URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "java").build();

    // 创建http GET请求
    HttpGet httpGet = new HttpGet(uri);

    // HttpGet get = new HttpGet("http://www.baidu.com/s?wd=java");

    CloseableHttpResponse response = null;
    try {
      // 执行请求
      response = httpclient.execute(httpGet);
      // 判断返回状态是否为200
      if (response.getStatusLine().getStatusCode() == 200) {
        // 解析响应数据
        String content = EntityUtils.toString(response.getEntity(), "UTF-8");
        System.out.println(content);
      }
    } finally {
      if (response != null) {
        response.close();
      }
      httpclient.close();
    }
  }
}

//3、使用HttpClient发起POST请求
public class DoPOST {
  public static void main(String[] args) throws Exception {
    // 创建Httpclient对象
    CloseableHttpClient httpclient = HttpClients.createDefault();
    // 创建http POST请求
    HttpPost httpPost = new HttpPost("http://www.oschina.net/");
    // 把自己伪装成浏览器。否则开源中国会拦截访问
    httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");

    CloseableHttpResponse response = null;
    try {
      // 执行请求
      response = httpclient.execute(httpPost);
      // 判断返回状态是否为200
      if (response.getStatusLine().getStatusCode() == 200) {
        // 解析响应数据
        String content = EntityUtils.toString(response.getEntity(), "UTF-8");
        System.out.println(content);
      }
    } finally {
      if (response != null) {
        response.close();
      }
      // 关闭浏览器
      httpclient.close();
    }

  }
}

//4、使用HttpClient发起带有参数的POST请求
public class DoPOSTParam {

  public static void main(String[] args) throws Exception {
    // 创建Httpclient对象
    CloseableHttpClient httpclient = HttpClients.createDefault();
    // 创建http POST请求,访问开源中国
    HttpPost httpPost = new HttpPost("http://www.oschina.net/search");

    // 根据开源中国的请求需要,设置post请求参数
    List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
    parameters.add(new BasicNameValuePair("scope", "project"));
    parameters.add(new BasicNameValuePair("q", "java"));
    parameters.add(new BasicNameValuePair("fromerr", "8bDnUWwC"));
    // 构造一个form表单式的实体
    UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
    // 将请求实体设置到httpPost对象中
    httpPost.setEntity(formEntity);

    CloseableHttpResponse response = null;
    try {
      // 执行请求
      response = httpclient.execute(httpPost);
      // 判断返回状态是否为200
      if (response.getStatusLine().getStatusCode() == 200) {
        // 解析响应体
        String content = EntityUtils.toString(response.getEntity(), "UTF-8");
        System.out.println(content);
      }
    } finally {
      if (response != null) {
        response.close();
      }
      // 关闭浏览器
      httpclient.close();
    }
  }
}

二、RestTemplate

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法

HTTP开发是用apache的HttpClient开发,代码复杂,还得操心资源回收等。代码很复杂,冗余代码多。

导入坐标

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

创建RestTemplate对象

@Configuration//加上这个注解作用,可以被Spring扫描
public class RestTemplateConfig {
  /**
   * 创建RestTemplate对象,将RestTemplate对象的生命周期的管理交给Spring
   * @return
   */
  @Bean
  public RestTemplate restTemplate(){
    RestTemplate restTemplate = new RestTemplate();
    //主要解决中文乱码
    restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
    return restTemplate;
  }
}

RestTempController

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
  // 从Spring的容器中获取restTemplate
  @Resource
  private RestTemplate restTemplate;

  /**
   * 通过Get请求,保存数据
   */
  @GetMapping("/{id}")
  public ResponseEntity<String> findById(@PathVariable Integer id){
    //发起远程请求:通过RestTemplate发起get请求
    ResponseEntity<String> entity = restTemplate.getForEntity("http://localhost:8090/goods2/1", String.class);
    System.out.println("entity.getStatusCode():"+entity.getStatusCode());
    System.out.println(entity.getBody());
    return entity;
  }

  /**
   * 通过Post请求,保存数据
   */
  @PostMapping
  public ResponseEntity<String> saveGoods(@RequestBody Goods goods){
    //通过RestTemplate发起远程请求
    /**
     * 第一个参数:远程地址URI
     * 第二个参数:数据
     * 第三个参数:返回值类型
     */
    ResponseEntity<String> entity = restTemplate.postForEntity("http://localhost:8090/goods2", goods, String.class);
    System.out.println("entity.getStatusCode():"+entity.getStatusCode());
    System.out.println(entity.getBody());
    return entity;
  }

  @PutMapping
  public ResponseEntity<String> updateGoods(@RequestBody Goods goods){
    restTemplate.put("http://localhost:8090/goods2",goods);
    return new ResponseEntity<>("修改成功", HttpStatus.OK);
  }

  @DeleteMapping("/{id}")
  public ResponseEntity<String> deleteById(@PathVariable Integer id){
    restTemplate.delete("http://localhost:8090/goods2/"+id);
    return new ResponseEntity<>("删除成功", HttpStatus.OK);
  }
}

只用maven不用springboot框架时只需要导入依赖到pom文件

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
</dependency>

直接new RestTemplate()对象使用即可

到此这篇关于Spring远程调用HttpClient/RestTemplate的方法的文章就介绍到这了,更多相关Spring远程调用HttpClient/RestTemplate内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot2.0 整合 Dubbo框架实现RPC服务远程调用方法

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互. 2)图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点. 3)图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用. 4)图中只包含 RPC

  • 使用Spring Cloud Feign远程调用的方法示例

    在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client, Spring的RestTemplate.但是,用起来最方便.最优雅的还是要属Feign了. Feign简介 Feign是一个声明式的Web服务客户端,使用Feign可使得Web服务客户端的写入更加方便. 它具有可插拔注释支持

  • Spring cloud踩坑记录之使用feignclient远程调用服务404的方法

    前言 公司项目进行微服务改造,由之前的dubbo改用SpringCloud,微服务之间通过FeignClient进行调用,今天在测试的时候,eureka注册中心有相应的服务,但feignclient就是无法调通,一直报404错误,排查过程如下: 一.问题: 服务提供方定义的接口如下: /** * 黑白名单查询接口 * * @author LiJunJun * @since 2018/10/18 */ @Component(value = "blackAndWhiteListFeignClient

  • Spring http服务远程调用实现过程解析

    最近公司有个新的需求,写了一个接口,想要把服务暴露出去,但是这个服务所在的进程是非web项目,(可以理解成schedule/batch等进程项目),所以没有tomcat等容器,而且只有这一个服务,无论是加dubbo服务还是加tomcat等容器都显得复杂了.那么应该如何将服务暴露出去? 经过网上搜索后,最终解决问题,记录在此. 为了快速搭建,使用springboot来搭建项目: 项目结构如图: 首先需要创建一个接口,服务的提供者和服务的调用方都依赖这个模块. package com.xiazhi.

  • spring cloud feign实现远程调用服务传输文件的方法

    实践案例包括两个项目,服务提供者项目名:upload-service,调用服务项目名:upload-client,主要给出两个服务之间的调用过程,文件上传功能不提供 项目框架:spring-boot 2.0.1.RELEASE.spring-cloud Finchley.RELEASE 依赖: <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form<

  • Spring远程调用HttpClient/RestTemplate的方法

    一.HttpClient 两个系统间如何互相访问?两个tomcat上的项目如何互相访问? 采用HttpClient实现跨系统的接口调用. 介绍: 官网:http://hc.apache.org/index.html 现在也叫:HttpComponents HttpClient可以发送get.post.put.delete....等请求 使用: 导入坐标 <dependency> <groupId>org.apache.httpcomponents</groupId> &

  • 分布式医疗挂号系统Nacos微服务Feign远程调用数据字典

    目录 步骤1:向Nacos服务中心注册微服务 (1)引入Nacos依赖 步骤2:使用Feign进行远程调用 (1)service-hosp医院列表接口 (2)service-cmn医院等级/地址接口 (3)引入Feign依赖 (4)调用端通过包扫描Feign (5)远程调用 步骤3:使用swagger测试 需求:制作一个医院列表的显示功能.列表中包含医院编号.医院等级.医院地址.状态等.分析:首先确定是典型的条件查询带分页.由于医院的等级需要查询数据字典部分,这个调用是在不同的微服务模块中,这就

  • 关于远程调用RestTemplate的使用避坑指南

    目录 一.前言介绍 二. 问题记录 1. 慎![url参数中有json字符串] 2. 慎![url参数中有经过URLEncode的字符串] 3. 慎![url参数中存在特殊字符] --- 针对HttpClient 总结 一.前言介绍 RestTemplate是Spring中用于远程接口调用的工具类,它是Apache的HttpClient的模板封装,使用起来非常方便,本文将讲述这两天自己在使用RestTemplate过程中遇到的问题,当然这些问题也是由于自己对RestTemplate工具类了解不够

  • Spring Cloud负载均衡及远程调用实现详解

    负载均衡 使用微服务后,为了能够承担高并发的压力,同一个服务可能会启动多个实例.这时候消费者就需要负载均衡,把请求分散到各个实例.负载均衡主要有两种设计: 服务端负载均衡客户端负载均衡 对于传统的分布式服务来说,大多使用服务端负载均衡.一般会使用Nginx或者ELB等工具作为负载均衡器,如下图: 传统负载均衡 而在Spring Cloud中,使用的是「客户端负载均衡」的方式,使用「Ribbon」组件来实现客户端的负载均衡.只要引入了微服务注册中心依赖,就会自动引入Ribbon依赖.客户端负载均衡

  • SpringBoot Http远程调用的方法

    本文实例为大家分享了SpringBoot Http远程调用的具体代码,供大家参考,具体内容如下 一.在实现远程调用时可以使用feign与http远程调用,两者的关系有一下几点: feign.http,有时候在调用第三方api的时候.使用httpclient,别人的接口不可能提供它的配置,自己项目框架是spring的,使用feign相互配置,都是okhttpclient的方式.Feign是一个接口声明式调用框架,实现了一个抽象层的逻辑,没有真正实现底层http请求,提供了一个client接口用于实

  • php mailer类调用远程SMTP服务器发送邮件实现方法

    本文实例讲述了php mailer类调用远程SMTP服务器发送邮件实现方法.分享给大家供大家参考,具体如下: php mailer 是一款很好用的php电子邮件发送类模块,可以调用本地的smtp发送电子邮件,也可以调用远程的smtp发送电子邮件,但是使用时需要注意一些事项,否则就会造成发送失败,或者根本不能调用的情况,本文就我在使用这个类时,遇到的问题和解决办法进行展开,简要说明一下php mailer的用法,及注意事项. 首先下载phpmailer类库文件,在这里下载,只需一个资源分. 下载地

  • Python实现远程调用MetaSploit的方法

    本文较为详细的讲述了Python实现远程调用MetaSploit的方法,对Python的学习来说有很好的参考价值.具体实现方法如下: (1)安装Python的msgpack类库,MSF官方文档中的数据序列化标准就是参照msgpack. root@kali:~# apt-get install python-setuptools root@kali:~# easy_install msgpack-python (2)创建createdb_sql.txt: create database msf;

随机推荐