RestTemplate基本使用(get、post)请求发送HTTP请求,设置请求体 @RibbonClient和@LoadBalanced之间的区别

java用restTemplate调用get请求有请求头 resttemplate get请求_spring

简介

springboot 自带 http 工具类   常 用于 微服务  发送http请求 调用接口

GET请求

  • 方式一:getForEntity:返回的正文对象包装在httpEntity实体中,适用于获取除返回的正文之外,对返回头状态码有需求的场景
  • 方式二:getForObject:返回正文,适用于只对正文感兴趣场景
    两种方法除了返回结果不同之外,其他的使用姿势基本一样,有三种
* public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables)
 * public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
 * public <T> T getForObject(URI url, Class<T> responseType)

准备 后台接口

java用restTemplate调用get请求有请求头 resttemplate get请求_System_02

//创建rest模板对象
        RestTemplate template = new RestTemplate();
        //方式一
        HttpEntity<String> res = template.getForEntity(  "http://localhost:8081/order/8",String.class);
        System.out.println(res);

java用restTemplate调用get请求有请求头 resttemplate get请求_java_03

//方式一 可变参数 传参
        String obj1 = template.getForObject("http://localhost:8081/get/?productId={?}&name={?}&price={?}", String.class, "9", "娃娃菜", "99.66");
        System.out.println(obj1);

java用restTemplate调用get请求有请求头 resttemplate get请求_功能区_04

//方式二 把参数放在Map中
        ResponseEntity<String> entity = template.getForEntity("http://localhost:8081/get/?productId={productId}&name={name}&price={price}", String.class, new HashMap<String, Object>() {
            {
                put("productId", 99);
                put("name", "百事可乐");
                put("price", 45.55);
            }
        });
        System.out.println(entity);

java用restTemplate调用get请求有请求头 resttemplate get请求_java_05

方式三 …

POST请求 表单请求

  • postForEntity: 返回的正文封装在 HttpEntity
  • postForObject: 直接返回正文对象
API
 * public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables);
    * public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables);
     * public <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType);
     

post 和get 用法差不多 多了个参数  后面的uriVariables是 url 参数,不是 POST 表单参数哦

RestTemplate postTem = new RestTemplate();
//        //方式一 url 直接拼接
        ResponseEntity<String> post = postTem.postForEntity("http://localhost:8081/post?test=zs", new LinkedMultiValueMap<>(), String.class);
        System.out.println(post);

java用restTemplate调用get请求有请求头 resttemplate get请求_功能区_06


//方式二  提交的表单参数
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("productId", 99);
        params.add("name", "王老吉");
        params.add("price", 45.33);
//
        ResponseEntity<String> post = postTem.postForEntity("http://localhost:8081/post", params, String.class);
        System.out.println(post);

java用restTemplate调用get请求有请求头 resttemplate get请求_java_07

//方式一  url上传参数
        String s = postTem.postForObject("http://localhost:8081/post/?productId={?}&name={?}&price={?}", params, String.class, "9", "娃娃菜", "99.66");
        System.out.println(s);

java用restTemplate调用get请求有请求头 resttemplate get请求_spring_08


//方式二
String s1 = postTem.postForObject("http://localhost:8081/post/?productId={productId}&name={name}&price={price}", params, String.class, new HashMap<String, Object>() {
    {
        put("productId", 99);
        put("name", "百事可乐");
        put("price", 45.55);
    }
});
System.out.println(s1);

java用restTemplate调用get请求有请求头 resttemplate get请求_功能区_09

方式三 …

post body

请求一个json串 需要处理一下 请求头 Content-Type 为 application/json

public static void postBody() {
        RestTemplate template = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_PROBLEM_JSON);


        JSONObject params = new JSONObject();

        params.append("productId", 99);
        params.append("name", "王老吉");
        params.append("price", 45.33);

        HttpEntity<String> entity = new HttpEntity<>(params.toJSONString(5), headers);
        ResponseEntity<String> forEntity = template.postForEntity("http://localhost:8081/post", entity, String.class);
        System.out.println(forEntity);

    }

结果

java用restTemplate调用get请求有请求头 resttemplate get请求_功能区_10

@RibbonClient和@LoadBalanced之间的区别
@LoadBalanced是标记注释,@RibbonClient用于配置目的。

@LoadBalanced
用作标记注释,指示被注释的对象RestTemplate应使用RibbonLoadBalancerClient与您的服务进行交互。

反过来,这允许您对传递给的网址使用“逻辑标识符” RestTemplate。这些逻辑标识符通常是服务的名称

restTemplate.getForObject("http://some-service-name/user/{id}", String.class, 1);
  • some-service-name逻辑标识符在哪里

@RibbonClient
用于配置功能区客户端。
至少有两种情况需要使用 @RibbonClient

  • 您需要为特定的功能区客户端自定义功能区设置
  • 您没有使用任何服务发现

自定义功能区设置:
定义一个 @RibbonClient

@RibbonClient(name = "some-service", configuration = SomeServiceConfig.class)
  • name -将其设置为与功能区调用的服务相同的名称,但需要其他自定义功能区以与功能区交互
  • configuration-将其设置为@Configuration所有定义为的类@Beans。确保 不 选择此类,@ComponentScan否则它将覆盖所有功能区客户端的默认设置

如果您未使用Service
Discovery,则注释name字段@RibbonClient将用于application.properties在您传递给的URL
中的前缀以及“逻辑标识符”中为您的配置添加前缀RestTemplate。

定义一个 @RibbonClient

@RibbonClient(name = “myservice”)
然后在你的 application.properties

my服务service.ribbon.eureka.enabled=false
my服务service.ribbon.listOfServers=http://localhost:5000, http://localhost:5001