一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java 調用Restful API接口的幾種方式(HTTPS)

Java 調用Restful API接口的幾種方式(HTTPS)

2021-04-05 12:37三 豐 JAVA教程

這篇文章主要介紹了Java 調用Restful API接口的幾種方式(HTTPS),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

摘要:最近有一個需求,為客戶提供一些Restful API 接口,QA使用postman進行測試,但是postman的測試接口與java調用的相似但并不相同,于是想自己寫一個程序去測試Restful API接口,由于使用的是HTTPS,所以還要考慮到對于HTTPS的處理。由于我也是首次使用Java調用restful接口,所以還要研究一番,自然也是查閱了一些資料。

分析:這個問題與模塊之間的調用不同,比如我有兩個模塊front end 和back end,front end提供前臺展示,back end提供數據支持。之前使用過Hession去把back end提供的服務注冊成遠程服務,在front end端可以通過這種遠程服務直接調到back end的接口。但這對于一個公司自己的一個項目耦合性比較高的情況下使用,沒有問題。但是如果給客戶注冊這種遠程服務,似乎不太好,耦合性太高。所以就考慮用一下方式進行處理。

一、HttpClient

HttpClient大家也許比較熟悉但又比較陌生,熟悉是知道他可以遠程調用比如請求一個URL,然后在response里獲取到返回狀態和返回信息,但是今天講的稍微復雜一點,因為今天的主題是HTTPS,這個牽涉到證書或用戶認證的問題。
確定使用HttpClient之后,查詢相關資料,發現HttpClient的新版本與老版本不同,隨然兼容老版本,但已經不提倡老版本是使用方式,很多都已經標記為過時的方法或類。今天就分別使用老版本4.2和最新版本4.5.3來寫代碼。

老版本4.2

需要認證

在準備證書階段選擇的是使用證書認證

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.darren.test.https.v42;
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import org.apache.http.conn.ssl.SSLSocketFactory; 
public class HTTPSCertifiedClient extends HTTPSClient { 
  public HTTPSCertifiedClient() {
 
  }
 
  @Override
  public void prepareCertificate() throws Exception {
    // 獲得密匙庫
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    FileInputStream instream = new FileInputStream(
        new File("C:/Users/zhda6001/Downloads/software/xxx.keystore"));
    // FileInputStream instream = new FileInputStream(new File("C:/Users/zhda6001/Downloads/xxx.keystore"));
    // 密匙庫的密碼
    trustStore.load(instream, "password".toCharArray());
    // 注冊密匙庫
    this.socketFactory = new SSLSocketFactory(trustStore);
    // 不校驗域名
    socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  }
}

跳過認證

在準備證書階段選擇的是跳過認證

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.darren.test.https.v42; 
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; 
import org.apache.http.conn.ssl.SSLSocketFactory;
public class HTTPSTrustClient extends HTTPSClient {
  public HTTPSTrustClient() {
 
  }
 
  @Override
  public void prepareCertificate() throws Exception {
    // 跳過證書驗證
    SSLContext ctx = SSLContext.getInstance("TLS");
    X509TrustManager tm = new X509TrustManager() {
      @Override
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
      }
 
      @Override
      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
      }
 
      @Override
      public X509Certificate[] getAcceptedIssuers() {
        return null;
      }
    };
    // 設置成已信任的證書
    ctx.init(null, new TrustManager[] { tm }, null);
    // 穿件SSL socket 工廠,并且設置不檢查host名稱
    this.socketFactory = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  }
}

總結

現在發現這兩個類都繼承了同一個類HTTPSClient,并且HTTPSClient繼承了DefaultHttpClient類,可以發現,這里使用了模板方法模式。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.darren.test.https.v42;
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.impl.client.DefaultHttpClient; 
public abstract class HTTPSClient extends DefaultHttpClient { 
  protected SSLSocketFactory socketFactory;
 
  /**
   * 初始化HTTPSClient
   *
   * @return 返回當前實例
   * @throws Exception
   */
  public HTTPSClient init() throws Exception {
    this.prepareCertificate();
    this.regist();
 
    return this;
  
  /**
   * 準備證書驗證
   *
   * @throws Exception
   */
  public abstract void prepareCertificate() throws Exception;
 
  /**
   * 注冊協議和端口, 此方法也可以被子類重寫
   */
  protected void regist() {
    ClientConnectionManager ccm = this.getConnectionManager();
    SchemeRegistry sr = ccm.getSchemeRegistry();
    sr.register(new Scheme("https", 443, socketFactory));
  }
}

下邊是工具類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.darren.test.https.v42; 
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils; 
public class HTTPSClientUtil {
  private static final String DEFAULT_CHARSET = "UTF-8"
  public static String doPost(HTTPSClient httpsClient, String url, Map<String, String> paramHeader,
      Map<String, String> paramBody) throws Exception {
    return doPost(httpsClient, url, paramHeader, paramBody, DEFAULT_CHARSET);
  }
 
  public static String doPost(HTTPSClient httpsClient, String url, Map<String, String> paramHeader,
      Map<String, String> paramBody, String charset) throws Exception {
 
    String result = null;
    HttpPost httpPost = new HttpPost(url);
    setHeader(httpPost, paramHeader);
    setBody(httpPost, paramBody, charset);
 
    HttpResponse response = httpsClient.execute(httpPost);
    if (response != null) {
      HttpEntity resEntity = response.getEntity();
      if (resEntity != null) {
        result = EntityUtils.toString(resEntity, charset);
      }
    }
 
    return result;
  }
   
  public static String doGet(HTTPSClient httpsClient, String url, Map<String, String> paramHeader,
      Map<String, String> paramBody) throws Exception {
    return doGet(httpsClient, url, paramHeader, paramBody, DEFAULT_CHARSET);
  }
 
  public static String doGet(HTTPSClient httpsClient, String url, Map<String, String> paramHeader,
      Map<String, String> paramBody, String charset) throws Exception {
 
    String result = null;
    HttpGet httpGet = new HttpGet(url);
    setHeader(httpGet, paramHeader);
 
    HttpResponse response = httpsClient.execute(httpGet);
    if (response != null) {
      HttpEntity resEntity = response.getEntity();
      if (resEntity != null) {
        result = EntityUtils.toString(resEntity, charset);
      }
    }
 
    return result;
  }
 
  private static void setHeader(HttpRequestBase request, Map<String, String> paramHeader) {
    // 設置Header
    if (paramHeader != null) {
      Set<String> keySet = paramHeader.keySet();
      for (String key : keySet) {
        request.addHeader(key, paramHeader.get(key));
      }
    }
  }
 
  private static void setBody(HttpPost httpPost, Map<String, String> paramBody, String charset) throws Exception {
    // 設置參數
    if (paramBody != null) {
      List<NameValuePair> list = new ArrayList<NameValuePair>();
      Set<String> keySet = paramBody.keySet();
      for (String key : keySet) {
        list.add(new BasicNameValuePair(key, paramBody.get(key)));
      }
 
      if (list.size() > 0) {
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);
        httpPost.setEntity(entity);
      }
    }
  }
}

然后是測試類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.darren.test.https.v42;
import java.util.HashMap;
import java.util.Map; 
public class HTTPSClientTest { 
  public static void main(String[] args) throws Exception {
    HTTPSClient httpsClient = null;
 
    httpsClient = new HTTPSTrustClient().init();
    //httpsClient = new HTTPSCertifiedClient().init();
 
    String url = "https://1.2.6.2:8011/xxx/api/getToken";
    //String url = "https://1.2.6.2:8011/xxx/api/getHealth";
 
    Map<String, String> paramHeader = new HashMap<>();
    //paramHeader.put("Content-Type", "application/json");
    paramHeader.put("Accept", "application/xml");
    Map<String, String> paramBody = new HashMap<>();
    paramBody.put("client_id", "[email protected]");
    paramBody.put("client_secret", "P@ssword_1");
    String result = HTTPSClientUtil.doPost(httpsClient, url, paramHeader, paramBody);
     
    //String result = HTTPSClientUtil.doGet(httpsClient, url, null, null);
     
    System.out.println(result);
  
}

返回信息:

<?xml version="1.0" encoding="utf-8"?>   
<token>jkf8RL0sw+Skkflj8RbKI5hP1bEQK8PrCuTZPpBINqMYKRMxY1kWCjmCfT191Zpp88VV1aGHW8oYNWjEYS0axpLuGAX89ejCoWNbikCc1UvfyesXHLktcJqyUFiVjevhrEQxJPHncLQYWP+Xse5oD9X8vKFKk7InNTMRzQK7YBTZ/e3U7gswM/5cvAHFl6o9rEq9cWPXavZNohyvnXsohSzDo+BXAtXxa1xpEDLy/8h/UaP4n4dlZDJJ3B8t1Xh+CRRIoMOPxf7c5wKhHtOkEOeXW+xoPQKKSx5CKWwJpPuGIIFWF/PaqWg+JUOsVT7QGdPv8PMWJ9DwEwjTdxguDg==</token> 

新版本4.5.3

需要認證

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.darren.test.https.v45; 
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import javax.net.ssl.SSLContext;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.ssl.SSLContexts; 
public class HTTPSCertifiedClient extends HTTPSClient { 
  public HTTPSCertifiedClient() {
 
  }
 
  @Override
  public void prepareCertificate() throws Exception {
    // 獲得密匙庫
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    FileInputStream instream = new FileInputStream(
        new File("C:/Users/zhda6001/Downloads/software/xxx.keystore"));
    // FileInputStream instream = new FileInputStream(new File("C:/Users/zhda6001/Downloads/xxx.keystore"));
    try {
      // 密匙庫的密碼
      trustStore.load(instream, "password".toCharArray());
    } finally {
      instream.close();
    
    SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, TrustSelfSignedStrategy.INSTANCE)
        .build();
    this.connectionSocketFactory = new SSLConnectionSocketFactory(sslcontext);
  
}

跳過認證

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.darren.test.https.v45; 
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
public class HTTPSTrustClient extends HTTPSClient {
  public HTTPSTrustClient() { 
  }
 
  @Override
  public void prepareCertificate() throws Exception {
    // 跳過證書驗證
    SSLContext ctx = SSLContext.getInstance("TLS");
    X509TrustManager tm = new X509TrustManager() {
      @Override
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
      }
 
      @Override
      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
      }
 
      @Override
      public X509Certificate[] getAcceptedIssuers() {
        return null;
      }
    };
    // 設置成已信任的證書
    ctx.init(null, new TrustManager[] { tm }, null);
    this.connectionSocketFactory = new SSLConnectionSocketFactory(ctx);
  }
}

總結

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.darren.test.https.v45; 
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.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; 
public abstract class HTTPSClient extends HttpClientBuilder {
  private CloseableHttpClient client;
  protected ConnectionSocketFactory connectionSocketFactory;
 
  /**
   * 初始化HTTPSClient
   *
   * @return 返回當前實例
   * @throws Exception
   */
  public CloseableHttpClient init() throws Exception {
    this.prepareCertificate();
    this.regist();
 
    return this.client;
  }
 
  /**
   * 準備證書驗證
   *
   * @throws Exception
   */
  public abstract void prepareCertificate() throws Exception;
 
  /**
   * 注冊協議和端口, 此方法也可以被子類重寫
   */
  protected void regist() {
    // 設置協議http和https對應的處理socket鏈接工廠的對象
    Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", PlainConnectionSocketFactory.INSTANCE)
        .register("https", this.connectionSocketFactory)
        .build();
    PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
    HttpClients.custom().setConnectionManager(connManager);
 
    // 創建自定義的httpclient對象
    this.client = HttpClients.custom().setConnectionManager(connManager).build();
    // CloseableHttpClient client = HttpClients.createDefault();
  }
}

工具類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.darren.test.https.v45; 
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set; 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils; 
public class HTTPSClientUtil {
  private static final String DEFAULT_CHARSET = "UTF-8"
  public static String doPost(HttpClient httpClient, String url, Map<String, String> paramHeader,
      Map<String, String> paramBody) throws Exception {
    return doPost(httpClient, url, paramHeader, paramBody, DEFAULT_CHARSET);
  }
 
  public static String doPost(HttpClient httpClient, String url, Map<String, String> paramHeader,
      Map<String, String> paramBody, String charset) throws Exception {
 
    String result = null;
    HttpPost httpPost = new HttpPost(url);
    setHeader(httpPost, paramHeader);
    setBody(httpPost, paramBody, charset); 
    HttpResponse response = httpClient.execute(httpPost);
    if (response != null) {
      HttpEntity resEntity = response.getEntity();
      if (resEntity != null) {
        result = EntityUtils.toString(resEntity, charset);
      }
    }
 
    return result;
  }
   
  public static String doGet(HttpClient httpClient, String url, Map<String, String> paramHeader,
      Map<String, String> paramBody) throws Exception {
    return doGet(httpClient, url, paramHeader, paramBody, DEFAULT_CHARSET);
  }
 
  public static String doGet(HttpClient httpClient, String url, Map<String, String> paramHeader,
      Map<String, String> paramBody, String charset) throws Exception {
 
    String result = null;
    HttpGet httpGet = new HttpGet(url);
    setHeader(httpGet, paramHeader);
 
    HttpResponse response = httpClient.execute(httpGet);
    if (response != null) {
      HttpEntity resEntity = response.getEntity();
      if (resEntity != null) {
        result = EntityUtils.toString(resEntity, charset);
      }
    }
 
    return result;
  }
 
  private static void setHeader(HttpRequestBase request, Map<String, String> paramHeader) {
    // 設置Header
    if (paramHeader != null) {
      Set<String> keySet = paramHeader.keySet();
      for (String key : keySet) {
        request.addHeader(key, paramHeader.get(key));
      }
    }
  }
 
  private static void setBody(HttpPost httpPost, Map<String, String> paramBody, String charset) throws Exception {
    // 設置參數
    if (paramBody != null) {
      List<NameValuePair> list = new ArrayList<NameValuePair>();
      Set<String> keySet = paramBody.keySet();
      for (String key : keySet) {
        list.add(new BasicNameValuePair(key, paramBody.get(key)));
      }
 
      if (list.size() > 0) {
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);
        httpPost.setEntity(entity);
      }
    }
  }
}

測試類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.darren.test.https.v45; 
import java.util.HashMap;
import java.util.Map;
import org.apache.http.client.HttpClient; 
public class HTTPSClientTest { 
  public static void main(String[] args) throws Exception {
    HttpClient httpClient = null;
 
    //httpClient = new HTTPSTrustClient().init();
    httpClient = new HTTPSCertifiedClient().init();
 
    String url = "https://1.2.6.2:8011/xxx/api/getToken";
    //String url = "https://1.2.6.2:8011/xxx/api/getHealth";
 
    Map<String, String> paramHeader = new HashMap<>();
    paramHeader.put("Accept", "application/xml");
    Map<String, String> paramBody = new HashMap<>();
    paramBody.put("client_id", "[email protected]");
    paramBody.put("client_secret", "P@ssword_1");
    String result = HTTPSClientUtil.doPost(httpClient, url, paramHeader, paramBody);
     
    //String result = HTTPSClientUtil.doGet(httpsClient, url, null, null);
     
    System.out.println(result);
  }
 
}

結果:

<?xml version="1.0" encoding="utf-8"?>   
<token>RxitF9//7NxwXJS2cjIjYhLtvzUNvMZxxEQtGN0u07sC9ysJeIbPqte3hCjULSkoXPEUYGUVeyI9jv7/WikLrzxYKc3OSpaTSM0kCbCKphu0TB2Cn/nfzv9fMLueOWFBdyz+N0sEiI9K+0Gp7920DFEncn17wUJVmC0u2jwvM5FAjQKmilwodXZ6a0Dq+D7dQDJwVcwxBvJ2ilhyIb3pr805Vppmi9atXrVAKO0ODa006wEJFOfcgyG5p70wpJ5rrBL85vfy9WCvkd1R7j6NVjhXgH2gNimHkjEJorMjdXW2gKiUsiWsELi/XPswao7/CTWNwTnctGK8PX2ZUB0ZfA==</token> 

二、HttpURLConnection

三、Spring的RestTemplate

其它方式以后補充

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/zpf336/article/details/73480810

延伸 · 閱讀

精彩推薦
  • JAVA教程Java實現AES/CBC/PKCS7Padding加解密的方法

    Java實現AES/CBC/PKCS7Padding加解密的方法

    這篇文章主要介紹了Java實現AES/CBC/PKCS7Padding加解密的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的...

    Tiro81837732020-08-12
  • JAVA教程java累加和校驗實現方式16進制(推薦)

    java累加和校驗實現方式16進制(推薦)

    下面小編就為大家帶來一篇java累加和校驗實現方式16進制(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

    jingxian6852020-07-05
  • JAVA教程詳解spring boot配置單點登錄

    詳解spring boot配置單點登錄

    本篇文章主要介紹了詳解spring boot配置單點登錄,常用的安全框架有spring security和apache shiro。shiro的配置和使用相對簡單,本文使用shrio對接CAS服務。...

    趙武靈王4602020-09-01
  • JAVA教程Kotlin教程之基本數據類型

    Kotlin教程之基本數據類型

    這篇文章主要介紹了Kotlin教程之基本數據類型的學習的相關資料,需要的朋友可以參考下...

    Losileeya2332020-10-26
  • JAVA教程Java FileDescriptor總結_動力節點Java學院整理

    Java FileDescriptor總結_動力節點Java學院整理

    FileDescriptor 是“文件描述符”??梢员挥脕肀硎鹃_放文件、開放套接字等。接下來通過本文給大家分享Java FileDescriptor總結,感興趣的朋友一起學習吧...

    動力節點4362020-09-29
  • JAVA教程Hibernate+JDBC實現批量插入、更新及刪除的方法詳解

    Hibernate+JDBC實現批量插入、更新及刪除的方法詳解

    這篇文章主要介紹了Hibernate+JDBC實現批量插入、更新及刪除的方法,結合實例形式較為詳細的分析了Hibernate與JDBC針對數據庫的批量操作相關實現技巧,需要的...

    淺淺請留步11952021-01-29
  • JAVA教程詳解spring boot實現websocket

    詳解spring boot實現websocket

    這篇文章主要介紹了詳解spring boot實現websocket,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    劉冬3042020-11-24
  • JAVA教程java實現收藏名言語句臺詞的app

    java實現收藏名言語句臺詞的app

    本文給大家分享的是使用java制作的記錄名人名言臺詞等等讓你難忘的語句的APP的代碼,非常的實用,有需要的小伙伴可以參考下。 ...

    hebedich5352019-12-14
主站蜘蛛池模板: 亚洲香蕉伊在人在线观看9 亚洲系列国产系列 | 亚洲国产精久久久久久久 | 日本一区二区三区在线 视频 | 亚洲国产精品无码中文字幕 | 国产馆在线观看免费的 | 日朝欧美亚洲精品 | 国产精品一区久久精品 | 国产伦精品一区二区三区免 | 国产精品免费aⅴ片在线观看 | 午夜欧美精品久久久久久久久 | 九九影院午夜理论片无码 | 四虎影院大全 | 亚洲欧美日韩另类精品一区二区三区 | 亚洲天堂在线视频观看 | 骚虎最新网址 | 91九色视频无限观看免费 | 成人毛片1024你懂的 | 好大夫在线个人空间 | 女班长的放荡日记高h | 国产精品美女久久久久 | 深夜影院深a | 精品网站一区二区三区网站 | 国产精品嫩草影院一二三区 | 国产欧美一区二区三区免费看 | 青青久久精品国产 | 色综合精品 | 香蕉视频在线观看网址 | 91小视频在线观看免费版高清 | 男人把大ji巴放进女人小说 | 国产精品亚洲精品青青青 | 男女一级特黄a大片 | 午夜伦伦电影理论片大片 | 鄂州一家三口完整版免费 | seetube18日本第一次 | 国产玖玖在线观看 | 五月最新商场女厕所高跟嘘嘘 | 俄罗斯一级在线播放 | 369手机看片| 色哟哟在线视频 | 久久亚洲成a人片 | 欧美三级一区 |