Abstrak: Baru -baru ini, ada persyaratan untuk memberi pelanggan beberapa antarmuka API yang tenang. QA menggunakan tukang pos untuk pengujian, tetapi antarmuka uji postman serupa tetapi tidak sama dengan panggilan Java. Jadi saya ingin menulis program untuk menguji antarmuka API yang tenang sendirian. Karena menggunakan HTTPS, saya juga perlu mempertimbangkan pemrosesan HTTPS. Karena saya menggunakan Java untuk memanggil antarmuka yang tenang untuk pertama kalinya, saya masih perlu mempelajarinya, jadi saya secara alami berkonsultasi dengan beberapa informasi.
Analisis: Masalah ini berbeda dari panggilan antar modul. Misalnya, saya memiliki dua modul, ujung depan dan belakang, ujung depan menyediakan tampilan ujung depan, dan ujung belakang menyediakan dukungan data. Saya telah menggunakan Hession untuk mendaftarkan layanan yang disediakan oleh Back End sebagai layanan jarak jauh. Di ujung depan, layanan jarak jauh ini dapat langsung disesuaikan dengan antarmuka ujung belakang melalui layanan jarak jauh ini. Tetapi ini bukan masalah bagi perusahaan untuk digunakan ketika proyeknya sendiri sangat digabungkan. Namun, jika Anda mendaftarkan layanan jarak jauh tersebut dengan pelanggan, tampaknya tidak bagus dan kopling terlalu tinggi. Jadi saya mempertimbangkan untuk menggunakan metode berikut.
1. HttpClient
Setiap orang mungkin terbiasa dengan httpclient tetapi tidak terbiasa dengannya. Ini akrab dengan itu karena dapat menelepon dari jarak jauh, misalnya, meminta URL, dan kemudian mendapatkan status pengembalian dan mengembalikan informasi dalam tanggapan. Namun, hari ini saya membicarakannya sedikit lebih rumit, karena topik hari ini adalah HTTPS, yang melibatkan masalah sertifikat atau otentikasi pengguna.
Setelah mengonfirmasi bahwa menggunakan HTTPClient, saya mencari informasi yang relevan dan menemukan bahwa versi baru HTTPClient berbeda dari versi lama, dan kompatibel dengan versi lama, tetapi tidak lagi disarankan agar versi lama digunakan. Banyak metode atau kelas telah ditandai sebagai usang. Hari ini, kami akan menggunakan versi lama 4.2 dan versi terbaru 4.5.3 untuk menulis kode masing -masing.
Versi lama 4.2
Kebutuhan untuk sertifikasi
Penggunaan otentikasi sertifikat dipilih selama fase persiapan sertifikat
paket com.darren.test.https.v42; impor java.io.file; impor java.io.fileInputStream; impor java.security.keystore; impor org.apache.http.conn.ssl.sslsocketFactory; Kelas publik httpscertifiedClient memperluas httpsclient {public httpscertifiedClient () {} @Override public void preparecertificate () melempar Exception {// Dapatkan KeyStore library truststore = keystore.getInstance (keyStore.getDefaultType ()); FileInputStream input = FileInputStream baru (file baru ("c: /users/zhda6001/downloads/software/xxx.keystore")); // fileInputStream input = new FileInputStream (file baru ("c: /users/zhda6001/downloads/xxx.keystore")); // Kata sandi dari Key Library TrustStore.Load (instream, "password" .tochararray ()); // Daftarkan pustaka kunci this.socketFactory = SSLSockEtFactory baru (trustStore); // Jangan periksa nama domain socketfactory.sethostnameverifier (sslsocketfactory.allow_all_hostname_verifier); }}Lewati sertifikasi
Opsi untuk melewatkan otentikasi selama fase persiapan sertifikat adalah
paket com.darren.test.https.v42; impor java.security.cert.certificateException; impor java.security.cert.x509certificate; impor javax.net.ssl.sslcontext; impor javax.net.ssl.trustManager; impor javax.net.ssl.x509trustManager; impor org.apache.http.conn.ssl.sslsocketFactory; Kelas Publik HttpStrustClient memperluas httpsclient {public httpStrustClient () {} @Override public void preparecertificate () melempar pengecualian {// Skip sertifikat verifikasi sslcontext ctx = sslcontext.getInstance ("tls"); X509TrustManager TM = X509TrustManager () {@Override public void checkClientTrusted (x509certificate [] rantai, string authType) melempar sertifikatException {} @Override public cerata publiccepted (x509certificception {} publictype publiccepted (x509certificed {} rantai publiccepted o.overRICECEPCEPTED (x509certifice {] @override @OncEpercepted oewinExceptipe { @Overlide @OverRICECCEPTED (STRINICECCEPTED (STRINICECCEPLECED {{x509 X509certificate [] getacceptedissuers () {return null; }}; // diatur ke sertifikat tepercaya ctx.init (null, trustManager baru [] {tm}, null); // Letakkan pabrik soket SSL, dan atur untuk tidak memeriksa nama host this.socketfactory = SSLSocketFactory baru (CTX, sslsocketfactory.allow_all_hostname_verifier); }}Meringkaskan
Sekarang ditemukan bahwa kedua kelas mewarisi kelas yang sama httpsclient, dan httpsclient mewarisi kelas defaulthttpclient. Dapat ditemukan bahwa pola metode templat digunakan di sini.
paket com.darren.test.https.v42; impor org.apache.http.conn.clientConnectionManager; impor org.apache.http.conn.scheme.scheme; impor org.apache.http.conn.ssl.sslsocketFactory; impor org.apache.http.impl.client.defaulthttpClient; kelas abstrak publik httpsclient memperluas defaulthttpclient {socketfactory sslsocketfactory sslsocket; / ** * inisialisasi httpsclient * * @Return Mengembalikan instance saat ini * @throws Exception */ public httpsclient init () melempar pengecualian {this.prepareCertificate (); this.regist (); kembalikan ini; } / ** * Mempersiapkan verifikasi sertifikat * * @throws Exception * / Public Abstract void preparecertificate () melempar pengecualian; / *** Daftar protokol dan port, metode ini juga dapat ditulis ulang dengan subkelas*/ void lindung regist () {clientConnectionManager ccm = this.getConnectionManager (); Schemeregistry sr = ccm.getschemeregistry (); sr.register (skema baru ("https", 443, socketfactory)); }} Di bawah ini adalah kelas alat
paket com.darren.test.https.v42; impor java.util.arraylist; impor java.util.list; impor java.util.map; impor java.util.set; impor org.apache.http.httpentity; impor org.apache.http.httpresponse; impor org.apache.http.namevaluepair; impor org.apache.http.client.entity.urlencodedformentity; impor org.apache.http.client.methods.httpget; impor org.apache.http.client.methods.httppost; impor org.apache.http.client.methods.httprequestbase; impor org.apache.http.message.basicnamevaluePair; impor org.apache.http.util.entityutils; kelas publik httpsclientutil {private static final string default_charset = "utf-8"; String statis public dopost (httpsclient httpsclient, string url, peta <string, string> paramheader, peta <string, string> parambody) melempar pengecualian {return dopost (httpsclient, url, paramheader, parambody, default_charset); } public static String dopost (httpsclient httpsclient, string url, peta <string, paramheader, peta <string, string> parambody, string charset) melempar pengecualian {string result = null; Httppost httppost = httpppost baru (url); setheader (httppost, paramheader); setbody (httppost, parambody, charset); Httpresponse respons = httpsclient.execute (httppost); if (resentity! = null) {httpentity resentity = response.getEntity (); if (resentity! = null) {result = entityutils.toString (resentity, charset); }} hasil pengembalian; } public static String doGet (httpsclient httpsclient, string url, peta <string, string> paramheader, peta <string, string> parambody) melempar pengecualian {return doGet (httpsclient, url, paramheader, parambody, default_charset); } public static String doGet (httpsclient httpsclient, string url, peta <string, paramheader, peta <string, string> parambody, string charset) melempar pengecualian {string result = null; Httpget httpget = httpget baru (url); setHeader (httpget, paramheader); Httpresponse response = httpsclient.execute (httpget); if (response! = null) {httpentity resentity = response.getEntity (); if (resentity! = null) {result = entityutils.toString (resentity, charset); }} hasil pengembalian; } private static void setHeader (permintaan httpRequestBase, peta <string, string> paramheader) {// atur header if (paramheader! = null) {set <string> keyset = paramheader.keyset (); untuk (tombol string: keyset) {request.addheader (key, paramheader.get (key)); }}} private static void setBody (httppost httppost, peta <string, string> parambody, string charset) melempar pengecualian {// atur parameter if (parambody! = null) {list <namevaluepair> list = new arraylist <namevaluePair> () (); Set <string> keyset = parambody.keyset (); untuk (tombol string: keyset) {list.add (new BasicNameValUePair (key, parambody.get (key)))); } if (list.size ()> 0) {UrlencodedFormentity entity = new UrlencodedFormentity (List, Charset); httppost.setentity (entitas); }}}} Lalu ada kelas tes:
paket com.darren.test.https.v42; impor java.util.hashmap; impor java.util.map; kelas publik httpsclienttest {public static void main (string [] args) melempar pengecualian {httpsclient httpsclient = null; httpsclient = httpStrustClient baru (). init (); // httpsclient = httpscertifiedClient baru (). init (); String url = "https://1.2.6.2:8011/xxx/api/gettoken"; // string url = "https://1.2.6.2:8011/xxx/api/gethealth"; Peta <string, string> paramheader = new HashMap <> (); //paramheader.put("content-type "," application/json "); paramheader.put ("terima", "aplikasi/xml"); Peta <String, String> parambody = hashmap baru <> (); parambody.put ("client_id", "[email protected]"); parambody.put ("client_secret", "p@ssword_1"); String hasil = httpsclientutil.dopost (httpsclient, url, paramheader, parambody); // Hasil string = httpsclientutil.doget (httpsclient, url, null, null); System.out.println (hasil); }} Informasi Pengembalian:
<? Xml Version = "1.0" encoding = "UTF-8"?>
<token> jkf8rl0sw+skkflj8rbki5hp1beqk8prcutzppbinqmykrmxy1kwcjmcft191zpp88vv1aghw8oynwjeys 0AXPLUGAX89EJCOWNBIKCC1UVFYESXHLKTCJQYUFIVJEVHREQXJPHNCLQYWP+XSE5OD9X8VKFKK7INNTMRZQK7YBTZ /E3U7GSWM/5CVAHFL6O9REQ9CWPXAVZNOHYVNXSOHSZDO+BXATXXA1XPEDLY/8H/UAP4N4DLZDJ3B8T1XH+CRRIOM OPXF7C5WKHHTOKEOEXW+XOPQKKSX5CKWJPPUGIIFWF/PAQWG+JUOSVT7QGDPV8PMWJ9DWEWJTDXGUDG == </token>
Versi baru 4.5.3
Kebutuhan untuk sertifikasi
paket com.darren.test.https.v45; impor java.io.file; impor java.io.fileInputStream; impor java.security.keystore; impor javax.net.ssl.sslcontext; impor org.apache.http.conn.ssl.sslconnectionCocketFactory; impor org.apache.http.conn.ssl.sslconnectionCocketFactory; impor org.apache.http.conn.ssl.trustselfSignedStrategy; impor org.apache.http.ssl.sslcontexts; Kelas publik httpscertifiedClient memperluas httpsclient {public httpscertifiedClient () {} @Override public void preparecertificate () melempar Exception {// Dapatkan KeyStore library truststore = keystore.getInstance (keyStore.getDefaultType ()); FileInputStream instream = new fileInputStream (file baru ("c: /users/zhda6001/downloads/software/xxx.keystore")); // FileInputStream Instream = FileInputStream baru (file baru ("c: /users/zhda6001/downloads/xxx.keystore")); coba {// Kata sandi dari Key Library TrustStore.Load (instream, "Password" .tochararray ()); } akhirnya {enterstream.close (); } SslContext sslcontext = sslcontexts.custom (). LoadTrustMaerial (TrustStore, TrustShanSignedStrategy.Instance) .build (); this.connectionCockeTfactory = SSLConnectionCockEtFactory baru (SSLContext); }}Lewati sertifikasi
paket com.darren.test.https.v45; impor java.security.cert.certificateException; impor java.security.cert.x509certificate; impor javax.net.ssl.sslcontext; impor javax.net.ssl.trustManager; impor javax.net.ssl.x509trustManager; impor org.apache.http.conn.ssl.sslconnectionCocketFactory; Kelas Publik HttpStrustClient memperluas httpsclient {public httpStrustClient () {} @Override public void preparecertificate () melempar pengecualian {// Skip sertifikat verifikasi sslcontext ctx = sslcontext.getInstance ("tls"); X509TrustManager TM = X509TrustManager () {@Override public void checkClientTrusted (x509certificate [] rantai, string authType) melempar sertifikatException {} @Override public cerata publiccepted (x509certificception {} publictype publiccepted (x509certificed {} rantai publiccepted o.overRICECEPCEPTED (x509certifice {] @override @OncEpercepted oewinExceptipe { @Overlide @OverRICECCEPTED (STRINICECCEPTED (STRINICECCEPLECED {{x509 X509certificate [] getacceptedissuers () {return null; }}; // Atur ke sertifikat tepercaya ctx.init (null, trustManager baru [] {tm}, null); this.connectionCocketFactory = SSLConnectionCockEtFactory baru (CTX); }}Meringkaskan
paket com.darren.test.https.v45; impor org.apache.http.config.registry; impor org.apache.http.config.registryBuilder; impor org.apache.http.conn.socket.connectionCocketFactory; impor org.apache.http.conn.socket.plainConnectionCocketFactory; impor org.apache.http.impl.client.closeableHttpClient; impor org.apache.http.impl.client.httpClientBuilder; impor org.apache.http.impl.client.httpClients; impor org.apache.http.impl.conn.poolinghttpClientConnectionManager; kelas abstrak publik httpsclient memperluas httpClientBuilder {private closeableHttpClient Client; ConnectionSocketFactory ConnectionSocketFactory; / ** * inisialisasi httpsclient * * @Return Mengembalikan instance saat ini * @throws Exception */ public closeableHttpClient init () melempar Exception {this.prepareCertificate (); this.regist (); kembalikan ini.client; } / ** * Mempersiapkan verifikasi sertifikat * * @throws Exception * / Public Abstract void preparecertificate () melempar pengecualian; / *** Daftar protokol dan port, metode ini juga dapat ditulis ulang dengan subkelas*/ lindung void regist () {// atur objek yang sesuai dengan protokol http dan https yang menangani socket link factory registry, connectionsockfactory> socketfactoryregistry = registrybuilder. PlainConnectionCocketFactory.Instance) .register ("https", this.connectionCocketFactory) .build (); PoolingHttpClientConnectionManager ConnManager = new PoolingHttpClientConnectionManager (SocketFactoryRegistry); Httpclients.custom (). SetConnectionManager (ConnManager); // Buat objek httpClient khusus this.client = httpclients.custom (). SetConnectionManager (ConnManager) .build (); // closeableHttpClient client = httpclients.createdefault (); }} Peralatan:
paket com.darren.test.https.v45; impor java.util.arraylist; impor java.util.list; impor java.util.map; impor java.util.set; impor org.apache.http.httpentity; impor org.apache.http.httpresponse; impor org.apache.http.namevaluepair; impor org.apache.http.client.httpClient; impor org.apache.http.client.entity.urlencodedformentity; impor org.apache.http.client.methods.httpget; impor org.apache.http.client.methods.httppost; impor org.apache.http.client.methods.httprequestbase; impor org.apache.http.message.basicnamevaluePair; impor org.apache.http.util.entityutils; kelas publik httpsclientutil {private static final string default_charset = "utf-8"; String statis public dopost (httpClient httpClient, string url, peta <string, string> paramheader, peta <string, string> parambody) melempar pengecualian {return dopost (httpclient, url, paramheader, parambody, default_charset); } public static String dopost (httpClient httpclient, string url, peta <string, paramheader, peta <string, string> parambody, string charset) melempar pengecualian {string result = null; Httppost httppost = httpppost baru (url); setheader (httppost, paramheader); setbody (httppost, parambody, charset); Httpresponse respons = httpclient.execute (httppost); if (resentity! = null) {httpentity resentity = response.getEntity (); if (resentity! = null) {result = entityutils.toString (resentity, charset); }} hasil pengembalian; } public static String doGet (httpClient httpClient, string url, peta <string, string> paramheader, peta <string, string> parambody) melempar pengecualian {return doGet (httpclient, url, paramheader, parambody, default_charset); } public static String doGet (httpClient httpclient, string url, peta <string, paramheader, peta <string, string> parambody, string charset) melempar pengecualian {string result = null; Httpget httpget = httpget baru (url); setHeader (httpget, paramheader); Httpresponse respons = httpclient.execute (httpget); if (response! = null) {httpentity resentity = response.getEntity (); if (resentity! = null) {result = entityutils.toString (resentity, charset); }} hasil pengembalian; } private static void setHeader (permintaan httpRequestBase, peta <string, string> paramheader) {// atur header if (paramheader! = null) {set <string> keyset = paramheader.keyset (); untuk (tombol string: keyset) {request.addheader (key, paramheader.get (key)); }}} private static void setBody (httppost httppost, peta <string, string> parambody, string charset) melempar pengecualian {// atur parameter if (parambody! = null) {list <namevaluepair> list = new arraylist <namevaluePair> () (); Set <string> keyset = parambody.keyset (); untuk (tombol string: keyset) {list.add (new BasicNameValUePair (key, parambody.get (key)))); } if (list.size ()> 0) {UrlencodedFormentity entity = new UrlencodedFormentity (List, Charset); httppost.setentity (entitas); }}}}}} Kelas Tes:
paket com.darren.test.https.v45; impor java.util.hashmap; impor java.util.map; impor org.apache.http.client.httpClient; kelas publik httpsclienttest {public static void main (string [] args) melempar pengecualian {httpclient httpclient = null; // httpClient = httpStrustClient baru (). init (); httpClient = httpscertifiedClient baru (). init (); String url = "https://1.2.6.2:8011/xxx/api/gettoken"; // string url = "https://1.2.6.2:8011/xxx/api/gethealth"; Peta <string, string> paramheader = new HashMap <> (); paramheader.put ("terima", "aplikasi/xml"); Peta <String, String> parambody = hashmap baru <> (); parambody.put ("client_id", "[email protected]"); parambody.put ("client_secret", "p@ssword_1"); Hasil string = httpsclientutil.dopost (httpclient, url, paramheader, parambody); // Hasil string = httpsclientutil.doget (httpsclient, url, null, null); System.out.println (hasil); }} hasil:
<? Xml Version = "1.0" encoding = "UTF-8"?>
<oken> rxitf9 // 7nxwxjs2cjijyhltvzunvmzxxeqtgn0u07sc9ysjeibpqte3hcjulskoxpeuyguveyi9jv7/wi Klrzxykc3ospatsm0kcbckphu0tb2cn/nfzv9fmlueowfbdyz+n0seii9k+0gp7920dfencn17wuJvmc0u2jwvm5fa JQKMILWODXZ6A0DQ+D7DQDJWVCWXBVJ2ILHYIB3PR805VPPMI9AtXRVAKO0ODA006WEJFOFCGYG5P70WPJ5RRBL85V FY9WCVKD1R7J6NVJHXGH2GNIMHKJEMJDXW2GKIUSIWSELI/XPSWAO7/CTWNWTNCTGK8PX2ZUB0ZFA == </token>
2. HttpurlConnection
3. Resttemplate Spring
Metode lain akan ditambah nanti
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.