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 frontend dan backend. Frontend menyediakan tampilan frontend dan backend memberikan dukungan data. Saya telah menggunakan Hession untuk mendaftarkan layanan yang disediakan oleh backend sebagai layanan jarak jauh. Di sisi depan, layanan jarak jauh ini dapat langsung disesuaikan dengan antarmuka backend. 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.
Pendahuluan Dasar
Untuk panggilan antarmuka yang tenang, front-end umumnya menggunakan panggilan AJAX, dan back-end dapat menggunakan lebih banyak metode.
Kali ini, tiga jenis diperkenalkan:
1. HttpurlConnection Implementasi
2.HTTPClient Implementasi
3. Resttemplate Spring
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; import java.io.file; impor java.io.fileInputStream; Java.security.keystore; impor org.apache.htpsccerpsccerpleTPLICEDIONEDIONEDOLIONEDIONEDOLIONDIVETCOLIONEDIONDIONDIONDIONDIONDIONDIONDIONDIONDIONDIONDIONDIONDIONDIONDIONDIONDIOND ( {} @Override public void preparecertificate () melempar Exception {// Dapatkan Key Library KeyStore TrustStore = keystore.getInstance (keystore.getDefaultType ()); FileInputStream = FileinputStream ("c: /users/zhda6001/downs. FileInputStream input = new FileInputStream (file baru ("c: /users/zhda6001/downloads/xxx.keystore")); // Kata sandi dari pustaka utama truststore.load (instream, "password" .tochararray ()); // daftarkan pustaka kunci this.socketfactory = new sslsocketfactory (trustStore); // jangan periksa domain name socketfactory.sethostnamevier (sslsocketfactory.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.rustmManRMMMMMANGER ;NAVAX.NAVAX.NAVAX.NETMMANGER.NADMMANGER.NADMMANGER. org.apache.http.conn.ssl.sslsocketfactory; kelas publik httpStrustClient memperluas httpsclient {public httpStrustClient () {} @Override public void preparecertificate () Throws Exception {// Skip Certificate Verificate Verifikasi PUBLIC Sslcontext.getInstance ("tls"); x509trustManager tm = new X509TrustManager () {@OverTIpe public void checkClientTrusted (x509certificate [] rantai, string authtype) lemparan sertifikat [} {} {}@everride void void void void servercer CertificateException {} @Override public x509certificate [] getacceptedissuers () {return null;}}; // diatur ke sertifikat tepercaya ctx.init (null, new trustMet [] {tm}, null);/ Sslsocketfactory (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; import org.apache.http.conn.clientConnectionManager; impor org.apache.http.conn.scheme.scheme; impor org.apache.http.conn.ssl.slslsocketfactory; org.apache.http.impl.client.defaulthtpClient; kelas abstrak publik httpsclient memperluas defaulthttpclient {sslsocketfactory socketfactory @throws (throws; {this.prepareCertificate (); this.regist (); kembalikan ini;}/*** Mempersiapkan verifikasi sertifikat** @Throws Exception*/public abstrak void preparecertificate () melempar pengecualian;/*** Daftarkan protokol dan port, metode ini juga dapat ditulis ulang dengan subkelas*/protected void void () port, metode ini juga dapat ditulis ulang dengan subkelas*/Protected Void () {Metode ini dapat ditulis ulang oleh subkelas*/Protected Void () (Metode) {Metode CLIENGER {) CROWNOGE {) CCCC COVERMANTE () (Metode ini juga dapat ditulis ulang dengan subkelas*/Protected Void (Metode) {) 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; import java.util.arraylist; import java.util.list; import java.util.map; import java.util.set; import org.apache.http.htpentity; impor org.apache.http.htponce; org.apache.http.namevaluepair; import org.apache.http.client.entity.urlencodedfortity; import org.apache.http.client.methods.httpget; import org.apache.http.client.methods.httpget; org.apache.http.client.methods.httprequestbase; impor org.apache.http.message.basicnamevaluepair; Impor org.apache.http.util.entity-clashic; public httpsclientil {private static string final (public- public- public; httpsclient, string url, peta <string, string> paramheader, peta <string, string> parambody) melempar Exception {return dopost (httpsclient, url, paramheader, parambody, string httpsclient, string httpsclient, string paru, string, string httpsclient, string httpsclient, httpsclient, httpsclient, httpsclient, httpsclient, httpsclient, httpsclient) Lempar Pengecualian {String result = null; httppost httppost = new httppost (url); setHeader (httppost, paramheader); setbody (httpppost, parambody, charset); httpresponse response = httpsclient.execute (httppost); ifels = httpsclient.execute (httppost); 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) {// Set 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 {// Set parameters if (parambody! = null) {list <namevaluepair> list = new ArrayList <namevaluePair> (); set <string> keyset = parambody.keyset (); untuk (tombol string: keyset) {list.add (new BasicNeValuepair (key, parambody.get (key))) (list) () (parambody.get (key))) () (list.) (Key, key, parambody.get (key)))) (new baseNeValuepair (key, parambody.get (key)))) (list) (parambody. {UrlencodedFormentity Entity = UrlencodedFormentity baru (Daftar, Charset); httppost.setentity (entitas);}}}Lalu ada kelas tes:
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 = 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 ("tipe konten", "application/json"); paramheader.put ("terima", "aplikasi/xml"); Peta <String, String> parambody = hashmap baru <> (); parambody.put ("client_id", "[email protected]"); parambody.put ("client_secret", "p@sword_1"); hasil httpsclientSclientSclientSclientScliention (httpospost (httpspospient, htlead, htlead, htload, httpsclientutil (htttpsclientsclientsclientsclient (httpsclientsclientsclient (httpsclientSclient (httpsclientSclient 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; import java.security.keystore; import javax.net.ssl.sslcontext; impor org.apache.http.ssl.ssl.ssoncing; 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 () melempar Exception {// Dapatkan Key Library KeyStore TrustStore = keyStore.getInstance (keystore.getDefaultType ()); FileInputStream = FileInputStream ("c:/users/zhda6001/downs. FileInputStream instream = new fileInputStream (file baru ("c: /users/zhda6001/downloads/xxx.keystore")); Coba {// Kata sandi dari pustaka kunci truststore.load (instream, "password" .tochararray ());} akhirnya {instream.close ();} sslcontext sslcontext = sslcontexts.custom (). loadtrustMaterial (trustStore, trustSelfSignedstrategate.instance.instance.instance (trustStoreSelfSignedstrategategy.instance.instance.in). 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.rustmManrager. org.apache.http.conn.ssl.sslconnectionCockeTfactory; kelas publik httpStrustClient memperluas httpsclient {public httpStrustClient () {} @Override public void preparecertificate () melempar pengecualian {// Skip Certificate Verification SPEIPERTIFICED () Sslcontext.getInstance ("tls"); x509trustManager tm = new X509TrustManager () {@OverTIpe public void checkClientTrusted (x509certificate [] rantai, string authtype) lemparan sertifikat [} {} {}@everride void void void void servercer CertificateException {}@Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Override public X509Certificate[] getAcceptedIssuers() {return null;}};// Set to a trusted certificate ctx.init(null, new TrustManager[] {tm}, null); this.connectionCockFactory = SSLConnectionCockFactory (ctx) baru baru (ctx);}}Meringkaskan
Paket com.darren.test.https.v45; import org.apache.http.config.registry; impor org.apache.http.config.registryBuilder; impor org.apache.http.conn.socket.connecticocketfactory; impor; org.apache.http.conn.socket.PlainConnectionCockeTfactory; import org.apache.http.impl.client.closeableHtpClient; import org.apache.aptp.impl.client.htpClientBuilder; impor org.apache.aplient.htpclientbuilder; impor org.apache.apache.htclient.htplientsclientBuilder; import org.apache.apache.htplient.htclient.apclient.apclient.htclient org.apache.http.impl.conn.poolinghttpClientConnectionManager; kelas abstrak publik httpsclient memperluas httpClientBuilder {private closeableHttpclient client * publicrows ** return @pruction @return to @pruction ** expluction @pruction @pruction @pruction @pruction @pruction @return @protectory * CloseableHttpClient init () melempar Exception {this.preparectificate (); this.regist (); return this.client;}/*** Siapkan Verifikasi Sertifikat** @Throws Exception*/Public Abstract Preparecticate () Lempar Pengecualian; Objek yang sesuai dengan protokol http dan https yang menangani socket link factory registry <nectionCocketFactory> socketfactoryregistry = registryBuilder. <nectionCocketFactory> create () .register ("http", plainConnectionCocketFactory.instance) .register ("http", httconnecticycory .build (); poolingHttpClientConnectionManager connmanager = poolingHttpClientConnectionManager (socketFactoryregistry); httpclients.custom (). setConnectionManager (ConnManager); // Buat objek httpclient kustom ini.client = ConnManager); Httpclients.custom (). SetConnectionManager (connmanager) .build (); // closeableHttpclient client = httpclients.createDefault ();}}Peralatan:
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.htpentity; impor org.apache.http.htponse; Impor org.apache.http.htponce; org.apache.http.namevaluepair; impor org.apache.http.client.httpClient; import org.apache.http.client.entity.urlencodedfortity; impor org.apache.htp.client.methods.htpget; org.apache.htp.client.methods.htpget; Impor. org.apache.http.client.methods.httprequestbase; impor org.apache.http.message.basicnamevaluepair; Impor org.apache.http.util.entity-clone; httpclient, string url, peta <string, string> paramheader, peta <string, string> parambody) melempar pengecualian {return dopost (httpclient, url, paramheader, parambody, string parkin, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, httpclient, string paru (httpclient httpClient, string paru, httpclient, httpclient httpclient, httpclient, httpClient, httpClient, httpclient, httpClient, httpclient, httpclient paru); Lempar Pengecualian {String result = null; httppost httppost = new httppost (url); setHeader (httppost, paramheader); setbody (httpppost, parambody, charset); httpresponse response = httpclient.execute (httppost); ifels = httpclient.execute (httppost); 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 dentity = response.getEntity (); if (resentity! = null) {result = entityutils.toString (resentity, charset);} hasil pengembalian;} private static afteHeHeHeMer (ParameHeHeHeHeHeHeHeHeHeHeHeHeHeHeMer (charset);} Return result;} private static static (ParameHeMer (ParameHeHeHeHeHeMer (papeMereMer); {// atur 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 {// Set parameters if (paramBody != null) {List<NameValuePair> list = new ArrayList <namevaluePair> (); set <string> keyset = parambody.keyset (); for (Key string: keyset) {list.add (new BasicNamEvaluePair (key, parambody.get (key))); if (list.size ()> 0) {Urlencodedforment (listoded = newfority = newforities (list. charset); httppost.setentity (entitas);}}}}Kelas Tes:
Paket com.darren.test.https.v45; import java.util.hashmap; import java.util.map; impor org.apache.http.client.httpClient; httpsclienttest {public static main (string []) throws {httpclient {http void main (string []) wrows {httpclient {http void public main (string []) throws class {httpclient void main (string []) arclient {httpclient {httpclient {http void main (string []) {httpClient {httpclient {http void main (string []) 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 = hashmap baru <> (); paramheader.put ("terima", "application/xml"); peta <string, string> parambody = hashmap baru <> (); parambody.put ("client_id", "[email protected]"); PARAMBODY.PUT "" " Httpsclientutil.dopost (httpclient, url, paramheader, parambody); // string hasil = 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
@ControllerPublic Class RestfulAction {@Autowired Private UserServerService UserService; // Modify @RequestMapping (value = "put/{param}", Method = requestMethod.put) public @ResponseBody string (@pathvariable string param) {return "put:" + param;} @@pathvariable param) {put: " + Param;} @@pathvariable param) {put:" + Param;} @pathvariable param) {poT " RequestMethod.post) public @ResponseBody String Post (@PathVariable string param, string id, name string) {System.out.println ("id:"+id); System.out.println ("name:"+name); return "post:"+param;} // delete @requestmapping (value = "delete/delete/param; @ResponseBody String delete (@pathvariable string param) {return "delete:" + param;} // find @RequestMapping (value = "get/{param}, method = requestMethod.get) public @ResponseBody get (@pathvariable string param) {return" get: " + param;} get (@pathvariable string param) {get" get: " + param; @RequestMapping (value = "dealcon/{param}") public @ResponseBody String dealcon (@pathvariable string param) {coba {string url = "http: // localhost: 8080/tao-manager-web/"; url+= (param+"/xxx"); Url-rest estingan/"; Url+= (param+"/xxx "); Url-Rest Urung/"; httpconnection = (httpurlconnection) restserviceurl .openconnection (); // param masukkan huruf kecil dan konversinya untuk mendapatkan post delete letakkan httpconnection.setRequestMethod (param.touppercase ()); // httpconnection.setRequestProperty (")); // httpconnection.setRequesty (" "" " "Application/JSON"); if ("Post" .Equals (param)) {// Buka sakelar output httpconnection.setDoOutput (true); // httpconnection.setSetDoInput (true); // lewati string parameter input = "& id ="+ urlencoder.encode ("abc", "" URLEncoder.encode("Ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh httpconnection.getoutputStream (); outputStream.write (input.getbytes ()); outputStream.flush ();} if (httpconnection.getResponsecode ()! = 200) {throw runtimeeException baru (" httpConnection.getResponsecode ());} bufferedReader responseBuffer = BufferedReader baru (inputStreamReader baru ((httpconnection.getInputStream ())); output; output.out.println ("output dari server: /n"); while (while) (output = output. {System.out.println (output);} httpconnection.disconnect ();} catch (MalFormedurlexception e) {e.printStackTrace ();} catch (ioException e) {e.printstacktrace ();} return "Success";}}3. Resttemplate Spring
springmvc.xml ditambahkan
<!-Konfigurasikan restemplate-> <!-http factory klien-> <bean id = "httpclientfactory"> <name properti = "connecttimeout" value = "10000" /> <name properti = "readTimeOut" value = "10000" /< /bean> <!-resttemple —tupplate-<bean iD = " Ref = "httpClientFactory" /> </ bean>
pengontrol
@ControllerPublic kelas resttemplateAction {@Autowired private resttemplate template; @RequestMapping ("resttem") public @ResponseBody User restTem (Metode String) {User User = null; // temukan ("get" .Equals (Method)) {User = TemplePate.gegor; "http: // localhost: 8080/tao-manager-web/get/{id}", user.class, "wuwuwuwu"); // Perbedaan antara GetForEntity dan GetForObject adalah bahwa Anda bisa mendapatkan nilai pengembalian dan status, informasi header, responentity <user> RE = Templat. GetForEntity ("http: // localhost: 8080/tao-manager-web/get/{id}", user.class, "wuwuwuwuwuwu"); System.out.println (re.getstatusCode ()); System.out.println (re.getbody (). ("post".equals(method)) {HttpHeaders headers = new HttpHeaders();headers.add("X-Auth-Token", UUID.randomUUID().toString());MultiValueMap<String, String> postParameters = new LinkedMultiValueMap<String, String>();postParameters.add("id", "Ahhhhh"); postparameters.add ("name", "parsial version"); httpentity <multivaluemap <string, string >> requestEntity = httpentity baru <multivaluemap <string, string >> (postparameter, header); user = Template.postforObject ( "http: // localhost: 8080/tao-manager-web/post/aaa", permintaan, user.class); // hapus} else if ("delete" .Equals (Metode)) {Template.Delete ("http: // localhost: 8080/tao-web/delete/{{{{{8080/tao-" lain if if ("put" .equals (method)) {template.put ("http: // localhost: 8080/tao-manager-web/put/{id}", null, "bbb");} return user;}}Di atas adalah seluruh konten artikel ini tentang membahas secara singkat cara Java menyebut antarmuka API yang tenang. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait Java lainnya di situs web ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!