美文网首页
SpringBoot访问外部接口

SpringBoot访问外部接口

作者: 一觉睡到丶小时候 | 来源:发表于2023-10-16 18:26 被阅读0次

    原生的Http请求

    @RequestMapping("/doPostGetJson")
    public String doPostGetJson() throws ParseException {
       //此处将要发送的数据转换为json格式字符串
       String jsonText = "{id: 1}";
       JSONObject json = (JSONObject) JSONObject.parse(jsonText);
       JSONObject sr = this.doPost(json);
       System.out.println("返回参数: " + sr);
       return sr.toString();
    }
    
    public static JSONObject doPost(JSONObject date) {
       HttpClient client = HttpClients.createDefault();
       // 要调用的接口方法
       String url = "http://192.168.1.101:8080/getJson";
       HttpPost post = new HttpPost(url);
       JSONObject jsonObject = null;
       try {
          StringEntity s = new StringEntity(date.toString());
          s.setContentEncoding("UTF-8");
          s.setContentType("application/json");
          post.setEntity(s);
          post.addHeader("content-type", "text/xml");
          HttpResponse res = client.execute(post);
          String response1 = EntityUtils.toString(res.getEntity());
          System.out.println(response1);
          if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
             String result = EntityUtils.toString(res.getEntity());// 返回json格式: 
             jsonObject = JSONObject.parseObject(result);
          }
       } catch (Exception e) {
          throw new RuntimeException(e);
       }
       return jsonObject;
    }
    

    HttpUtils

    import org.apache.commons.lang.StringUtils;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpDelete;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.methods.HttpPut;
    import org.apache.http.conn.ClientConnectionManager;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.scheme.SchemeRegistry;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.entity.ByteArrayEntity;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.security.KeyManagementException;
    import java.security.NoSuchAlgorithmException;
    import java.security.cert.X509Certificate;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    public class HttpUtils {
    
        /**
         * get
         *
         * @param host
         * @param path
         * @param headers
         * @param querys
         * @return
         * @throws Exception
         */
        public static HttpResponse doGet(String host, String path,
                                         Map<String, String> headers,
                                         Map<String, String> querys)
                throws Exception {
            HttpClient httpClient = wrapClient(host);
    
            HttpGet request = new HttpGet(buildUrl(host, path, querys));
            for (Map.Entry<String, String> e : headers.entrySet()) {
                request.addHeader(e.getKey(), e.getValue());
            }
    
            return httpClient.execute(request);
        }
    
        /**
         * post form
         *
         * @param host
         * @param path
         * @param method
         * @param headers
         * @param querys
         * @param bodys
         * @return
         * @throws Exception
         */
        public static HttpResponse doPost(String host, String path, String method,
                                          Map<String, String> headers,
                                          Map<String, String> querys,
                                          Map<String, String> bodys)
                throws Exception {
            HttpClient httpClient = wrapClient(host);
    
            HttpPost request = new HttpPost(buildUrl(host, path, querys));
            for (Map.Entry<String, String> e : headers.entrySet()) {
                request.addHeader(e.getKey(), e.getValue());
            }
    
            if (bodys != null) {
                List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
    
                for (String key : bodys.keySet()) {
                    nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
                }
                UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
                formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
                request.setEntity(formEntity);
            }
    
            return httpClient.execute(request);
        }
    
        /**
         * Post String
         *
         * @param host
         * @param path
         * @param method
         * @param headers
         * @param querys
         * @param body
         * @return
         * @throws Exception
         */
        public static HttpResponse doPost(String host, String path, String method,
                                          Map<String, String> headers,
                                          Map<String, String> querys,
                                          String body)
                throws Exception {
            HttpClient httpClient = wrapClient(host);
            RequestConfig requestConfig =
                    RequestConfig.custom().setSocketTimeout(20000).setConnectTimeout(20000).build();
            HttpPost request = new HttpPost(buildUrl(host, path, querys));
            request.setConfig(requestConfig);
            for (Map.Entry<String, String> e : headers.entrySet()) {
                request.addHeader(e.getKey(), e.getValue());
            }
    
            if (org.apache.commons.lang.StringUtils.isNotBlank(body)) {
                request.setEntity(new StringEntity(body, "utf-8"));
            }
    
            return httpClient.execute(request);
        }
    
        /**
         * Post stream
         *
         * @param host
         * @param path
         * @param method
         * @param headers
         * @param querys
         * @param body
         * @return
         * @throws Exception
         */
        public static HttpResponse doPost(String host, String path, String method,
                                          Map<String, String> headers,
                                          Map<String, String> querys,
                                          byte[] body)
                throws Exception {
            HttpClient httpClient = wrapClient(host);
    
            HttpPost request = new HttpPost(buildUrl(host, path, querys));
            for (Map.Entry<String, String> e : headers.entrySet()) {
                request.addHeader(e.getKey(), e.getValue());
            }
    
            if (body != null) {
                request.setEntity(new ByteArrayEntity(body));
            }
    
            return httpClient.execute(request);
        }
    
        /**
         * Put String
         * @param host
         * @param path
         * @param method
         * @param headers
         * @param querys
         * @param body
         * @return
         * @throws Exception
         */
        public static HttpResponse doPut(String host, String path, String method,
                                         Map<String, String> headers,
                                         Map<String, String> querys,
                                         String body)
                throws Exception {
            HttpClient httpClient = wrapClient(host);
    
            HttpPut request = new HttpPut(buildUrl(host, path, querys));
            for (Map.Entry<String, String> e : headers.entrySet()) {
                request.addHeader(e.getKey(), e.getValue());
            }
    
            if (org.apache.commons.lang.StringUtils.isNotBlank(body)) {
                request.setEntity(new StringEntity(body, "utf-8"));
            }
    
            return httpClient.execute(request);
        }
    
        /**
         * Put stream
         * @param host
         * @param path
         * @param method
         * @param headers
         * @param querys
         * @param body
         * @return
         * @throws Exception
         */
        public static HttpResponse doPut(String host, String path, String method,
                                         Map<String, String> headers,
                                         Map<String, String> querys,
                                         byte[] body)
                throws Exception {
            HttpClient httpClient = wrapClient(host);
    
            HttpPut request = new HttpPut(buildUrl(host, path, querys));
            for (Map.Entry<String, String> e : headers.entrySet()) {
                request.addHeader(e.getKey(), e.getValue());
            }
    
            if (body != null) {
                request.setEntity(new ByteArrayEntity(body));
            }
    
            return httpClient.execute(request);
        }
    
        /**
         * Delete
         *
         * @param host
         * @param path
         * @param method
         * @param headers
         * @param querys
         * @return
         * @throws Exception
         */
        public static HttpResponse doDelete(String host, String path, String method,
                                            Map<String, String> headers,
                                            Map<String, String> querys)
                throws Exception {
            HttpClient httpClient = wrapClient(host);
    
            HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
            for (Map.Entry<String, String> e : headers.entrySet()) {
                request.addHeader(e.getKey(), e.getValue());
            }
    
            return httpClient.execute(request);
        }
    
        private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
            StringBuilder sbUrl = new StringBuilder();
            sbUrl.append(host);
            if (!org.apache.commons.lang.StringUtils.isBlank(path)) {
                sbUrl.append(path);
            }
            if (null != querys) {
                StringBuilder sbQuery = new StringBuilder();
                for (Map.Entry<String, String> query : querys.entrySet()) {
                    if (0 < sbQuery.length()) {
                        sbQuery.append("&");
                    }
                    if (org.apache.commons.lang.StringUtils.isBlank(query.getKey()) && !org.apache.commons.lang.StringUtils.isBlank(query.getValue())) {
                        sbQuery.append(query.getValue());
                    }
                    if (!org.apache.commons.lang.StringUtils.isBlank(query.getKey())) {
                        sbQuery.append(query.getKey());
                        if (!StringUtils.isBlank(query.getValue())) {
                            sbQuery.append("=");
                            sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
                        }
                    }
                }
                if (0 < sbQuery.length()) {
                    sbUrl.append("?").append(sbQuery);
                }
            }
    
            return sbUrl.toString();
        }
    
        private static HttpClient wrapClient(String host) {
            HttpClient httpClient = new DefaultHttpClient();
            if (host.startsWith("https://")) {
                sslClient(httpClient);
            }
    
            return httpClient;
        }
    
        private static void sslClient(HttpClient httpClient) {
            try {
                SSLContext ctx = SSLContext.getInstance("TLS");
                X509TrustManager tm = new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                    public void checkClientTrusted(X509Certificate[] xcs, String str) {
    
                    }
                    public void checkServerTrusted(X509Certificate[] xcs, String str) {
    
                    }
                };
                ctx.init(null, new TrustManager[] { tm }, null);
                SSLSocketFactory ssf = new SSLSocketFactory(ctx);
                ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
                ClientConnectionManager ccm = httpClient.getConnectionManager();
                SchemeRegistry registry = ccm.getSchemeRegistry();
                registry.register(new Scheme("https", 443, ssf));
            } catch (KeyManagementException ex) {
                throw new RuntimeException(ex);
            } catch (NoSuchAlgorithmException ex) {
                throw new RuntimeException(ex);
            }
        }
    }
    

    Feign进行消费

    1.在maven项目中添加依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
        <version>1.2.2.RELEASE</version>
    </dependency>
    

    2.编写接口,放置在service层

    这里的decisionEngine.url 是配置在properties中的 是ip地址和端口号 decisionEngine.url=http://10.2.1.148:3333/decision/person 是接口名字

    @FeignClient(url = "${decisionEngine.url}",name="engine")
    public interface DecisionEngineService {
      @RequestMapping(value="/decision/person",method= RequestMethod.POST)
      public JSONObject getEngineMesasge(@RequestParam("uid") String uid,@RequestParam("productCode") String productCode);
    
    }
    

    3.在Java的启动类上加上@EnableFeignClients

    @EnableFeignClients //参见此处
    @EnableDiscoveryClient
    @SpringBootApplication
    @EnableResourceServer
    public class Application   implements CommandLineRunner {
        private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
        @Autowired
        private AppMetricsExporter appMetricsExporter;
    
        @Autowired
        private AddMonitorUnitService addMonitorUnitService;
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(Application.class).web(true).run(args);
        }    
    }
    

    4.在代码中调用接口即可

    @Autowired
    private DecisionEngineService decisionEngineService ;
    // ...
    decisionEngineService.getEngineMesasge("uid" ,  "productCode");
    
    

    RestTemplate方法

    在Spring-Boot开发中,RestTemplate同样提供了对外访问的接口API,这里主要介绍Get和Post方法的使用。Get请求提供了两种方式的接口getForObject 和 getForEntity,getForEntity提供如下三种方法的实现。

    1.配置RestTemplate

    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
    import org.springframework.http.converter.ByteArrayHttpMessageConverter;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.converter.ResourceHttpMessageConverter;
    import org.springframework.http.converter.StringHttpMessageConverter;
    import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
    import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
    import org.springframework.http.converter.xml.SourceHttpMessageConverter;
    import org.springframework.web.client.RestTemplate;
    
    import java.nio.charset.StandardCharsets;
    import java.util.ArrayList;
    import java.util.List;
    
    @Configuration
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    public class RestTemplateConfig {
    
        // 配置 RestTemplate
        @Bean
        public RestTemplate restTemplate(MappingJackson2HttpMessageConverter jackson2HttpMessageConverter){
            RestTemplate restTemplate = new RestTemplate(simpleClientHttpRequestFactory());
            List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
            StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
            messageConverters.add(stringHttpMessageConverter);
            messageConverters.add(jackson2HttpMessageConverter);
            messageConverters.add(new ByteArrayHttpMessageConverter());
            messageConverters.add(new ResourceHttpMessageConverter());
            messageConverters.add(new SourceHttpMessageConverter<>());
            messageConverters.add(new AllEncompassingFormHttpMessageConverter());
            restTemplate.setMessageConverters(messageConverters);
            return restTemplate;
        }
    
        @Bean
        public HttpComponentsClientHttpRequestFactory simpleClientHttpRequestFactory(){
            // 禁用Cookie回话保持功能
            CloseableHttpClient build = HttpClientBuilder.create().disableCookieManagement().useSystemProperties().build();
            // 创建一个 httpCilent 简单工厂
            HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(build);
            // 设置连接超时
            factory.setConnectTimeout(15000);
            // 设置读取超时
            factory.setReadTimeout(5000);
    
            return factory;
        }
    }
    

    2.注入RestTemplate

    在使用RestTemplate方法的类中注入RestTemplate

        @Autowired
        private RestTemplate restTemplate;
    

    3.Get请求

    getForEntity(Stringurl,Class responseType,Object…urlVariables)

    该方法提供了三个参数,其中url为请求的地址,responseType为请求响应body的包装类型,urlVariables为url中的参数绑定,该方法的参考调用如下:

    // http://USER-SERVICE/user?name={name)
    RestTemplate restTemplate=new RestTemplate();
    Map<String,String> params=new HashMap<>();
    params.put("name","dada");  //
    ResponseEntity<String> responseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={name}",String.class,params);
    

    getForEntity(URI url,Class responseType)

    该方法使用URI对象来替代之前的url和urlVariables参数来指定访问地址和参数绑定。URI是JDK java.net包下的一个类,表示一个统一资源标识符(Uniform Resource Identifier)引用。参考如下:

    RestTemplate restTemplate=new RestTemplate();
    UriComponents uriComponents=UriComponentsBuilder.fromUriString("http://USER-SERVICE/user?name={name}")
        .build()
        .expand("dodo")
        .encode();
    URI uri=uriComponents.toUri();
    ResponseEntity<String> responseEntity=restTemplate.getForEntity(uri,String.class).getBody();
    

    getForObject

    getForObject方法可以理解为对getForEntity的进一步封装,它通过HttpMessageConverterExtractor对HTTP的请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容。getForObject方法有如下:

    getForObject(String url,Class responseType,Object...urlVariables)
    getForObject(String url,Class responseType,Map urlVariables)
    getForObject(URI url,Class responseType)
    

    4.Post请求

    Post请求提供有三种方法,postForEntity、postForObject和postForLocation。其中每种方法都存在三种方法,postForEntity方法使用如下:

    estTemplate restTemplate=new RestTemplate();
    User user=newUser("didi",30);
    ResponseEntity<String> responseEntity=restTemplate.postForEntity("http://USER-SERVICE/user",user,String.class); //提交的body内容为user对象,请求的返回的body类型为String
    String body=responseEntity.getBody();
    

    postForEntity存在如下三种方法的重载,postForEntity中的其它参数和getForEntity的参数大体相同

    postForEntity(String url,Object request,Class responseType,Object... uriVariables)
    postForEntity(String url,Object request,Class responseType,Map uriVariables)
    postForEntity(URI url,Object request,Class responseType)
    

    相关文章

      网友评论

          本文标题:SpringBoot访问外部接口

          本文链接:https://www.haomeiwen.com/subject/cyxfidtx.html