【远程调用】如何发送HTTP请求?RestTemplate

Springboot之restTemplate

同步客户端执行HTTP请求,在底层HTTP客户端库(如JDK HttpURLConnection、Apache HttpComponents等)上公开一个简单的模板方法API。RestTemplate通过HTTP方法为常见场景提供了模板,此外还提供了支持不太常见情况的通用交换和执行方法。 **RestTemplate通常用作共享组件。然而,它的配置不支持并发修改,因此它的配置通常是在启动时准备的。**如果需要,您可以在启动时创建多个不同配置的RestTemplate实例。如果这些实例需要共享HTTP客户端资源,它们可以使用相同的底层ClientHttpRequestFactory。 注意:从5.0开始,这个类处于维护模式,只有对更改和错误的小请求才会被接受。请考虑使用org.springframework.web.react .client. webclient,它有更现代的API,支持同步、异步和流场景。

@Configuration
public class RemoteCallConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
public Result doHandlePostJson(String restUri, String jsonData)
            throws Exception {

        Result result = null;

        try {

            // logger记录
            log.info("doHandlePostJson request restUri:" + restUri
                    + " sendData:" + jsonData);

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            HttpEntity request = new HttpEntity(jsonData, headers);

            // 发送http服务请求
            ResponseEntity<String> response = restTemplate.postForEntity(
                    restUri, request, String.class);

            // 判断返回结果
            if (response.getStatusCode() == HttpStatus.OK) {

                // logger记录
                log.debug("doHandlePostJson restUri response success,interfaceUri:"
                        + restUri);

                // 获得返回结果
                String repData = response.getBody();

                // logger记录
                log.info("doHandlePostJson restUri response success,return data:"
                        + repData);

                // 返回成功
                result = Result.succeed(repData, "");

            } else {

                // logger记录
                log.info("doHandlePostJson restUri response error,interfaceUri:"
                        + restUri + " http status:" + response.getStatusCode());

                // 返回产品Gateway通讯异常错误
                result = Result.failed("请求外部系统异常");
            }

        } catch (ResourceAccessException e) {

            // logger记录
            log.error("doHandlePostJson restUri ResourceAccessException:", e);

            // 返回通讯异常错误
            result = Result.failed("请求外部系统超时");

        } catch (Exception e) {

            // logger记录
            log.error("doHandlePostJson restUri Exception:", e);

            // 返回通讯异常错误
            result = Result.failed("请求外部系统未知异常");
        } finally {

            // 关闭
        }

        return result;
    }

package org.springframework.http;

HttpHeaders

public class HttpHeaders implements MultiValueMap<String, String>, Serializable

HttpEntity

public class HttpEntity

HttpStatus

public enum HttpStatus

Java发送http请求可以使用Spring提供的RestTemplate,使用的基本步骤如下:
- 注册RestTemplate到Spring容器
- 调用RestTemplate的API发送请求,常见方法有:
  - getForObject:发送Get请求并返回指定类型对象
  - PostForObject:发送Post请求并返回指定类型对象
  - put:发送PUT请求
  - delete:发送Delete请求
  - exchange:发送任意类型请求,返回ResponseEntity

在微服务中,如果用到了注册中心,那么使用open-feign进行远程调用会更好,不使用RestTemplate了。

Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:

  • HttpURLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

因此我们通常会使用带有连接池的客户端来代替默认的HttpURLConnection。比如,我们使用OK Http.

OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
    Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值