RestTemplate工具类根据服务名发送请求

  要使用RestTemplate 根据服务名发送请求的话需要 使用  @LoadBalanced  这个注解,用了这个注解的RestTemplate就不用使用  ip 来请求了,首先要创建一个配置类

  

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Author: dx
 * @Description:
 * @Date: 2020/2/14 0014
 * @Version: 1.0
 */
@Configuration
public class RestTemplateConfig {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

  

  然后是工具类
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.xin.xunwu.base.Exception.BizException;
import com.xin.xunwu.base.response.ApiResult;
import com.xin.xunwu.entity.ServiceApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.*;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * @author dx
 */
@Slf4j
@Component
public class RestUtil {

    public static final String HTTP = "http://";

    public static final String[] HTTP_METHODS = {"POST", "GET"};

    @Resource
    private RestTemplate restTemplate;

    public ResponseEntity<JSONObject> restQuery(ServiceApi serviceApi) {
        String methodStr = serviceApi.getMethod().toUpperCase();
        // 请求类型错误
        if (!Arrays.asList(HTTP_METHODS).contains(methodStr)) {
            throw new BizException(ApiResult.getErrorResult("30059"));
        }
        // 根据服务名和路径拼接url
        String url = HTTP + serviceApi.getService() + serviceApi.getPath();
        MultiValueMap<String, String> params = null;
        MultiValueMap<String, String> headers = null;

        // 转换参数
        try {
            params = jsonToMap(serviceApi.getParams());
            headers = jsonToMap(serviceApi.getHeader());
        } catch (Exception e) {
            e.printStackTrace();
            // json 转换错误
            throw new BizException(ApiResult.getErrorResult("30060"));
        }
        HttpMethod method = HttpMethod.resolve(methodStr);
        return restQuery(url, params, method, headers);
    }

    private MultiValueMap<String, String> jsonToMap(String jsonStr) {
        if (jsonStr == null) {
            return null;
        }
        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
        MultiValueMap<String, String> result = new LinkedMultiValueMap<>();
        jsonObject.forEach((key, value) -> result.add(key, value.toString()));
        return result;
    }

    private ResponseEntity<JSONObject> restQuery(String url, MultiValueMap<String, String> paramsMap,
                                                 HttpMethod method, MultiValueMap<String, String> headerMap) {
        ResponseEntity<JSONObject> responseEntity = null;
        // 转换编码格式
        List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
        for (HttpMessageConverter<?> httpMessageConverter : list) {
            if (httpMessageConverter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter)
                        httpMessageConverter).setDefaultCharset(StandardCharsets.UTF_8);
                break;
            }
        }

        // 设置头信息
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        httpHeaders.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON));

        // 头信息非空的话,添加头信息
        Optional.ofNullable(headerMap).ifPresent(httpHeaders::addAll);

        // 设置头信息和请求参数
        HttpEntity<MultiValueMap<String, String>> params = new HttpEntity<>(paramsMap, httpHeaders);
     // 如果是get请求的话需要把参数拼到url上
        if(method.equals(HttpMethod.GET)){
            UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
            paramsMap.forEach(builder::queryParam);
            url = builder.build().encode().toString();
        }

        try {
            responseEntity = restTemplate.exchange(url, method, params, JSONObject.class);
        } catch (Exception e) {
            // 请求失败
            log.warn("restTemplate  error [message] {}", e.getMessage());
        }
        return responseEntity;
    }
}

  然后是用到的一个实体类,这个不是必须的,可以根据自己的需要修改,我这是业务需求

  

import lombok.Getter;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Id;
import java.util.Date;

/**
 @author Generator
 @since 2020-02-13T10:38:02.789
 **/
@Getter
@Setter
public class ServiceApi {
    /**
     * 通过ID生成器自动生成
     */
    @Id
    private Long id;

    /**
     * 编号
     */
    private String number;

    /**
     * 服务名(注册服务名称)
     */
    private String service;

    /**
     * 方法
     */
    private String method;

    /**
     * 路径
     */
    private String path;

    /**
     * 头信息
     */
    private String header;

    /**
     * 请求体
     */
    private String body;

    /**
     * 参数
     */
    private String params;

    /**
     * 接口类型(drop:下拉选 verify:验证)
     */
    private String type;

    /**
     * 备注
     */
    private String remark;

    /**
     * 删除标记(0:未删除;1:已删除)
     */
    @Column(name = "delete_flg")
    private String deleteFlg;

    /**
     * 创建时间
     */
    @Column(name = "create_time")
    private Date createTime;

    /**
     * 创建者
     */
    private Long creator;

    /**
     * 更新时间
     */
    @Column(name = "update_time")
    private Date updateTime;

    /**
     * 更新者
     */
    private Long updator;
}

  

原文地址:https://www.cnblogs.com/luffyxin/p/12310895.html

时间: 2024-11-02 22:53:30

RestTemplate工具类根据服务名发送请求的相关文章

Hessian客户端向服务端发送请求头

Hessian客户端向服务端发送数据 场景:项目日志Token处理,即用户发送一个请求时生成一个日志Token,该Token从各个服务之间传递,并使用该Token记录日志,直至请求结束.可以根据该Token定位所有日志. 问题:由于目前项目使用Hessian协议,所有Token必须使用Hessian传递.查阅相关资料,发现可以请求头传递数据. 解决方法:定义与线程相关的请求头上下文,在客户端发送请求之前,增加请求头.服务端获取请求时,从请求中解决请求头,并放入请求头上下文中,供服务端使用. 实现

jQuery通过Ajax向PHP服务端发送请求并返回JSON数据

ON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.JSON在前后台交互的过程中发挥着相当出色的作用.请接着往下看教程. XHTML  <ul id="userlist">    <li><a href="#" rel="1">张三</a></li>    <li><a href=&quo

ajax对服务端发送请求

//兼容处理获取ajax对象 var req = ''; if (window.XMLHttpRequest)    req = new XMLHttpRequest(); else    req = new ActiveXObject("Msxml2.XMLHTTP"); //建立连接 req.open('get', 'demo.php'); //发送请求 req.send(); 原文地址:https://www.cnblogs.com/wangshengl9263/p/902952

restTemplate工具类

import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.cl

Visual Studio 2015 Bowser Link的功能不停的向服务端发送请求

Visual Studio 2015新建的mvc项目 默认在每个视图上生成一些JavaScript脚本 这些脚本不断向发送异步请求. 去除这这些自动生成的脚本方法: 方法一: 修改vs的配置: 方法二:修改项目的Web.config配置文件 <appSettings> <add key="vs:EnableBrowserLink" value="false"/> </appSettings>

node.js创建服务,发送请求后返回数据

1.引入http模块 var http = require('http'); 2.创建服务 var server = http.createServer(); 3.绑定request事件 server.on('request',function(req,res){ // req.url 是访问的地址 if(req.url === '/login'){ // req.write()在页面上返回数据 res.write('login') // 返回数据后使用end,不然不能返回数据 res.end(

iOS_21团购_通过block对请求工具类的代理方法进行二次封装

最终效果图: [点评]提供的工具类DPAPI 在请求完毕后,使用的是代理机制,当一次请求成功或者失败时,会调用代理的相应方法 为了将点评提供的工具类DPAPI进行二次封装, 再次定义了一个block: typedef  void(^RequestDoneCallBackBlock)(id deals,NSError *err); 该block有两个参数, 分别是成功时,服务器返回的deals字典数组 另一个参数是:请求失败时,服务器返回的失败信息 两个参数分别对应代理的两个方法(即成功.失败时分

史上最全的开发工具类

    API 银行卡管理 → BankCheck checkBankCard : 校验银行卡卡号是否合法 getBankCardCheckCode: 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位 getNameOfBank : 通过银行卡的前六位确定判断银行开户行及卡种 SharePreference缓存数据 →AppSharePreferenceMgr put : 保存数据的方法 get : 获取数据的方法 putImage: 保存图片到SharedPreferences ge

史上最全的开发工具类(转)

     API 银行卡管理 → BankCheck checkBankCard : 校验银行卡卡号是否合法getBankCardCheckCode: 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位getNameOfBank : 通过银行卡的前六位确定判断银行开户行及卡种 SharePreference缓存数据 →AppSharePreferenceMgr put : 保存数据的方法get : 获取数据的方法putImage: 保存图片到SharedPreferencesgetIma