Zusammenfassung: Vor kurzem ist es erforderlich, den Kunden einige erholsame API -Schnittstellen zu bieten. QA verwendet Postman zum Testen, aber die Testschnittstelle von Postman ist ähnlich, aber nicht mit Java -Aufrufen. Deshalb möchte ich ein Programm schreiben, um die erholsame API -Schnittstelle alleine zu testen. Da es HTTPS verwendet, muss ich auch die Verarbeitung von HTTPS berücksichtigen. Da ich Java verwendet habe, um die erholsame Schnittstelle zum ersten Mal anzurufen, muss ich sie noch studieren, daher habe ich natürlich einige Informationen konsultiert.
Analyse: Dieses Problem unterscheidet sich von den Aufrufen zwischen Modulen. Zum Beispiel habe ich zwei Module, das Frontend und das hintere Ende, das Front-End-Display und das Back End bietet Datenunterstützung. Ich habe Hessions verwendet, um die von Back End als Remotedienste bereitgestellten Dienste zu registrieren. Am vorderen Ende kann dieser Remote -Service über diese Art von Remote -Dienst direkt an die Back -End -Schnittstelle eingestellt werden. Dies ist für ein Unternehmen jedoch kein Problem, wenn sein eigenes Projekt stark gekoppelt ist. Wenn Sie jedoch einen solchen Remote -Service bei Kunden registrieren, scheint es nicht gut und die Kopplung ist zu hoch. Daher erwähne ich die folgende Methode.
1. Httpclient
Jeder ist vielleicht mit Httpclient vertraut, ist aber damit nicht vertraut. Es ist damit vertraut, da es beispielsweise eine URL anfordern und dann den Rückgabestatus erhalten und Informationen in die Antwort zurückgeben kann. Heute spreche ich jedoch etwas komplizierter darüber, da das heutige Thema HTTPS ist, das das Problem der Zertifikate oder der Benutzerauthentifizierung betrifft.
Nachdem ich bestätigt hatte, dass ich mithilfe von HTTPClient nach relevanten Informationen gesucht habe und festgestellt habe, dass sich die neue Version von HTTPClient von der alten Version unterscheidet und mit der alten Version kompatibel ist, wird jedoch nicht mehr empfohlen, die alte Version zu verwenden. Viele Methoden oder Klassen wurden als veraltet markiert. Heute werden wir die alte Version 4.2 und die neueste Version 4.5.3 verwenden, um den Code zu schreiben.
Alte Version 4.2
Bedarf an Zertifizierung
Die Verwendung der Zertifikatauthentifizierung wird während der Zertifikatvorbereitungsphase ausgewählt
Paket 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 erweitert httpsclient {public httpsCertifiedClient () {} @Override public void void prepareCertificate () löst Ausnahme aus {// GET den Schlüsselbibliothek Keystore Truststore = Keystore.getInstance (Keystore.GetDefaulttype (); FileInputStream input = new FileInputStream (neue Datei ("c: /Users/zhda6001/downloads/software/xxx.keystore")); // FileInputStream input = new FileInputStream (neue Datei ("c: /Users/zhda6001/downloads/xxx.keyStore")); // Passwort der Schlüsselbibliothek TrustStore.load (Instrengung, "Passwort" .totherArray ()); // Registrieren Sie die Schlüsselbibliothek this.socketfactory = new SSLSOCKETFACTORY (TrustStore); // Überprüfen Sie nicht den Domain -Namen SocketFactory }}Überspringen Sie die Zertifizierung
Die Option zum Überspringen der Authentifizierung während der Zertifikatsvorbereitungsphase ist zu
Paket com.darren.test.https.v42; Java.security.cert.CertificateException; import Java.security.cert.x509certificate; importieren javax.net.ssl.sslcontext; importieren javax.net.ssl.trustmanager; importieren javax.net.ssl.x509trustmanager; import org.apache.http.conn.ssl.sslsocketfactory; public class httpstrustclient erweitert httpsclient {public httpstrustclient () {} @Override public void void prepareCertificate () löst eine Ausnahme aus {// überspringen Zertifikatverifizierung 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; }}; // auf das vertrauenswürdige Zertifikat ctx.init festlegen (NULL, New TrustManager [] {tm}, null); // Die SSL -Socket -Fabrik einlegen und den Hostnamen this.socketfactory = new SSLSOCKETFACTORY (CTX, SSLSOCKETFACTORY.AlL_ALL_HOSTNAME_VERIFIER) nicht überprüfen. }}Zusammenfassen
Jetzt wird festgestellt, dass beide Klassen dieselbe Klasse httpsclient erben und die httpsclient die Defaulthttpclient -Klasse erbelt. Es kann festgestellt werden, dass hier das Muster der Vorlagenmethode verwendet wird.
Paket com.darren.test.https.v42; import org.apache.http.conn.clientConnectionManager; import org.apache.http.conn.scheme.scheme; import org.apache.http.conn.ssl.sslsocketfactory; import org.apache.http.impl.client.defaushttpclient; public abstract class httpsclient erweitert Defaulthttpclient {Protected SSLSocketFactory SocketFactory; / ** * initialisieren httpsclient * * @return return die aktuelle Instanz * @throws Exception */ public httpsclient init () löst Ausnahme aus {this.prepareCertificate (); this.regist (); gib dies zurück; } / ** * Zertifikatsüberprüfung vorbereiten * * @Throws Ausnahme * / public abstract void prepareCertificate () löst Ausnahme aus; / *** Registrieren Sie Protokoll und Port Register, diese Methode kann auch durch Unterklassen neu geschrieben werden Schemeregistry sr = ccm.getschemeregistry (); Sr.register (neues Schema ("Https", 443, SocketFactory)); }} Unten finden Sie die Werkzeugklasse
Paket com.darren.test.https.v42; Import Java.util.ArrayList; importieren java.util.list; import Java.util.map; Java.util.set importieren; import org.apache.http.httpentity; import org.apache.http.httpresponse; import org.apache.http.namevaluepair; import org.apache.http.client.entity.urlencoded forderity; 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 statische endgültige String default_charset = "utf-8"; public static String Dopost (httpsclient httpsclient, String url, map <string, string> paramehea, map <string, string> parambody) löst Ausnahme aus {return Dopost (httpsclient, url, paramheader, parambody, default_charset); } public static String Dopost (httpSclient httpSclient, String -URL, MAP <String> Parameheader, Map <String, String> Parambody, String charSet) löst Ausnahme aus {String result = null; Httppost httppost = new httppost (URL); Setheader (httppost, Parameheaer); setBody (httppost, parambody, charset); Httpresponse response = httpsclient.execute (httppost); if (resentity! = null) {httpentity reentity = response.getEntity (); if (resentity! }} Rückgabeergebnis; } public static String dotget (httpsclient httpSclient, String -URL, MAP <String> Parameheader, Map <String, String> Parambody) löst die Ausnahme aus {return DoGet (httpsclient, url, paramheader, parambody, default_charset); } public static String dagget (httpsClient httpsclient, String -URL, MAP <String> Paramehea, Map <String, String> Parambody, String charSet) löst die Ausnahme aus {String result = null; Httpget httpget = new httpget (URL); SetHeader (httpget, paramHeader); Httpresponse response = httpsclient.execute (httpget); if (response! if (resentity! }} Rückgabeergebnis; } private static void Setheader (httprequestBase -Anforderung, Map <String, String> Paramader) {// Header if (paramheader! = null) {set <string> keyset = paramheader.keyset (); für (String -Schlüssel: Schlüsselset) {Request.AddHeader (Schlüssel, Paramader.get (Schlüssel)); }}} private static void setBody (httppost httppost, map <string, string> parambody, String charset) löst Ausnahme aus {// Setzen Sie den Parameter if (parambody! Set <string> keyset = parambody.keyset (); für (String -Schlüssel: Schlüsselset) {list.add (new BasicNamevaluePair (Schlüssel, parambody.get (Schlüssel))); } if (list.size ()> 0) {urlencodedformentity entity = new urlencodedformentity (list, charset); httppost.setentity (Entity); }}}} Dann gibt es die Testklasse:
Paket com.darren.test.https.v42; import Java.util.hashMap; import Java.util.map; public class httpsclientTest {public static void main (String [] args) löst eine Ausnahme aus {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/gethalth"; Karte <string, string> paramHeader = new HashMap <> (); //paramheader.put("Content-Typ "," application/json "); Paramader.put ("Akzeptieren", "Anwendung/XML"); Karte <string, string> parambody = new HashMap <> (); parambody.put ("client_id", "[email protected]"); parambody.put ("client_secret", "p@ssword_1"); String result = httpsclientUtil.dopost (httpsclient, url, parameheaer, parambody); // String result = httpSclientUtil.doget (httpsclient, url, null, null); System.out.println (Ergebnis); }} Informationen zurückgeben:
<? xml Version = "1.0" coding = "utf-8"?>
<token> jkf8rl0SW+skkflj8rbki5hp1Beqk8prcutzppbinqmykrmxy1kwcjmcft191zpp8vvvv1aghw8oynwjeys 0AxPlugax89ejCownBikccc1uvfyesXHlktcjqyufivjevHreqxjphnclqywp+XSE5OD9X8VKFKK7INNNNTMRZQK7YBTZ /E3U7GSWM/5CVAHFL6O9RQ9CWPXAVZNOHYVNXSOHSZDO+BXATXXA1XPEDLY/8H/UAP4N4DLZDJJ3B8T1XH+Crriom OPXF7C5WKHHTOKEOEXW+XOPQKKKSX5CKWWJPPUGIIFWWF/PAQWG+JUOSVT7QGDPV8PMWJ9DWEWJTDXGUDG == </token>
Neue Version 4.5.3
Bedarf an Zertifizierung
Paket com.darren.test.https.v45; Import Java.io.file; import Java.io.FileInputStream; Import Java.Security.KeyStore; importieren javax.net.ssl.sslcontext; import org.apache.http.conn.ssl.sslconnectionsOcketfactory; import org.apache.http.conn.ssl.sslconnectionsOcketfactory; import org.apache.http.conn.ssl.trustselfSsignedstrategy; import org.apache.http.ssl.sslcontexts; public class httpsCertifiedClient erweitert httpsclient {public httpsCertifiedClient () {} @Override public void void prepareCertificate () löst Ausnahme aus {// GET den Schlüsselbibliothek Keystore Truststore = Keystore.getInstance (Keystore.GetDefaulttype (); FileInputStream instream = new FileInputStream (neue Datei ("c: /Users/zhda6001/downloads/software/xxx.keystore")); // FileInputStream Instream = new FileInputStream (neue Datei ("c: /Users/zhda6001/downloads/xxx.keyStore")); Versuchen Sie {// Passwort der Schlüsselbibliothek treue. } endlich {Enterstream.close (); } SSLContext sslContext = sslContexts.custom (). LoadTrustmaterial (TrustStore, TrustselfSignedstrategy.Instance) .build (); this.connectionsOcketFactory = new SSLConNectionsOCKETFACTORY (SSLCONTEXT); }}Überspringen Sie die Zertifizierung
Paket com.darren.test.https.v45; Java.security.cert.CertificateException; import Java.security.cert.x509certificate; importieren javax.net.ssl.sslcontext; importieren javax.net.ssl.trustmanager; importieren javax.net.ssl.x509trustmanager; import org.apache.http.conn.ssl.sslconnectionsOcketfactory; public class httpstrustclient erweitert httpsclient {public httpstrustclient () {} @Override public void void prepareCertificate () löst eine Ausnahme aus {// überspringen Zertifikatverifizierung 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; }}; // auf ein vertrauenswürdiges Zertifikat ctx.init festlegen (NULL, New TrustManager [] {tm}, null); this.connectionsOcketfactory = new SSLConnectionsConetFactory (CTX); }}Zusammenfassen
Paket 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 erweitert httpclientbuilder {private closeableHttpclient Client; geschützte connectionsConctionsSocketFactory connectionsConetFactory; / ** * initialisieren httpSclient * * @return return die aktuelle Instanz * @throws Exception */ public CloseableHttpclient init () löst eine Ausnahme aus {this.prepareCertificate (); this.regist (); kehre dies zurück. Client; } / ** * Zertifikatsüberprüfung vorbereiten * * @Throws Ausnahme * / public abstract void prepareCertificate () löst Ausnahme aus; / *** Registerprotokoll und Port, diese Methode kann auch durch Unterklassen neu geschrieben werden PlainConnectionsOcketFactory.instance) .register ("https", this.connectionsOcketfactory) .build (); PoolinghttpclientConnectionManager connManager = new PoolinghttpclientConnectionManager (SocketFactoryRegistry); Httpclients.custom (). SetConnectionManager (connmanager); // Erstellen Sie ein benutzerdefiniertes httpclient -Objekt this.client = httpclients.custom (). SetConnectionManager (connmanager) .build (); // CloseableHttpclient Client = httpclients.CreateFault (); }} Werkzeuge:
Paket com.darren.test.https.v45; Import Java.util.ArrayList; importieren java.util.list; import Java.util.map; Java.util.set importieren; 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.urlencoded forderity; 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 statische endgültige String default_charset = "utf-8"; public static String Dopost (httpclient httpclient, String -URL, MAP <String, String> Paramehea, Map <String, String> Parambody) löst eine Ausnahme aus {return dopost (httpclient, url, paramheader, parambody, default_charset); } public static String Dopost (httpclient httpclient, String url, map <string, string> parameheader, map <string, string> parambody, String charSet) löst Ausnahme aus {String result = null; Httppost httppost = new httppost (URL); Setheader (httppost, Parameheaer); setBody (httppost, parambody, charset); Httpresponse response = httpclient.execute (httppost); if (resentity! = null) {httpentity reentity = response.getEntity (); if (resentity! }} Rückgabeergebnis; } public static String dotget (httpclient httpclient, String url, map <string, string> paramehea, map <string, string> parambody) löst die Ausnahme aus {return dagg (httpclient, url, paramheader, parambody, default_charset); } public static String dagget (httpclient httpclient, String url, map <string, String> Parameheader, Map <String, String> Parambody, String charSet) löst die Ausnahme aus {String result = null; Httpget httpget = new httpget (URL); SetHeader (httpget, paramHeader); Httpresponse response = httpclient.execute (httpget); if (response! if (resentity! }} Rückgabeergebnis; } private static void Setheader (httprequestBase -Anforderung, Map <String, String> Paramader) {// Header if (paramheader! = null) {set <string> keyset = paramheader.keyset (); für (String -Schlüssel: Schlüsselset) {Request.AddHeader (Schlüssel, Paramader.get (Schlüssel)); }}} private static void setBody (httppost httppost, map <string, string> parambody, String charset) löst Ausnahme aus {// Setzen Sie den Parameter if (parambody! Set <string> keyset = parambody.keyset (); für (String -Schlüssel: Schlüsselset) {list.add (new BasicNamevaluePair (Schlüssel, parambody.get (Schlüssel))); } if (list.size ()> 0) {urlencodedformentity entity = new urlencodedformentity (list, charset); httppost.setentity (Entity); }}}}}} Testklasse:
Paket 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) löst Ausnahme aus {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/gethalth"; Karte <string, string> paramHeader = new HashMap <> (); Paramader.put ("Akzeptieren", "Anwendung/XML"); Karte <string, string> parambody = new HashMap <> (); parambody.put ("client_id", "[email protected]"); parambody.put ("client_secret", "p@ssword_1"); String result = httpSclientUtil.dopost (httpclient, url, parameheaer, parambody); // String result = httpSclientUtil.doget (httpsclient, url, null, null); System.out.println (Ergebnis); }} Ergebnis:
<? xml Version = "1.0" coding = "utf-8"?>
<token> rxitf9 // 7nxwxjs2cjijyHltvzunvmzxeqtgn0u07Sc9ysjeibpqte3Hcjulkoxpeuyguveyi9jv7/Wi klrzxykc3ospatsm0kcbckPhu0TB2CN/NFZV9FMLUeOWFBDDYZ+N0SEII9K+0GP7920DFENCN17WUJVMC0U2JWVM5FA JQKMILWODXZ6A0DQ+D7DQDJWVCWXBVJ2ILHYIB3PR805VPPMI9ATXRVAKO0ODA006WEJFOFCGYG5P70WPJ5RRBL85V fy9wcvkd1r7j6nvjhxgh2gnimhkjejormJDXW2GKIUSIWSELI/XPSWAO7/CTWNWTNCTGK8PX2ZUB0ZFA == </token>
2. HttpurlConnection
3. Spring's RestTemplate
Andere Methoden werden später ergänzt
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.