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 Frontend und Backend. Frontend bietet Frontend Display und Backend bietet Datenunterstützung. Ich habe Hession verwendet, um die von Backend als Remotedienste bereitgestellten Dienste zu registrieren. Auf der Frontend -Seite kann dieser Remote -Service direkt an die Backend -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.
Grundlegende Einführung
Für den Anruf der erholsamen Schnittstelle verwendet das Front-End im Allgemeinen Ajax Call, und das Back-End kann mehr Methoden verwenden.
Diesmal werden drei Typen eingeführt:
1.HttpurlConnection -Implementierung
2.Httpclient Implementierung
3. Spring's RestTemplate
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; HttpsCertifiedClient () {} @Override public void prepareCertificate () löst die Ausnahme aus {// Die Schlüsselbibliothek Keystore TrustStore = Keystore.getInstance (keyStore.getDefaultType ()); FileInputStream Input = new FileputStream (New (New Datei ("c: /users/zhda6001/downloads/software/xxx.keystore"); // FileInputStream input = new FileInputStream (neue Datei ("c: /Users/zhda6001/downloads/xxx.keystore"); // Kennwort der Schlüsselbibliothek TrustStore.load (Instrom, "Passwort" .toCharArray ()); // Die Schlüsselbibliothek that.socketfactory = new sslsocketfactory (TrustStore); // Überprüfen Sie den Domänennamen nicht -SocketFactory.SethostnameVerifier (SSLSOCKETFACTFACTORYÜberspringen Sie die Zertifizierung
Die Option zum Überspringen der Authentifizierung während der Zertifikatsvorbereitungsphase ist zu
Paket com.darren.test.https.v42; import Java.security.cert.CertificateException; importieren java.security.x509certificate; importieren javax.net.ssl.slcontext; org.apache.http.conn.ssl.sslsocketfactory; public class httpstrustclient erweitert Httpsclient {public httpstrustclient () {} @Override public void prepareCertificate () Ausnahme {// Skurpuls Verification 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 Oder Sslsocketfactory.allow_all_hostname_verifier);}}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; org.apache.http.impl.client.defaulthttpclient; public abstract class httpsclient verlängert Defaulthttpclient {Protected SSLSOCKETFACTORTORY FACTKETFACTORTORY;/** * Initialize httpSclient * @retsurn die aktuelle Instanz * @throws */public htttpSclient Init. {this.preeReCertificate (); this.regist (); return this;}/*** Zertifikatsüberprüfung** @Throws Exception*/public abstract void prepareCertificate () löst eine Ausnahme aus;/*** Registrieren Sie das Protokoll und die Portion, diese Methode kann auch durch Unterklasse*/Protected Regist () {) {) {) {) {) {) {) {{{) {{{{) {{{{) {{{) {{{{{) {{{{) {{{{{) {{{{) {{{{{) {{{{) {{{{{{) {clientcnectenMunctten, aus. this.getConnectionManager (); 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; Import Java.util.List; Import Java.util.map; Import Java.util.set; import org.apache.http.httpentity; import org.apache org.apache.http.namevalueepair; import org.apache.http.client.entity.urlencodedforMention; org.apache.http.client.methods.httprequestbase; import org.apache.http.message.basicnamevaluepair; Dopost (httpsclient httpsclient, String url, map <string, string> parameheader, map <string, string> parambody löst Ausnahme aus {return dopost (httpsclient, url, paramheader, parambody, default_charset); Parambody, String charset) löst die Ausnahme aus {String -Ergebnis = null; httppost httppost = new httppost (url); response.getEntity (); if (resentity! = null) {result = enttityutils.toString (RESENTITY, CHARSET);}} return Ergebnis;} public static String dagget (httpsclient httpsclient, String url, map <String> parameheader, map <String> parambody) throws oder Default_charset);} public static String dagget (httpsclient httpSclient, String url, map <String> Paramehea, Map <String> Parambody, String charSet) löst Ausnahme aus {String -result = null; httpget httpget = new httpGet (url); httpsclient.execute (httpget); if (response! = null) {httpentity resentity = response.getEntity (); if (resentity! {// Header if (paramheader! (parambody! Urlencodedformentity (Liste, charset); httppost.setentity (Entity);}}}}Dann gibt es die Testklasse:
Paket com.darren.test.https.v42; import Java.util.hashMap; Import Java.util.Map; öffentliche Klasse httpsclientTest {public static void main (String [] args) Ausnahme {httpsclient 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"); Paramader.put ("Akzeptieren", "Anwendung/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 (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; org.apache.http.conn.ssl.slconnectionsOcketfactory; org.apache.http.conn.SSL.Trustssignedstrategy; Oder FileInputStream instream = new FileInputStream (neue Datei ("c: /Users/zhda6001/downloads/xxx.keystore")); Versuchen Sie {// Passwort der Schlüsselbibliothek treue. this.connectionsOcketfactory = new SSLConnectionsOCKETFACTORY (SSLCONTEXT);}}Überspringen Sie die Zertifizierung
Paket com.darren.test.https.v45; import Java.security.cert.CertificateException; importieren java.security.x509certificate; importieren javax.net.ssl.slcontext; org.apache.http.conn.ssl.slconnectionsocketfactory; public class httpstrustclient erweitert httpsclient {public httpstrustclient () {} @Override public void prepareCertificate () Ausnahme {// slip Certifical Versification 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 Oder null); this.connectionsOcketfactory = new SSLConnectionsOCKETFACTORY (CTX);}}Zusammenfassen
Paket com.darren.test.https.v45; import org.apache.http.config.registry; import org.apache.http.config.registryBuilder; org.apache.http.conn.socket.PlainConnectionsocketFactory; import org.apache.http.impl.client.closenableHttpclient; org.apache.http.impl.conn.poolinghttpclientConnectionManager; öffentliche abstrakte Klasse httpsclient erweitert httpclientbuilder {private clodableableaShttpclient Client; geschützte connectioncted ConnectionsSocketFactory connectionsSocketFactFactory. CloseableHttpclient init () löst eine Ausnahme aus {this.preeRecertificate (); this.regist (); return this.client;}/*** Zertifikatverifizierung vorbereiten** @Throws Exception*/public abstract void void präparaturecertificate () wirft Ausnahme aus. entsprechend Protokoll HTTP und HTTPS, die die Socket Link Factory -Registrierung verarbeiten <ConbonctionsSocketFactory> socketFactoryRegistry = RegistryBuilder. .build (); PoolinghttpclientConnectionManager connManager = new PoolinghttpconConnectionManager (SocketFactoryRegistry); httpclients.custom (). Httpclients.custom (). SetConnectionManager (connManager) .build (); // CloseableHttpclient Client = httpclients.CreateFault ();}}Werkzeuge:
Paket 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 org.apache.http.namevaluepair; import org.apache.http.client.httpclient; import org.apache.http.client.entity.urlencodedformentity; importieren org.apache.http.client.methods.httpget; org.apache.http.client.methods.httppost; import org.apache.http.client.methods.httprequestbase; import org.apache.http.message.basicnamevaluepair; import.htttp.util. Default_charset = "utf-8"; öffentlicher statischer String-Dopost (httpclient httpclient, String url, map <String, String> Paramader, Map <String> Parambody) löst Ausnahme aus {return dopost (httpclient, url, paramheader, parambody, Default_charset); Karte <String, String> Parameheader, Map <String, String> Parambody, String charset) löst Ausnahme aus {String result = null; httppost httppost = new httppost (url); ! DOGGE (httpclient, URL, Paramader, Parambody, default_charset);} public static String dagget (httpclient httpclient, String url, map <string> paramheader, map <string> parambody, string charset) löst Ausnahme aus {String result = null; Httpget (url); Setheader (httpget, paramHeader); Ergebnis;} private statische void Setheader (httprequestBase Request, 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> parambody, String charset) löst Ausnahme {// Set Parameter if (parambody! ArrayList <NameValuePair> (); set <string> keyset = parambody.keySet (); für (String -Schlüssel: Keyset) {list.add (new BasicNamevaluePair (Schlüssel, parambody.get (key));} if (list.Size ()> 0) {urlencoded formoded formoded -enttity = new urlencodedCodedward (list, liste charSet); httppost.setentity (Entity);}}}}Testklasse:
Paket com.darren.test.https.v45; import Java.util.hashMap; import Java.util.map; import org.apache.http.client 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 <> (); Parameheader.put ("Akzeptieren", "Anwendung/xml"); MAP <String, String> parambody = new HashMap <> (); parambody.put ("client_id", "[email protected]"); HttpsclientUtil.dopost (httpclient, url, paramHeader, 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
@Controllerpublic class RestfulAction {@Autowired private UserService userService;// Modify @RequestMapping(value = "put/{param}", method = RequestMethod.PUT) public @ResponseBody String put(@PathVariable String param) {return "put:" + param;}// Add @RequestMapping(value = "post/{param}", method = RequestMethod.Post) public @ResponseBody String Post (@PathVariable String Param, String -ID, String -Name) {System.out.println ("ID:"+id); @ResponseBody String Delete (@PathVariable String Param) {return "delete:" + param;} // find @RequestMapPing (value = "get/{param}", method = requestMethod.get) public @Resp Body String (@PathVariable String param) {return: " + param;} // HtttpurlcnaChing -Methods Die RESTFAFFFFAFFFACE // // // // HTTPURLEL -MITTRAGE" Die Absagen: "CALL // // HTTTPURLAUS -MITTEL. @RequestMapping (value = "DealCon/{param}") public @RespondeBody String DealCon (@PathVariable String Param) {try {string url = "http: // localhost: 8080/tao-Manager-web/"; url+= (param+"/xxx"); url-/uRl-rastServiceurl = New URL); httpConnection = (httpurlConnection) rastServiceUrl .OpenConNection (); // Param In -Kleinbuchstaben und konvertieren sie, um post löschen zu erhalten. "application/json"); if ("post" .equals (param)) {// den Ausgangsschalter httpConnection.setDooutput (true); // httpconnection.setDoInput (true); // die Parameter String Input = "& id ="+ urlencoder.encod ("abcde" utf-8 "); URLEncoder.encode("Ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh httpConnection.getOutputStream (); outputStream.write (input.getBytes ()); outputStream.flush ();} if (httpconnection.getResponSecode ()! = 200) {throw New RunTimeException ("http -Anforderung fehlgeschlagen mit Fehlercode:" + httpConnektion (); responseBuffer = new bufferedReader (neuer InputStreamReader ((httpConnection.getInputStream ()); String Output; System.out.println ("Output von Server: /n"); while (outputbuffer.Readline ()! = null). (Malformaledurlexception E) {e.printstacktrace ();} catch (ioException e) {e.printstacktrace ();} return "Erfolg";}}3. Spring's RestTemplate
springmvc.xml hinzugefügt
<!-restTemplate konfigurieren-> <!-http client factory-> <bean id = "httpclientFactory"> <Eigenschaft name = "ConnectTimeout" value = "10000" /> <Eigenschaft name = "readTimeOut" value = "10000" /> < /bean> <! ref = "httpclientFactory" /> < /bean>
Regler
@ControllerPublic Class rastTemPlateAction {@autowired private restTemplate -Vorlage; @RequestMapping ("restTem") public @RespondenBody User Resttem (String -Methode) {user user = null; // find if ("Get" .equals (Methode) {user = template.getForObject (". "http: // localhost: 8080/tao-Manager-web/get/{id}", user.class, "wuwuwuwu"); // Der Unterschied zwischen GetForentity und GetForObject besteht darin, dass Sie den Rückgabewert und den Status, die Headerinformationen, die Reaktionsabteilung <Benutzer> re = Vorlagen erhalten können. getForentity ("http: // localhost: 8080/tao-Manager-web/get/{id}", user.class, "wuwuwuwuwuwu"); . "Ahhhhhh"); postparameters.add ("name", "partielle Version"); "http: // localhost: 8080/tao-Manager-web/post/aaa", RequestEntity, user.class); // delete} else if ("delete" .equals (Methode)) {template.delete ("http: // localhost: 8080/tao-Manager-web/delete/{id}", "aaa"); // modify} else if ("put" .equals (Methode)) {template.put ("http: // localhost: 8080/tao-Manager-Web/put/{id}", null, "bbb");} return user;}}Das obige ist der gesamte Inhalt dieses Artikels über kurz darüber, wie Java die erholsame API -Schnittstelle nennt. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere Java -bezogene Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!