springBoot RestTemplate的http请求一

目录

 

get简单的无参请求

发送get无参请求

接收端

测试结果

get请求网页源码及中文乱码问题

get 获取百度网页源码

中文乱码的解决

get带参请求(分为两类)

第一类getForEntity(主要有两种方式)

第一种

第二种

其他方法

自定义返回类型

第二类getForObject

post请求以此类推

postForLocation

put请求

delete请求


get简单的无参请求

发送get无参请求

 public static void main(String[] args) throws Exception {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://127.0.0.1:8080/httpByGetParams", String.class);
        System.out.println("responseEntity.getBody():" + responseEntity.getBody());
        System.out.println("responseEntity.getStatusCode() " + responseEntity.getStatusCode());
        System.out.println("responseEntity.getStatusCodeValue() " + responseEntity.getStatusCodeValue());
        System.out.println("responseEntity.getHeaders() " + responseEntity.getHeaders());
    }

接收端

   @GetMapping("httpByGetParams")
    public String httpByGetParams(HttpServletRequest request){
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            System.out.println(parameterName + "===" + request.getParameter(parameterName));
            //System.out.println(parameterNames.nextElement()+"=="+request.getParameter(parameterNames.nextElement()));
        }

        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String headerName = headerNames.nextElement();
            System.out.println(headerName+"=="+request.getHeader(headerName));
        }
        return "你好啊";
    }

测试结果

在这里插入图片描述

在这里插入图片描述

关于这段代码,我说如下几点:

getForEntity的第一个参数为我要调用的服务的地址,
getForEntity第二个参数String.class表示我希望返回的body类型是String,当然这个类型我们可以自定义
拿到返回结果之后,将返回结果遍历打印出来

get请求网页源码及中文乱码问题

get 获取百度网页源码

 //有乱码
    public String getHello() {
        RestTemplate restTemplate = new RestTemplate(); //会乱码
      
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://www.baidu.com", String.class);
        String body = responseEntity.getBody();
        HttpStatus statusCode = responseEntity.getStatusCode();
        int statusCodeValue = responseEntity.getStatusCodeValue();
        HttpHeaders headers = responseEntity.getHeaders();
        StringBuffer result = new StringBuffer();
        result.append("responseEntity.getBody():").append(body).append("==========")
                .append("responseEntity.getStatusCode():").append(statusCode).append("=========")
                .append("responseEntity.getStatusCodeValue():").append(statusCodeValue).append("==========")
                .append("responseEntity.getHeaders():").append(headers).append("==========");

        return result.toString();
    }

出现可乱码
在这里插入图片描述

中文乱码的解决

参考
https://blog.csdn.net/a625013/article/details/52502723

 public String getHello() {

        //RestTemplate restTemplate = new RestTemplate(); //会乱码
        //解决方法1 ok https://blog.csdn.net/a625013/article/details/52502723
        StringHttpMessageConverter messageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(messageConverter).build();

        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://www.baidu.com", String.class);
        String body = responseEntity.getBody();
        HttpStatus statusCode = responseEntity.getStatusCode();
        int statusCodeValue = responseEntity.getStatusCodeValue();
        HttpHeaders headers = responseEntity.getHeaders();
        StringBuffer result = new StringBuffer();
        result.append("responseEntity.getBody():").append(body).append("==========")
                .append("responseEntity.getStatusCode():").append(statusCode).append("=========")
                .append("responseEntity.getStatusCodeValue():").append(statusCodeValue).append("==========")
                .append("responseEntity.getHeaders():").append(headers).append("==========");

        return result.toString();
    }

结果
在这里插入图片描述

get带参请求(分为两类)

第一类getForEntity(主要有两种方式)

第一种

  public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://127.0.0.1:8080/httpByGetParams?name={1}", String.class, "张三");
        System.out.println(responseEntity.getBody());
    }

第一种方式
可以用一个数字做占位符,最后是一个可变长度的参数,来一一替换前面的占位符
运行
在这里插入图片描述

在这里插入图片描述

如果参数这样写

        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://127.0.0.1:8080/httpByGetParams?name={2}&as={0}", String.class, "wangwu","张三","李四");

打印结果为:
在这里插入图片描述

可见占位符的顺序和可变参数的顺序是一一对应的,和占位符里面的数字没有关系,即使占位符里面的数字相同也是如此

第二种

 public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        Map<String, String> map = new HashMap<>();
        map.put("name", "李四");
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://127.0.0.1:8080/httpByGetParams?name={name}", String.class, map);
        System.out.println(responseEntity.getBody());
    }

第二种方法
也可以前面使用name={name}这种形式,最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值

运行
在这里插入图片描述

在这里插入图片描述

其他方法

第一个调用地址也可以是一个URI而不是字符串,这个时候我们构建一个URI即可,参数神马的都包含在URI中了,如下

  public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://127.0.0.1:8080/httpByGetParams?name={name}").build().expand("王五").encode();
        URI uri = uriComponents.toUri();
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
        System.out.println(responseEntity.getBody());
    }

通过Spring中提供的UriComponents来构建Uri即可。
运行
在这里插入图片描述

自定义返回类型

1 自定义对象

@Data
public class User {
     public User(String name,Integer age){
        this.name=name;
        this.age=age;
    }
    private String name;
    private Integer age;
}

修改接口返回对象

以为Controller的注解为@RestController,所以返回的为json对象

 @GetMapping("httpByGetParams")
    public User httpByGetParams(HttpServletRequest request){
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            System.out.println(parameterName + "===" + request.getParameter(parameterName));
            //System.out.println(parameterNames.nextElement()+"=="+request.getParameter(parameterNames.nextElement()));
        }

        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String headerName = headerNames.nextElement();
            System.out.println(headerName+"=="+request.getHeader(headerName));
        }
        return new User("hello",5);
    }

测试

 public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://127.0.0.1:8080/httpByGetParams?name={name}").build().expand("王五").encode();
        URI uri = uriComponents.toUri();
        ResponseEntity<User> responseEntity = restTemplate.getForEntity(uri, User.class);
        System.out.println(responseEntity.getBody());
    }

结果
在这里插入图片描述

在这里插入图片描述

第二类getForObject

getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject,举一个简单的例子,如下:

public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        User forObject = restTemplate.getForObject("http://127.0.0.1:8080/httpByGetParams", User.class);
        System.out.println(forObject);
    }

结果
在这里插入图片描述
打印出来的直接是一个对象

getForObject也有几个重载方法,如下:
这里写图片描述
这几个重载方法参数的含义和getForEntity一致,我就不再赘述了。

post请求以此类推

post请求也有对应的两类
postForEntity和postForObject,他与get形式的用法一一对应
这里就不在说了

postForLocation

postForLocation也是提交新资源,提交成功之后,返回新资源的URI,postForLocation的参数和前面两种的参数基本一致,只不过该方法的返回值为Uri,这个只需要服务提供者返回一个Uri即可,该Uri表示新资源的位置。

put请求

在RestTemplate中,PUT请求可以通过put方法调用,put方法的参数和前面介绍的postForEntity方法的参数基本一致,只是put方法没有返回值而已。举一个简单的例子,如下:

delete请求

delete请求我们可以通过delete方法调用来实现,如下例子:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值