zoukankan      html  css  js  c++  java
  • Java基础/发起http和https请求

    Java中发起http和https请求

    一般调用外部接口会需要用到http和https请求。

    本案例为:前后端完全分离,前端框架(React+Mobx+Nornj),后端(Go语言)。

    面临问题:跨域问题。(线上允许跨域访问)

    解决方案:java发起https请求代理。(起到数据中转作用)

    一。发起http请求

    参考博客:https://blog.csdn.net/guozili1/article/details/53995121

    1。写http请求方法

     1 //处理http请求  requestUrl为请求地址  requestMethod请求方式,值为"GET"或"POST"  
     2     public static String httpRequest(String requestUrl,String requestMethod,String outputStr){  
     3         StringBuffer buffer=null;  
     4         try{  
     5         URL url=new URL(requestUrl);  
     6         HttpURLConnection conn=(HttpURLConnection)url.openConnection();  
     7         conn.setDoOutput(true);  
     8         conn.setDoInput(true);  
     9         conn.setRequestMethod(requestMethod);  
    10         conn.connect();  
    11         //往服务器端写内容 也就是发起http请求需要带的参数  
    12         if(null!=outputStr){  
    13             OutputStream os=conn.getOutputStream();  
    14             os.write(outputStr.getBytes("utf-8"));  
    15             os.close();  
    16         }  
    17           
    18         //读取服务器端返回的内容  
    19         InputStream is=conn.getInputStream();  
    20         InputStreamReader isr=new InputStreamReader(is,"utf-8");  
    21         BufferedReader br=new BufferedReader(isr);  
    22         buffer=new StringBuffer();  
    23         String line=null;  
    24         while((line=br.readLine())!=null){  
    25             buffer.append(line);  
    26         }  
    27         }catch(Exception e){  
    28             e.printStackTrace();  
    29         }  
    30         return buffer.toString();  
    31     }  
    View Code

    2。测试

    1 public static void main(String[] args){  
    2         String s=httpRequest("http://www.qq.com","GET",null);  
    3         System.out.println(s);  
    4     } 
    View Code

    注意:

    1).第一个参数url需要写全地址,即前边的http必须写上,不能只写www.qq.com这样的。

    2).第二个参数是请求方式,一般接口调用会给出URL和请求方式说明。

    3).第三个参数是我们在发起请求的时候传递参数到所要请求的服务器,要传递的参数也要看接口文档确定格式,一般是封装成json或xml.

    4).返回内容是String类,但是一般是有格式的json或者xml。

    二。发起https请求

    https是对链接加了安全证书SSL的,如果服务器中没有相关链接的SSL证书,它就不能够信任那个链接,也就不会访问到了。所以我们第一步是自定义一个信任管理器。自要实现自带的X509TrustManager接口就可以了。

    1。自定义证书信任管理器

     1 import java.security.cert.CertificateException;  
     2 import java.security.cert.X509Certificate;  
     3 import javax.net.ssl.X509TrustManager;  
     4   
     5 public class MyX509TrustManager implements X509TrustManager {  
     6   
     7     @Override  
     8     public void checkClientTrusted(X509Certificate[] chain, String authType)  
     9             throws CertificateException {  
    10         // TODO Auto-generated method stub  
    11   
    12     }  
    13   
    14     @Override  
    15     public void checkServerTrusted(X509Certificate[] chain, String authType)  
    16             throws CertificateException {  
    17         // TODO Auto-generated method stub  
    18   
    19     }  
    20   
    21     @Override  
    22     public X509Certificate[] getAcceptedIssuers() {  
    23         // TODO Auto-generated method stub  
    24         return null;  
    25     }  
    26   
    27 }  
    View Code

    注意:

    1)需要的包都是java自带的,所以不用引入额外的包。

    2.)可以看到里面的方法都是空的,当方法为空是默认为所有的链接都为安全,也就是所有的链接都能够访问到。当然这样有一定的安全风险,可以根据实际需要写入内容。

    2。编写http请求方法

     1 /* 
     2  * 处理https GET/POST请求 
     3  * 请求地址、请求方法、参数 
     4  * */  
     5 public static String httpsRequest(String requestUrl,String requestMethod,String outputStr){  
     6     StringBuffer buffer=null;  
     7     try{  
     8     //创建SSLContext  
     9     SSLContext sslContext=SSLContext.getInstance("SSL");  
    10     TrustManager[] tm={new MyX509TrustManager()};  
    11     //初始化  
    12     sslContext.init(null, tm, new java.security.SecureRandom());;  
    13     //获取SSLSocketFactory对象  
    14     SSLSocketFactory ssf=sslContext.getSocketFactory();  
    15     URL url=new URL(requestUrl);  
    16     HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();  
    17     conn.setDoOutput(true);  
    18     conn.setDoInput(true);  
    19     conn.setUseCaches(false);  
    20     conn.setRequestMethod(requestMethod);  
    21     //设置当前实例使用的SSLSoctetFactory  
    22     conn.setSSLSocketFactory(ssf);  
    23     conn.connect();  
    24     //往服务器端写内容  
    25     if(null!=outputStr){  
    26         OutputStream os=conn.getOutputStream();  
    27         os.write(outputStr.getBytes("utf-8"));  
    28         os.close();  
    29     }  
    30       
    31     //读取服务器端返回的内容  
    32     InputStream is=conn.getInputStream();  
    33     InputStreamReader isr=new InputStreamReader(is,"utf-8");  
    34     BufferedReader br=new BufferedReader(isr);  
    35     buffer=new StringBuffer();  
    36     String line=null;  
    37     while((line=br.readLine())!=null){  
    38         buffer.append(line);  
    39     }  
    40     }catch(Exception e){  
    41         e.printStackTrace();  
    42     }  
    43     return buffer.toString();  
    44 }  
    View Code

    可见和http访问的方法类似,只是多了SSL的相关处理。

    3。测试

    1 public static void main(String[] args){  
    2     String s=httpsRequest("https://kyfw.12306.cn/","GET",null);  
    3     System.out.println(s);  
    4 }  
    View Code

    https的链接一定要进行SSL的验证或者过滤之后才能够访问。

    项目应用:

     1 package com.jd.ofc.trace.web.controller;
     2 
     3 import javax.net.ssl.*;
     4 import java.io.BufferedReader;
     5 import java.io.InputStream;
     6 import java.io.InputStreamReader;
     7 import java.io.OutputStream;
     8 import java.net.URL;
     9 import java.security.cert.CertificateException;
    10 import java.security.cert.X509Certificate;
    11 /**
    12  * 证书信任管理器(用于https请求)
    13  * */
    14 public class MyX509TrustManager1 implements X509TrustManager {
    15     @Override
    16     public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    17 
    18     }
    19 
    20     @Override
    21     public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    22 
    23     }
    24 
    25     @Override
    26     public X509Certificate[] getAcceptedIssuers() {
    27         return new X509Certificate[0];
    28     }
    29 
    30 
    31     /*
    32      * 处理https GET/POST请求
    33      * 请求地址、请求方法、参数
    34      * */
    35     public static String httpsRequest(String requestUrl, String requestMethod, String outputStr){
    36         StringBuffer buffer=null;
    37         try{
    38             //创建SSLContext
    39             SSLContext sslContext=SSLContext.getInstance("SSL");
    40             TrustManager[] tm={new MyX509TrustManager1()};
    41             //初始化
    42             sslContext.init(null, tm, new java.security.SecureRandom());;
    43             //获取SSLSocketFactory对象
    44             SSLSocketFactory ssf=sslContext.getSocketFactory();
    45             URL url=new URL(requestUrl);
    46             HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();
    47 
    48             String cookies="__jdv=XXX";
    49 
    50             conn.setRequestProperty("Authorization","Basic XXX");
    51             conn.setRequestProperty("cookie",cookies);
    52             conn.setDoOutput(true);
    53             conn.setDoInput(true);
    54             conn.setUseCaches(false);
    55             conn.setRequestMethod(requestMethod);
    56             //设置当前实例使用的SSLSoctetFactory
    57             conn.setSSLSocketFactory(ssf);
    58 
    59             conn.connect();
    60             //往服务器端写内容
    61             if(null!=outputStr){
    62                 OutputStream os=conn.getOutputStream();
    63                 os.write(outputStr.getBytes("utf-8"));
    64                 os.close();
    65             }
    66 
    67             //读取服务器端返回的内容
    68             InputStream is=conn.getInputStream();
    69             InputStreamReader isr=new InputStreamReader(is,"utf-8");
    70             BufferedReader br=new BufferedReader(isr);
    71             buffer=new StringBuffer();
    72             String line=null;
    73             while((line=br.readLine())!=null){
    74                 buffer.append(line);
    75             }
    76         }catch(Exception e){
    77             e.printStackTrace();
    78         }
    79         return buffer.toString();
    80        }
    81        
    82        public static void main(String[] args){
    83            String s=httpsRequest("https://xx.xx.com/v3/clusters?limit=-1&sort=name","GET",null);
    84            System.out.println(s);
    85        }
    86     }
    View Code

    三。https的另一种访问方式——导入服务端的安全证书(参照博客,未应用)

  • 相关阅读:
    Fabric简介
    推荐一个在线Markdown编写网站,可转化PDF,DOC格式
    7-独立事件和互不相容(概率论与数理统计学习笔记)
    6- 全概率公式/贝叶斯公式(概率论与数理统计学习笔记)
    5-条件概率/乘法公式(概率论与数理统计学习笔记)
    4-几何概型/频率/公理化(概率论与数理统计学习笔记)
    3-古典概率与排列组合(概率论与数理统计学习笔记)
    PLS-00306: 调用 'SYNCRN' 时参数个数或类型错误
    C# MongoDB 查询,分组,聚合,排序,条件,分页
    MVC + Vue.js 初体验(实现表单操作)
  • 原文地址:https://www.cnblogs.com/kaixinyufeng/p/9105332.html
Copyright © 2011-2022 走看看