RestTemplate调用第三方API

1.已知API及功能

带token访问
添加head Cookie     token=MKErXRTeUq5aKzzvYRZkHuvq5QsAKeS2mQ8eDekv                                       headers处添加   Cookie   token=....

获取token
http://10.127.2.119:5050/v2-beta/token            {"code":"fiberhome:fh123456","authProvider":"localAuthConfig"}     生成Token
    

获取环境id
http://10.127.2.119:5050/v2-beta/projects?limit=-1&sort=name

获取所有栈列表
http://10.127.2.119:5050/v2-beta/projects/1a5/stacks

获取栈下所有服务
http://10.127.2.119:5050/v2-beta/projects/1a5/stacks/1st5/services

2.分布实现API功能

Entity实体类
JwtToken

import lombok.Data;

@Data
public class JwtToken {

    private String type;

    private String message;

    private String status;

    private String code;

    private String jwt;

    private String user;

    private String userType;

}

Datas 中间实体类

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;

@Data
public class Datas {

    @JsonProperty("data")
    private List<DataDetail> detailList;

}

DataDetail

import lombok.Data;

@Data
public class DataDetail {

    private String name;

    private String id;

    private String state;

    private String accountId;

}

配置类

import lombok.Data;
import org.springframework.context.annotation.Configuration;

/**
 *
 * @author lifc
 * @since 2020-10-28
 */

@Data
@Configuration
public class RanCherConfig {

    /**
     * fitMgr 申请token使用的code
     */
    private String code = "fiberhome:fh123456";

    /**
     * fitMgr 申请token使用的authProvider
     */
    private String authProvider = "localAuthConfig";

    /**
     * fitMgr申请token的服务地址
     */
    private String ranCherAuthUrl = "http://10.127.2.119:5050/v2-beta/token";

    /**
     * 获取环境id的服务地址
     */
    private String ranCherIdUrl =  "http://10.127.2.119:5050/v2-beta/projects?limit=-1&sort=name";

    /**
     * 获取所有栈列表的服务前缀地址
     */
    private String ranCherListUrl = "http://10.127.2.119:5050/v2-beta/projects/";

}

Controller层

import com.fitmgr.ces.client.rancher.RanCherClient;
import com.fitmgr.ces.client.rancher.eneity.DataDetail;
import com.fitmgr.ces.client.rancher.eneity.JwtToken;
import com.fitmgr.ces.common.config.RanCherConfig;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.Serializable;
import java.util.List;

@Data
@Slf4j
@Validated
@RestController
public class RestTemplateController implements Serializable {

    @Autowired
    private RanCherClient ranCherClient;

    @Autowired
    private RanCherConfig ranCherConfig;

    @GetMapping("/test")
    public JwtToken test() {

        return ranCherClient.tokenAuth(ranCherConfig.getCode(), ranCherConfig.getAuthProvider());
    }

    @GetMapping("/test1")
    public List<DataDetail> test1() {

        return ranCherClient.getId();
    }

    @GetMapping("/test2")
    public List<DataDetail> test2() {

        return ranCherClient.getList();
    }

    @GetMapping("/test3")
    public List<DataDetail> test3() {

        return ranCherClient.getService();
    }
}

RanCherClient 实现接口功能

import com.fitmgr.ces.client.rancher.eneity.DataDetail;
import com.fitmgr.ces.client.rancher.eneity.Datas;
import com.fitmgr.ces.client.rancher.eneity.JwtToken;
import com.fitmgr.ces.common.config.RanCherConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Auther: lifc
 * @Date:Create in 14:32  2020/10/29
 */

@Component
public class RanCherClient implements Serializable {

    @Resource(name = "CesRestTemplate")
    private RestTemplate restTemplate;

    @Autowired
    private RanCherConfig ranCherConfig;

    /**
     * 获取访问服务需要的token
     *
     * @param code
     * @param authProvider
     * @return jwtToken
     */
    public JwtToken tokenAuth(String code, String authProvider) {

        String url = ranCherConfig.getRanCherAuthUrl();

        Map<String, String> request = new HashMap<>();
        request.put("code", code);
        request.put("authProvider", authProvider);

        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("Content-Type", "application/json");

        HttpEntity req = new HttpEntity<>(request, requestHeaders);
        ResponseEntity<JwtToken> tokenResponseEntity = restTemplate.postForEntity(url, req, JwtToken.class);
        JwtToken jwtToken = tokenResponseEntity.getBody();

        return jwtToken;
    }

    /**
     * 获取外层ID和NAME列表
     *
     * @return List<DataDetail>
     */
    public List<DataDetail> getId() {

        String url = ranCherConfig.getRanCherIdUrl();
        String oriJwt = tokenAuth(ranCherConfig.getCode(), ranCherConfig.getAuthProvider()).getJwt();
        String jwt = "token=" + oriJwt;
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("Content-Type", "application/json");
        requestHeaders.add("Cookie", jwt);
        HttpEntity req = new HttpEntity<>(requestHeaders);
        ResponseEntity<Datas> datasResponseEntity = restTemplate.exchange(url, HttpMethod.GET, req, Datas.class);
        Datas datas = datasResponseEntity.getBody();
        List<DataDetail> dataDetails = datas.getDetailList();

        return dataDetails;
    }

    /**
     * 获取NAME为 Default 的列表
     *
     * @return List<DataDetail>
     */
    public List<DataDetail> getList() {
        List<DataDetail> OridataDetails = getId();
        for (DataDetail dataDetail : OridataDetails) {
            String name = dataDetail.getName();
            if (name != null && name != "" && name.equals("Default")) {
                String id = dataDetail.getId();
                String OriUrl = ranCherConfig.getRanCherListUrl();
                String url = OriUrl + id + "/stacks/";
                String oriJwt = tokenAuth(ranCherConfig.getCode(), ranCherConfig.getAuthProvider()).getJwt();
                String jwt = "token=" + oriJwt;
                HttpHeaders requestHeaders = new HttpHeaders();
                requestHeaders.add("Content-Type", "application/json");
                requestHeaders.add("Cookie", jwt);
                HttpEntity req = new HttpEntity<>(requestHeaders);
                ResponseEntity<Datas> datasResponseEntity = restTemplate.exchange(url, HttpMethod.GET, req, Datas.class);
                Datas datas = datasResponseEntity.getBody();
                List<DataDetail> dataDetails = datas.getDetailList();
                return dataDetails;
            }
        }
        return null;
    }

    /**
     * 获取NAME为 fitmgr 的列表
     *
     * @return List<DataDetail>
     */
    public List<DataDetail> getService() {
        List<DataDetail> OridataDetail = getList();
        for (DataDetail dataDetail : OridataDetail) {
            if (dataDetail.getName().equals("fitmgr")) {
                String id = dataDetail.getId();
                String accountID = dataDetail.getAccountId();
                String url = ranCherConfig.getRanCherListUrl() + accountID + "/stacks/" + id + "/services";
                String oriJwt = tokenAuth(ranCherConfig.getCode(), ranCherConfig.getAuthProvider()).getJwt();
                String jwt = "token=" + oriJwt;
                HttpHeaders requestHeaders = new HttpHeaders();
                requestHeaders.add("Content-Type", "application/json");
                requestHeaders.add("Cookie", jwt);
                HttpEntity req = new HttpEntity<>(requestHeaders);
                ResponseEntity<Datas> datasResponseEntity = restTemplate.exchange(url, HttpMethod.GET, req, Datas.class);
                Datas datas = datasResponseEntity.getBody();
                List<DataDetail> dataDetails = datas.getDetailList();
                return dataDetails;
            }
        }
        return null;
    }
}

RestTemplate配置文件

import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;

/**
 *
 * @author lcy
 * @since 2020-04-07
 */

@Configuration
public class RestTemplateConfig {

    @Bean(name="CesRestTemplate")
    public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException{

        final HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        //设置过期时间
        factory.setConnectionRequestTimeout(50000);
        factory.setReadTimeout(50000);
        final SSLContextBuilder builder = new SSLContextBuilder();
        try {
            //全部信任 不做身份鉴定
            builder.loadTrustMaterial(null, (X509Certificate[] x509Certificate, String s) -> true);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw e;
        } catch (KeyStoreException e) {
            throw e;
        }
        SSLConnectionSocketFactory socketFactory = null;
        try {
            //客户端支持SSLv2Hello,SSLv3,TLSv1,TLSv1
            socketFactory = new SSLConnectionSocketFactory(builder.build(), new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
        //为自定义连接器注册http与https
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", new PlainConnectionSocketFactory()).register("https", socketFactory).build();
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);
        poolingHttpClientConnectionManager.setMaxTotal(500);
        final CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).setConnectionManager(poolingHttpClientConnectionManager).setConnectionManagerShared(true).build();
        factory.setHttpClient(httpClient);
        final RestTemplate restTemplate = new RestTemplate(factory);
        return restTemplate;
    }


}

postFortEntity() + getBody() = postForObject
都是获取响应体

RestTemplate 还有PUT,DELETE方法
用于修改或删除 已获得的第三方接口内容

exchange 方法 4种请求方式都支持

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值