Аннотация: Недавно существует необходимость предоставить клиентам некоторые спокойные интерфейсы API. QA использует Postman для тестирования, но тестовый интерфейс почтальона похож, но не такой же, как вызовы Java. Поэтому я хочу написать программу, чтобы самостоятельно проверить интерфейс API Restful. Поскольку он использует HTTPS, мне также необходимо рассмотреть обработку HTTPS. Поскольку я использовал Java, чтобы впервые позвонить в Restful Interface, мне все еще нужно изучить его, поэтому я, естественно, проконсультировался с некоторой информацией.
Анализ: эта проблема отличается от вызовов между модулями. Например, у меня есть два модуля -фронта и бэкэнд. Frontend обеспечивает фронтальный дисплей, а бэкэнд обеспечивает поддержку данных. Я использовал Hession для регистрации услуг, предоставляемых Backend в качестве удаленных услуг. На стороне фронта эта удаленная служба может быть напрямую отрегулирована на бэкэнд -интерфейс. Но это не проблема для компании, когда его собственный проект сильно связан. Однако, если вы зарегистрируете такой удаленный сервис с клиентами, это кажется не хорошим, а связь слишком высока. Поэтому я рассматриваю использование следующего метода.
Основное введение
Для звонка Retfful Interface, фронт-END обычно использует вызов Ajax, а задний день может использовать больше методов.
На этот раз представлены три типа:
1.httpurlConnection реализация
2.httpclient реализация
3. Spring's Resttemplate
1. httpclient
Каждый может быть знаком с httpclient, но это незнакомо с этим. Он знаком с ним, потому что он может удаленно вызовать, например, запросить URL, а затем получить статус возврата и возвращать информацию в ответе. Тем не менее, сегодня я говорю об этом немного сложнее, потому что сегодняшняя тема - HTTPS, которая включает в себя проблему сертификатов или аутентификации пользователей.
После подтверждения того, что использование httpclient я искал соответствующую информацию и обнаружил, что новая версия httpclient отличается от старой версии и совместима со старой версией, но больше не рекомендуется использовать старую версию. Многие методы или классы были помечены как устаревшие. Сегодня мы будем использовать старую версию 4.2 и последнюю версию 4.5.3, чтобы написать код соответственно.
Старая версия 4.2
Потребность в сертификации
Использование аутентификации сертификата выбирается на этапе подготовки сертификата
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 {// Получить ключевые библиотеки TrustStore = keyStore.getInstance (keyStore.getDefaultType ()); FileInputStream = new FileInputStream (новый файл ("//SERS/zhda6001/downloads/software/kex.key.keoststor"); FileInputStream input = new FileInputStream (New File ("c: /Users/zhda6001/downloads/xxx.keystore")); // пароль библиотеки ключей TrustStore.load (instream, "password" .tchararray ()); // Зарегистрировать библиотеку ключей this.socketfactory = new sslsocketfactory (trustStore); // не проверяйте доменное имя socketFactory.sethostNameverifier (sslSocketFactorПропустить сертификацию
Возможность пропустить аутентификацию на этапе подготовки сертификата -
пакет com.darren.test.https.v42; import java.security.cert.certificateexception; import java.security.cert.x509certificate; import javax.net.ssl.sslcontext; import.net.net.trustmanager; import javax.net.ssl.x509trustmanager; org.apache.http.conn.ssl.sslsocketfactory; public class httpstrustclient расширяется httpsclient {public httpstrustclient () {} @override public void preparecertificate () исключает {// skip serficate 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 {} @Override public x509certificate [] getAcceptEdissuers () {return null;}}; // Установлен на доверенный сертификат ctx.init (null, new Trustmanager [] {tm}, null); // Поместить SSL Socket Factory, и не проверять имя хоста. Sslsocketfactory.ally_all_hostname_verifier);}}Суммировать
Теперь обнаружено, что оба класса наследуют один и тот же класс httpsclient, и httpsclient наследуют класс Defaulthttpclient. Можно найти, что здесь используется шаблон метода шаблона.
Пакет com.darren.test.https.v42; import org.apache.http.conn.clientconnectionmanager; import org.apache.http.conn.scheme.scheme; import org.apache.http.conn.ssl.sskecefactor; org.apache.http.impl.client.defaulthttpclient; public abstract class httpsclient extends defaulthtttpclient {protected sskocketfactory socketfactory;/** * Инициализируйте httpsclient * * @return возвращать текущий экземпляр * @Throw {this.prepareCertificate (); this.Regist (); return this;}/*** Подготовка проверки сертификата** @Throhs Exception*/public Abstract void PrepareCertificate () бросает исключение;/*** Зарегистрировать протокол и порт, этот метод также может быть перезаписывается подклассесами*/Protected void regist () {clientCONNECTIO this.getConnectionManager (); SchemereGistry Sr = ccm.getschemeregistry (); sr.register (новая схема ("https", 443, socketfactory));}}Ниже приведен класс инструментов
пакет 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; импорт org.apache.http.httpress org.apache.http.namevaluepair; import org.apache.http.client.entity.urlencodedformentity; import org.apache.http.client.methods.httpget; импорт org.apache.http.client.methods.httpget; org.apache.http.client.methods.httprequestbase; import org.apache.http.message.basicnamevaluepair; import org.apache.http.util.entityutils; public class httpsclientutil {private static final strice default_charset = "utf-8"; Dopost (httpsclient httpsclient, строки URL, Map <String> ParamheDer, Map <String, String> Parampody) Throws Exception {return dopost (httpsclient, url, paramheader, parampody, default_charset);} public Static String dopost (httpsclient httpsclient, string url, string jrl, string jrl, string, mapstememe, string, string, string, string, string, mapstemed, string jrl. String> parambody, string charset) throws exection {string result = null; httppost httppost = new httppost (url); setheader (httppost, paramheader); setbody (httppost, parampody, charset); httpresponse response = httpsclient.execute (httpost); redentity = response.getentity (); if (reventity! = null) {result = entityutils.tostring (rewentity, charset);}} return result;} public Static String Doget (httpsclient httpsclient, string url, map <string> parameheader, map <string> parumbody). ParamheHeDer, parambody, default_charset);} public Static String Doget (httpsclient httpsclient, string url, map <string, string> paramheader, map <string> parambody, string charset) throws exception {string result = null; httpget httpget = new httpget (url); sethead = httpget httpget = new httpget (url); paramheader); httpresponse response = httpsclient.execute (httpget); if (response! = null) {httpentity vederity = response.getentity (); if (ventity! = nul Setheader (httprequestbase -запрос, map <string, string> paramheader) {// установить заголовок if (paramheader! = null) {set <string> keyset = paramheader.keyset (); for (string key: keyset) {request.addheader (key, paramheader.get (key); Map <string, string> parampody, string charset) throws exception {// set parametsers if (parampody! = Null) {list <namevaluepair> list = new ArrayList <namevaluepair> (); set <string> keyset = parambody.keyset (); для (string key: keyset) {list.addd (new basicnamevalu parambody.get (key)));} if (list.size ()> 0) {urlencodedformentity entity = new urlencodedformentity (list, charset); httppost.setentity (entity);}}}}}}}}}}}}}}}}}}}}}}}}}}}}Тогда есть тестовый класс:
Пакет com.darren.test.https.v42; import java.util.hashmap; import java.util.map; public class httpsclienttest {public static void main (string [] args). 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> parampody = new Hashmap <> (); parambody.put ("client_id", "[email protected]"); parampody.put ("client_secret", "p@sword_1"); string result = httpsclientutil.dopost (httpsclient, urlAmlead, parambody); Httpsclientutil.doget (httpsclient, url, null, null); System.out.println (result);}}Вернуть информацию:
<? xml version = "1.0" Encoding = "UTF-8"?> <token> jkf8rl0sw+skkflj8rbki5hp1beqk8prcutzppbinqmykrmxy1kwcjmcft191zpp88vv1aghw8oynwjeys 0axplugax89ejcownbikcc1uvfyesxhlktcjqyufivjevhreqxjphnclqywp+xse5od9x8vkfkk7inntmrzqk7ybtz /E3U7GSWM/5CVAHFL6O9REQ9CWPXAVZNOHYVNXSOHSZDO+BXATXXA1XPEDLY/8H/UAP4N4DLZDJJ3B8T1XH+CRRIOM Opxf7c5wkhhtokeoexw+xopqkksx5ckwwjppugiifwf/paqwg+huosvt7qgdpv8pmwj9dwewjtdxgudg == </token>
Новая версия 4.5.3
Потребность в сертификации
Пакет com.darren.test.https.v45; import java.io.file; импорт java.io.fileinputstream; import java.security.keystore; импорт javax.net.ssl.sslcontext; import org.apache.http.conn.ssl.sslconcectoctectory; import. org.apache.http.conn.ssl.sslconnectionsockectectory; import org.apache.http.conn.ssl.trustselfsignedstrategy; import org.apache.http.ssl.sslcontexts; public class httpscertified extends httpsclient {public htpcertcerted @RideSclient {publicScertscertified @RideSclient {publicPscertified @RideSclient {publicPlient {) void PrepareCertificate () Throws Exception {// Получить ключевой библиотеку TrustStore = KeyStore.getInstance (keyStore.getDefaulttype ()); fileInputStream inStream = new FileInputStream (New File ("c: /Users/ZHDA6001/Downloads/software/newseam = fileiNIn"//ZHDA6001/Downloads/software. FileInputStream (новый файл ("c:/zhda6001/downloads/xxx.keystore")); try {// Пароль ключевой библиотеки TrustStore.load (instream, "пароль" .toChararray ());} наконец {instream.close ();} sslContext sslContext = sslContexts.custom (). this.connectionsocketfactory = new sslconnectionsockectectory (sslcontext);}}Пропустить сертификацию
пакет com.darren.test.https.v45; import java.security.cert.certificateexception; import java.security.cert.x509certificate; import javax.net.ssl.sslcontext; import.net.ne.ssl.trustmanager; import javax.net.ssl.x509trustmanager; org.apache.http.conn.ssl.sslconnectionsockectectory; public class httpstrustclient Extends httpsclient {public httpstrustclient () {} @Override public void prepareCertificate () Отправляет исключение {// skip -сертификат 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 void CheckServerTrusted (x509Certificate [] цепь, String authtype) Throws SertiateException {} @Override public x509Certificate [] getAcceptedIssuers () {return null;}}; // Установлен на доверительный сертификат ctx.init (null, null -graintraver [; null); this.connectionsocketCactory = new sslConnectionsockeCoxtactory (ctx);}}Суммировать
пакет com.darren.test.https.v45; import org.apache.http.config.registr org.apache.http.impl.client.closablehttpclient; import org.apache.http.impl.client.httpclientbuilder; импорт org.apache.http.impl.client.httpclients; импорт org.apache.http.impl.con.poolinghtectionsclectection Httpsclient расширяет httpclientbuilder {private closablehttpclient Client; Protected ConnectionSockeCtectory ConnectionSocteCocteChoctectory;/** * Инициализировать httpsClient * * @return возвращается к текущему экземпляру * @throws exception */publicablehttpclient () exception {this.preparecertictiition (); this.client;}/**** Подготовка проверки сертификата** @Throws Exception*/public rastice void prepareCertificate () Throws Exception;/*** Протокол регистрации и порт, этот метод также может быть переписан с помощью подкладов*/Защищенные void regist () {// Установить объект, соответствующий Protocol http и https, что ссылки на разъему. SocketFactoryRegistry = RegistryBuilder. <ConnectionSockeCoxTactory> create () .register ("http", plainconnectionsockectectory.instance) .register ("https", this.concectionsockectectectory) .build (); PoolingHttpClientConnectionManager (SocketFactoryRegistry); httpClients.custom (). SetConnectionManager (Connmanager); // Создать пользовательский объект httpclient this.client = httpclients.custom (). SetConnectionManager (connmanager) .build (); Httpclients.createdefault ();}}Инструменты:
пакет 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; импорт org.apache.http.httpress org.apache.http.namevaluepair; import org.apache.http.client.httpclient; импорт org.apache.http.client.entity.urlencodedformentity; импорт 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 org.apache.http.util.entityutil; Default_charset = "utf-8"; public Static String Dopost (httpclient httpclient, строки URL, Map <String, String> ParamheDer, Map <String> parampody) Throws Exception {return dopost (httpclient, url, parameDer, parambody, default_charset); URL, карта <string, string> paramheader, map <string, string> parampody, string charset) throws exection {string result = null; httppost httppost = new httppost (url); setheader (httppost, paramheDer); setBode (httppost, parampod 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> ParamheHeDer, Map <String, String> Parambody) Throws Exception {return Doget (httpclient, url, paramheader, parampody, default_charset);} public Static String Doget (httpclient httpclient, строки URL, map, String> paramheHeder, map <String> parampody, string charset) throws exectunt {string> null restecter; httpget = new httpget (url); setheader (httpget, paramheader); httpresponse response = httpclient.execute (httpget); if (response! = null) {httpentity reventity = response.getentity (); if (resentity! charset);}} return result;} private static void setheader (httprequestbase -запрос, map <string, string> paramheader) {// set heder if (paramheader! = null) {set <string> keyset = paramheader.keyset (); for (String Key: keyset) {request.addheader (key, paramheader.get (key));}}} private static void setbode (httppost httppost, map <string> parambody, string charset) бросает исключение {// set parameters if (parambody! ArrayList <mankvaluePair> (); set <string> keyset = parambody.keyset (); для (String Key: Keyset) {list.add (new Basicnamevaluepair (Key, parambody.get (Key));} if (list.size ()> 0) {urlencodedFormation vitorment = newrity = newrlencedtorment (list.size ()> 0) {urlencodedForment charset); httppost.setentity (entity);}}}}Тестовый класс:
Пакет com.darren.test.https.v45; import java.util.hashmap; import java.util.map; import org.apache.http.client.httpclient; открытый класс httpsclienttest {public static void main (String [] args) Trows {httpclient httpclient htttpclient {public void main (string [] args) trows {httpclient httpclient htttpclient httt 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> parampody = new hashmap <> (); parampody.put ("client_id", "[email protected]"); parampody.put ("client_secret", "p@ssword strescord"; 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 // 7nxwxjs2cjijyhltvzunvmzxxeqtgn0u07sc9ysjeibpqte3hcjulskoxpeuyguevei9jv7/wi klrzxykc3ospatsm0kcbckphu0tb2cn/nfzv9fmlueowfbdyz+n0seii9k+0gp7920dfencn17wujvmc0u2jwvm5fa jqkmilwodxz6a0dq+d7dqdjwvcwxbvj2ilhyib3pr805vppmi9atxrvako066wejfofcgyg5p70wpj5rrbl85v fy9wcvkd1r7j6nvjhxghghgngnimhkjejormjdxw2gkiusiwseli/xpswao7/ctwnwtnctgk8px2zub0zfa == </token>
2. httpurlconnection
@Controllerpublic class RestfulAction {@Autowired private userservice userservice; // изменять @Requestmapping (value = "put/{param}", method = requestMethod.put) public @Responsebody String put (@pathvarible string parm) {return "part:" +} // Добавить @requestmapp RequestMethod.post) public @Responsebody String post (@pathvarible String Param Param, String Id, String name) {System.out.println ("id:"+id); System.out.println ("name:"+name); return "post:"+param;} // delete @requestmapping (value = "delete/{param}", method -methoded. @Responsebody String delete (@pathvariable String Param) {return "delete:" + param;} // find @Requestmaping (value = "get/{param}", method = requestMethod.get) public @Responsebody string get (@pathvarible string parm) {return "get:" + param;} // httpurlconc @Requestmapping (value = "dealcon/{param}") public @Responsebody string dealcon (@pathvarable String param) {try {string url = "http: // localhost: 8080/tao-manager-web/"; url+= (param+"/xxx"); httpconnection = (httpurlconnection) restserviceurl .openconcenection (); // param invate downcare и преобразовать его, чтобы получить после удаления httpconnection.setrequestmethod (param.touppercase ()) ;// httpconnection.setRequestproper (",", ",) ;// httpconnection.setRequestProper "Application/json"); if ("post" .equals (param)) {// открыть выходной переключатель httpconnection.setDoOutput (true); // httpconnection.setDoinput (true); // передавать параметр string = "& id ="+ urlencoder.encode ("abc", utf -8 "); Urlencoder.encode ("Аххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххх цвета ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh httpconnection.getOutputStream (); outputStream.Write (input.getBytes ()); outputStream.flush ();} if (httpconnection.getResponsecode ()! = 200) {Throw New Runtimeexcept = new BufferedReader (new InputStreamReader ((httpConnection.getInputStream ())); String output; System.out.println («Вывод с сервера: /n»); while ((output = responsebuffer.readline ())! = null) {system.out.println (output); e) {e.printstacktrace ();} catch (ioexception e) {e.printstacktrace ();} return "успех";}}3. Spring's Resttemplate
Springmvc.xml добавлен
<!-Configure Resttemplate-> <!-HTTP Client Factory-> <Bean id = "httpclientfactory"> <name = "connecttimeout" value = "10000" /> <name = "readtimeout" value = "10000" /> < /bean> <!-resttemplate-> <bean-id = "restteplate"> <constructor- ляплент "refclecture" refluctorfulfure "> <construction-" refluctorfficatore "> <stronturet-art /> < /bean>
контроллер
@Controllerpublic class resttemplateaction {@autowired private resttemplate шаблон; @requestmapping ("resttem") public @responsebody user resttem (string method) {user user = null; // find if ("get". «http: // localhost: 8080/tao-manager-web/get/{id}», user.class, «wuwuwuwu»); // Разница между GetFortity и GetForObject-это то, что вы можете получить возвратную ценность и статус, информация заголовка, repplionEntity <user> re = шаблон. 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 (). "Аааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааы "http: // localhost: 8080/tao-manager-web/post/aaa", requestEntity, user.class); // delete} else if ("delete" .equals (method)) {template.delete ("http: // localhost: 8080/tao-manager-web/lelete/{id}"/// aaa ') else if ("put" .equals (method)) {template.put ("http: // localhost: 8080/tao-manager-web/put/{id}", null, "bbb");} return user;}}Выше приведено все содержание этой статьи о кратком обсуждении того, как Java называет интерфейс API Restful. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие темы, связанные с Java на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!