Аннотация: Недавно существует необходимость предоставить клиентам некоторые спокойные интерфейсы API. QA использует Postman для тестирования, но тестовый интерфейс почтальона похож, но не такой же, как вызовы Java. Поэтому я хочу написать программу, чтобы самостоятельно проверить интерфейс API Restful. Поскольку он использует HTTPS, мне также необходимо рассмотреть обработку HTTPS. Поскольку я использовал Java, чтобы впервые позвонить в Restful Interface, мне все еще нужно изучить его, поэтому я, естественно, проконсультировался с некоторой информацией.
Анализ: эта проблема отличается от вызовов между модулями. Например, у меня есть два модуля, передний и задний конец, передний конец обеспечивает фронт-дисплей, а задний конец обеспечивает поддержку данных. Я использовал Hession для регистрации услуг, предоставляемых Back End в качестве удаленных услуг. На передней части эта удаленная служба может быть напрямую отрегулирована на задний интерфейс через этот вид удаленной службы. Но это не проблема для компании, когда его собственный проект сильно связан. Однако, если вы зарегистрируете такой удаленный сервис с клиентами, это кажется не хорошим, а связь слишком высока. Поэтому я рассматриваю использование следующего метода.
1. httpclient
Каждый может быть знаком с httpclient, но это незнакомо с этим. Он знаком с ним, потому что он может удаленно вызовать, например, запросить URL, а затем получить статус возврата и возвращать информацию в ответе. Тем не менее, сегодня я говорю об этом немного сложнее, потому что сегодняшняя тема - HTTPS, которая включает в себя проблему сертификатов или аутентификации пользователей.
После подтверждения того, что использование httpclient я искал соответствующую информацию и обнаружил, что новая версия httpclient отличается от старой версии и совместима со старой версией, но больше не рекомендуется использовать старую версию. Многие методы или классы были помечены как устаревшие. Сегодня мы будем использовать старую версию 4.2 и последнюю версию 4.5.3, чтобы написать код соответственно.
Старая версия 4.2
Потребность в сертификации
Использование аутентификации сертификата выбирается на этапе подготовки сертификата
пакет com.darren.test.https.v42; Импорт java.io.file; импортировать java.io.fileinputstream; Импорт java.security.keystore; Import org.apache.http.conn.ssl.sslsocketFactory; Общедоступный класс httpscertifiedclient extends httpsclient {public httpscertifiedclient () {} @override public void preparecertificate () исключает {// Получить ключевой библиотеку TrustStore = KeyStore.getInstance (keyStore.getDefaultPe ()); FileInputStream input = new FileInputStream (New File ("c: /Users/zhda6001/downloads/software/xxx.keystore")); // fileInputStream input = new FileInputStream (new File ("c: /Users/zhda6001/downloads/xxx.keystore")); // пароль библиотеки ключей TrustStore.Load (inStream, «Пароль» .tchararRay ()); // зарегистрировать библиотеку ключей this.socketFactory = new sslSocketFactory (TrustStore); // не проверяйте имя доменного имени socketfactory.sethostnameverifier (sslsocketfactory.ally_all_hostname_verifier); }}Пропустить сертификацию
Возможность пропустить аутентификацию на этапе подготовки сертификата -
пакет com.darren.test.https.v42; Импорт java.security.cert.certificateException; Импорт java.security.cert.x509Certificate; импортировать javax.net.ssl.sslcontext; Импорт javax.net.ssl.trustmanager; Импорт javax.net.ssl.x509trustmanager; Import org.apache.http.conn.ssl.sslsocketFactory; открытый класс httpstrustclient расширяет httpsclient {public httpstrustclient () {} @Override public void prepareCertificate () Throws Exception {// Scip сертификат Verification sslContext ctx = sslContext.getNstance ("tls"); X509trustmanager tm = new x509trustmanager () {@override public void checkclienttrusted (x509certificate [] chain, string authtype) throws setresexception {} @Override public void ceckserverted (x509certificate [] chain, string outtype) X509certificate [] getacceptedIssuers () {return null; }}; // установлено на доверенный сертификат ctx.init (null, new Trustmanager [] {tm}, null); // Поместите фабрику SSL Socket и установите, чтобы не проверять имя хоста this.socketFactory = new sslSocketFactory (ctx, sslsocketfactory.allo_all_hostname_verifier); }}Суммировать
Теперь обнаружено, что оба класса наследуют один и тот же класс httpsclient, и httpsclient наследуют класс Defaulthttpclient. Можно найти, что здесь используется шаблон метода шаблона.
пакет com.darren.test.https.v42; Import org.apache.http.conn.clientConnectionManager; Импорт org.apache.http.conn.scheme.scheme; Import org.apache.http.conn.ssl.sslsocketFactory; Импорт org.apache.http.impl.client.defaulthttpclient; Общественный абстрактный класс httpsclient расширяет Delaulthttpclient {защищенный sslsocketfactory socketfactory; / ** * Инициализировать httpsclient * * @return возвращать текущий экземпляр * @throhs Exception */ public httpsclient init () throws exection {this.prepareCertificate (); this.regist (); вернуть это; } / ** * Подготовка проверки сертификата * * @Throhs Exception * / public Abstract void PrepareCertificate () бросает исключение; / *** Протокол регистра и порт, этот метод также может быть переписан подклассы*/ Protected void regist () {clientConnectionManager ccm = this.getConnectionManager (); Schemeregistry sr = ccm.getschemeregistry (); Sr.register (новая схема ("https", 443, socketfactory)); }} Ниже приведен класс инструментов
пакет com.darren.test.https.v42; импортировать java.util.arraylist; импортировать java.util.list; импортировать java.util.map; импортировать java.util.set; Импорт org.apache.http.httpentity; Импорт org.apache.http.httpresponse; Импорт org.apache.http.namevaluepair; Импорт 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; Импорт org.apache.http.message.basicnamevaluepair; Импорт org.apache.http.util.entityutils; открытый класс httpsclientutil {частная статическая конечная строка default_charset = "utf-8"; Public Static String Dopost (httpsclient httpsclient, строки URL, Map <String, String> ParamheDer, Map <String, String> Parampody) Throws Exception {return dopost (httpsclient, url, paramheader, parambody, default_charset); } public Static String Dopost (httpsclient httpsclient, string url, map <string, string> paramheader, map <string, string> parampody, string charset) throws exection {string result = null; Httppost httppost = new httppost (url); Setheader (httppost, paramheader); SetBody (httppost, parambody, charset); Httpresponse response = httpsclient.execute (httppost); if (redentity! = null) {httpentity rederty = response.getentity (); if (redentity! = null) {result = entityutils.tostring (redentity, charset); }} return result; } public Static String Doget (httpsclient httpsclient, строки URL, Map <String, String> ParamheDer, Map <String, String> Parampody) Throws Exception {return Doget (httpsclient, url, paramheader, parambody, default_charset); } public Static String Doget (httpsclient httpsclient, строки URL, Map <String, String> ParamheDer, Map <String, String> Parampody, String charset) Throws Exception {String result = null; Httpget httpget = new httpget (url); Setheader (httpget, paramheader); Httpresponse response = httpsclient.execute (httpget); if (response! = null) {httpentity reventity = response.getentity (); if (redentity! = null) {result = entityutils.tostring (redentity, charset); }} return result; } private static void setheader (httprequestbase запрос, map <string, string> paramheader) {// Установить заголовок 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> parampody, string charset) throws exception {// Установить параметр if (parampody! = null) {list <mankvaluepair> list = new Arraylist <mankvaluepair> (); SET <String> keySet = parambody.keyset (); for (String Key: keyset) {list.add (new BasicnamevaluePair (key, parampody.get (key))); } if (list.size ()> 0) {urlencodedformentity entity = new urlencodedformentity (list, charset); httppost.setentity (сущность); }}}} Тогда есть тестовый класс:
пакет com.darren.test.https.v42; импортировать java.util.hashmap; импортировать java.util.map; открытый класс httpsclienttest {public static void main (string [] args) выбрасывает исключение {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/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]"); parambody.put ("client_secret", "p@sword_1"); String result = httpsclientutil.dopost (httpsclient, url, paramheader, parambody); // string result = httpsclientutil.doget (httpsclient, url, null, null); System.out.println (результат); }} Вернуть информацию:
<? 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; Импорт java.io.file; импортировать java.io.fileinputstream; Импорт java.security.keystore; импортировать javax.net.ssl.sslcontext; Import org.apache.http.conn.ssl.sslconnectionsockectectory; Import org.apache.http.conn.ssl.sslconnectionsockectectory; Импорт org.apache.http.conn.ssl.trustselfsignedStrategy; Импорт org.apache.http.ssl.sslcontexts; Общедоступный класс httpscertifiedclient extends httpsclient {public httpscertifiedclient () {} @override public void preparecertificate () исключает {// Получить ключевой библиотеку TrustStore = KeyStore.getInstance (keyStore.getDefaultPe ()); FileInputStream inStream = new FileInputStream (new File ("C: /Users/zhda6001/downloads/software/xxx.keystore")); // fileInputStream inStream = new FileInputStream (new File ("c: /users/zhda6001/downloads/xxx.keystore")); try {// пароль ключевой библиотеки TrustStore.load (instream, "пароль" .tchararray ()); } наконец {enterstream.close (); } SslContext sslContext = sslContexts.custom (). this.connectionsocketfactory = new sslconnectionsockectectory (sslcontext); }}Пропустить сертификацию
пакет com.darren.test.https.v45; Импорт java.security.cert.certificateException; Импорт java.security.cert.x509Certificate; импортировать javax.net.ssl.sslcontext; Импорт javax.net.ssl.trustmanager; Импорт javax.net.ssl.x509trustmanager; Import org.apache.http.conn.ssl.sslconnectionsockectectory; открытый класс httpstrustclient расширяет httpsclient {public httpstrustclient () {} @Override public void prepareCertificate () Throws Exception {// Scip сертификат Verification sslContext ctx = sslContext.getNstance ("tls"); X509trustmanager tm = new x509trustmanager () {@override public void checkclienttrusted (x509certificate [] chain, string authtype) throws setresexception {} @Override public void ceckserverted (x509certificate [] chain, string outtype) X509certificate [] getacceptedIssuers () {return null; }}; // установить доверенный сертификат ctx.init (null, new TrustManager [] {tm}, null); this.connectionsocketfactory = new sslconnectionsockectectory (ctx); }}Суммировать
пакет com.darren.test.https.v45; Импорт org.apache.http.config.registry; Импорт org.apache.http.config.registrybuilder; Import org.apache.http.conn.socket.connectionsocketCactory; Import org.apache.http.conn.socket.plainconnectionsockectectory; Import org.apache.http.impl.client.closablehttpclient; Import org.apache.http.impl.client.httpclientbuilder; импорт org.apache.http.impl.client.httpclients; Import org.apache.http.impl.conn.poolinghttpclientConnectionManager; Общественный абстрактный класс httpsclient расширяет httpclientbuilder {private rebleablehttpclient Client; Защищенные ConnectionSocketFactory ConnectionSocteCtectory; / ** * Инициализировать httpsclient * * @return возвращать текущий экземпляр * @throhs Exception */ public keepableHttpClient init () throws exception {this.prepareCertificate (); this.regist (); вернуть это. } / ** * Подготовка проверки сертификата * * @Throhs Exception * / public Abstract void PrepareCertificate () бросает исключение; / *** Протокол регистра и порт, этот метод также может быть переписан подклассами*/ Protected void regist () {// Установить объект, соответствующий протоколу http и https, которые обрабатывают фабрику сокета Plainconnectionsockectectory.instance) .register ("https", this.concectionsocketfactory) .build (); PoolingHttpClientConnectionManager Connmanager = новый PoolingHttpClientConnectionManager (SocketFactoryRegistry); Httpclients.custom (). SetConnectionManager (Connmanager); // Создать пользовательский объект httpclient this.client = httpclients.custom (). SetConnectionManager (connmanager) .build (); // closablehttpclient client = httpclients.createdefault (); }} Инструменты:
пакет com.darren.test.https.v45; импортировать java.util.arraylist; импортировать java.util.list; импортировать java.util.map; импортировать java.util.set; Импорт org.apache.http.httpentity; Импорт org.apache.http.httpresponse; Импорт org.apache.http.namevaluepair; Импорт 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; Импорт org.apache.http.message.basicnamevaluepair; Импорт org.apache.http.util.entityutils; открытый класс httpsclientutil {частная статическая конечная строка default_charset = "utf-8"; public Static String Dopost (httpclient httpclient, string url, map <string, string> paramheader, map <string, string> parampody) throws exception {return dopost (httpclient, url, paramheader, parambody, default_charset); } public Static String Dopost (httpclient httpclient, string url, map <string, string> paramheader, map <string, string> parampody, string charset) throws exection {string result = null; Httppost httppost = new httppost (url); Setheader (httppost, paramheader); SetBody (httppost, parambody, charset); Httpresponse response = httpclient.execute (httppost); if (redentity! = null) {httpentity rederty = response.getentity (); if (redentity! = null) {result = entityutils.tostring (redentity, charset); }} return result; } public Static String Doget (httpclient httpclient, строки URL, Map <String, String> ParamheDer, Map <String, String> Parampody) 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> parampody, string charset) throws exception {string result = null; Httpget httpget = new httpget (url); Setheader (httpget, paramheader); Httpresponse response = httpclient.execute (httpget); if (response! = null) {httpentity reventity = response.getentity (); if (redentity! = null) {result = entityutils.tostring (redentity, charset); }} return result; } private static void setheader (httprequestbase запрос, map <string, string> paramheader) {// Установить заголовок 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> parampody, string charset) throws exception {// Установить параметр if (parampody! = null) {list <mankvaluepair> list = new Arraylist <mankvaluepair> (); SET <String> keySet = parambody.keyset (); for (String Key: keyset) {list.add (new BasicnamevaluePair (key, parampody.get (key))); } if (list.size ()> 0) {urlencodedformentity entity = new urlencodedformentity (list, charset); httppost.setentity (сущность); }}}}}} Тестовый класс:
пакет com.darren.test.https.v45; импортировать java.util.hashmap; импортировать java.util.map; Импорт org.apache.http.client.httpclient; открытый класс httpsclienttest {public static void main (string [] args) выбрасывает исключение {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/gethealth"; Map <string, string> paramheader = new hashmap <> (); paramheader.put ("Accept", "Application/xml"); Map <string, string> parampody = new hashmap <> (); parambody.put ("client_id", "[email protected]"); parambody.put ("client_secret", "p@sword_1"); String result = httpsclientutil.dopost (httpclient, url, paramheader, parambody); // string result = httpsclientutil.doget (httpsclient, url, null, null); System.out.println (результат); }} результат:
<? xml version = "1.0" Encoding = "UTF-8"?>
<token> rxitf9 // 7nxwxjs2cjijyhltvzunvmzxxeqtgn0u07sc9ysjeibpqte3hcjulskoxpeuyguevei9jv7/wi klrzxykc3ospatsm0kcbckphu0tb2cn/nfzv9fmlueowfbdyz+n0seii9k+0gp7920dfencn17wujvmc0u2jwvm5fa jqkmilwodxz6a0dq+d7dqdjwvcwxbvj2ilhyib3pr805vppmi9atxrvako066wejfofcgyg5p70wpj5rrbl85v fy9wcvkd1r7j6nvjhxghghgngnimhkjejormjdxw2gkiusiwseli/xpswao7/ctwnwtnctgk8px2zub0zfa == </token>
2. httpurlconnection
3. Spring's Resttemplate
Другие методы будут дополнены позже
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.