要約:最近、顧客にいくつかのRestful APIインターフェイスを提供するための要件があります。 QAはテストにPostmanを使用しますが、Postmanのテストインターフェイスは類似していますが、Javaコールと同じではありません。そのため、自分でRESTFUL APIインターフェイスをテストするプログラムを作成したいと思います。 HTTPSを使用するため、HTTPSの処理も考慮する必要があります。 Javaを使用してRestful Interfaceを初めて呼び出していたので、まだ勉強する必要があるので、自然にいくつかの情報を参照しました。
分析:この問題は、モジュール間の呼び出しとは異なります。たとえば、フロントエンドとバックエンドの2つのモジュールがあり、フロントエンドはフロントエンドディスプレイを提供し、バックエンドはデータサポートを提供します。私は、バックエンドから提供されたサービスをリモートサービスとして登録するために、ヘッションを使用しました。フロントエンドでは、このリモートサービスは、この種のリモートサービスを介してバックエンドインターフェイスに直接調整できます。しかし、これは、企業が独自のプロジェクトが非常に結合されている場合に使用するのに問題はありません。ただし、そのようなリモートサービスを顧客に登録すると、良くないようで、結合が高すぎます。したがって、次の方法を使用することを検討します。
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をインポートします。 org.apache.http.conn.ssl.sslsocketFactoryをインポートします。 public class httpsCertifiedClientはhttpsclientを拡張します{public httpscertifiedclient(){} @Override public void preparecertificate()スロー例外{//キーライブラリキーストアトラストストア= keystore.getInstance(keystore.getDefaulttype()); 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、 "password" .tochararray()); //キーライブラリを登録this.socketFactory = new SSLSocketFactory(TrustStore); //ドメイン名socketfactory.sethostnameverifier(sslsocketfactory.allow_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をインポートします。 org.apache.http.conn.ssl.sslsocketFactoryをインポートします。 public class httpstrustclientはhttpsclient {public httpstrustclient(){} @override public void preparecertificate()を拡張します。 X509TrustManager TM = new X509TrustManager(){@Override public void checkclienttrusted(x509certificate [] chain、string authtype)Sthrows exception {} @Override public void checkervertrusted(x509certificate [] chaintype) x509Certificate [] getCepteDissuers(){return null; }}; //信頼できる証明書ctx.init(null、new Trustmanager [] {tm}、null)に設定します。 // SSLソケットファクトリを置き、ホスト名を確認しないように設定します。 }}要約します
現在、両方のクラスが同じクラスhttpsclientを継承し、httpsclientがdefulthttpclientクラスを継承することがわかります。ここでは、テンプレートメソッドパターンが使用されていることがわかります。
パッケージcom.darren.test.https.v42; org.apache.http.conn.clientConnectionManagerをインポートします。 Import org.apache.http.conn.scheme.scheme; org.apache.http.conn.ssl.sslsocketFactoryをインポートします。 import org.apache.http.impl.client.defaulthttpclient;パブリックアブストラクトクラスhttpsclient defaulthttpclient {protected sslsocketyfactory socketfactory; / ** * initialize httpsclient * * @return現在のインスタンスを返します * @Throws例外 */ public httpsclient init()throws exception {this.preparecertificate(); this.regist();これを返します。 } / ** *証明書の確認を準備 * * @Throws例外 * / public abstract void preateCertificate()スロー例外。 / ***登録プロトコルとポート、この方法はサブクラスによって書き換えることもできます*/保護されたvoid regist(){clientConnectionManager ccm = this.getConnectionManager(); Schemeregistry sr = ccm.getschemeregistry(); sr.register(new Scheme( "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をインポートします。 Import 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 {private static final string default_charset = "utf-8"; public static string dopost(httpsclient httpsclient、string url、map <string、string> paramhead、map <string、string> parambody)slows {return dopost(httpsclient、url、paramheader、parambody、default_charset); } public static string dopost(httpsclient httpsclient、string url、map <string、string> paramheader、map <string、string> parambody、string charset)スロー例外{string result = null; httppost httppost = new httppost(url); setheader(httppost、paramheader); setbody(httppost、parambody、charset); httpresponse応答= httpsclient.execute(httppost); if(resentity!= null){httpentity resentity = respons.getEntity(); if(resentity!= null){result = entityutils.toString(resentity、charset); }} return result; } public static string doget(httpsclient httpsclient、string url、map <string、string> paramhead、map <string、string> parambody)throws {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応答= httpsclient.execute(httpget); if(response!= null){httpentity resentity = respons.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)スロー例外{//パラメーターif(parambody!= null){list <namevaluepair> list = new arraylist <namevaluepair>(); <string> keyset = parambody.keyset()を設定します。 for(string key:keyset){list.add(new BasicNameValuePair(key、parambody.get(key))); } if(list.size()> 0){urlencodedformentity entity = new urlencodedformentity(list、charset); httppost.setentity(entity); }}}}次に、テストクラスがあります。
パッケージcom.darren.test.https.v42; java.util.hashmapをインポートします。 java.util.mapをインポートします。 public class httpsclienttest {public static void main(string [] args)throws exception {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> parambody = new Hashmap <>(); parambody.put( "client_id"、 "[email protected]"); parambody.put( "client_secret"、 "p@ssword_1");文字列result = httpsclientutil.dopost(httpsclient、url、paramheader、parambody); // string result = httpsclientutil.doget(httpsclient、url、null、null); system.out.println(result); }}返品情報:
<?xml version = "1.0" encoding = "utf-8"?>
<token> jkf8rl0sw+skkflj8rbki5hp1beqk8prcutzppbinqmykrmxy1kwcjmcft191zpp88vvv1aghw8oynwjeys 0AXPLUGAX89EJCOWNBIKCC1UVFYESXHLKTCJQYUFIVJEVHREQXJPHNCLQYWP+XSE5OD9X8VKFKK7INNTMRZQK7YBTZ /e3u7gswm/5cvahfl6o9req9cwpxavznohyvnxsohszdo+bxatxxa1xpedly/8h/uap4n4dlzdjj3b8t1xh+crriom OPXF7C5WKHTOKEOEXW+XOPQKKKSX5CKWWJPPUGIIFWF/PAQWG+JUOSVT7QGDPV8PMWJ9DWEWJTDXGUDG == </TOKEN>
新しいバージョン4.5.3
認定の必要性
パッケージcom.darren.test.https.v45; java.io.fileをインポートします。 java.io.fileinputStreamをインポートします。 Java.security.keystoreをインポートします。 javax.net.ssl.sslcontextをインポートします。 org.apache.http.conn.ssl.sslconnectionSocketFactoryをインポートします。 org.apache.http.conn.ssl.sslconnectionSocketFactoryをインポートします。 org.apache.http.conn.ssl.trustselfsignedstrategyをインポートします。 org.apache.http.ssl.sslcontextsをインポートします。 public class httpsCertifiedClientはhttpsclientを拡張します{public httpscertifiedclient(){} @Override public void preparecertificate()スロー例外{//キーライブラリキーストアトラストストア= keystore.getInstance(keystore.getDefaulttype()); fileInputStream entream = new fileInputStream(new File( "C:/users/zhda6001/downloads/software/xxx.keystore")); // fileInputStream entream = new FileInputStream(new File( "c:/users/zhda6001/downloads/xxx.keystore")); try {//キーライブラリTrustStore.loadのパスワード(instream、 "password" .tocharArray()); }最後に{enterstream.close(); } sslcontext sslcontext = sslcontexts.custom()。loadtrustmaterial(truststore、trustselfsignedstrategy.instance).build(); this.ConnectionSocketFactory = new SSLConnectionSocketFactory(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をインポートします。 org.apache.http.conn.ssl.sslconnectionSocketFactoryをインポートします。 public class httpstrustclientはhttpsclient {public httpstrustclient(){} @override public void preparecertificate()を拡張します。 X509TrustManager TM = new X509TrustManager(){@Override public void checkclienttrusted(x509certificate [] chain、string authtype)Sthrows exception {} @Override public void checkervertrusted(x509certificate [] chaintype) x509Certificate [] getCepteDissuers(){return null; }}; //信頼できる証明書ctx.init(null、new Trustmanager [] {tm}、null)に設定します。 this.ConnectionSocketFactory = new SSLConnectionSocketFactory(CTX); }}要約します
パッケージcom.darren.test.https.v45; Import org.apache.http.config.registry; org.apache.http.config.registrybuilderをインポートします。 org.apache.http.conn.socket.connectionSocketFactoryをインポートします。 org.apache.http.conn.socket.plainconnectionsocketfactoryをインポートします。 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 closeablehttpclientクライアントを拡張します。 Protected ConnectionSocketAftory ConnectionSocketActureFactory; / ** * initialize httpsclient * * @return現在のインスタンスを返す * @throws例外 */ public closeablehttpclient init()throws exception {this.preparecertificate(); this.regist(); this.clientを返します。 } / ** *証明書の確認を準備 * * @Throws例外 * / public abstract void preateCertificate()スロー例外。 / ***登録プロトコルとポート、この方法はサブクラスによって書き換えることができます*/保護されたvoid regist(){//ソケットリンクファクトリー<connectionsocketyfactory> socketfactoryregistry = registrybuilder。 PlainConnectionSocketFactory.instance).register( "https"、this.connectionSocketFactory).build(); poolinghttpclientconnectionmanager connmanager = new poopleinghttpclientconnectionmanager(socketfactoryregistry); httpclients.custom()。setConnectionManager(connmanager); //カスタムhttpclientオブジェクトを作成this.client = httpclients.custom()。setConnectionManager(connmanager).build(); // closeablehttpclient 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をインポートします。 Import 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; org.apache.http.message.basicnamevaluepairをインポートします。 org.apache.http.util.entityutilsをインポートします。パブリッククラスhttpsclientutil {private static final string default_charset = "utf-8"; public static string dopost(httpclient httpclient、string url、map <string、string> paramhead、map <string、string> parambody)slows {return dopost(httpclient、url、paramheader、parambody、default_charset); } public static string dopost(httpclient httpclient、string url、map <string、string> paramheader、map <string、string> parambody、string charset)スロー例外{string result = null; httppost httppost = new httppost(url); setheader(httppost、paramheader); setbody(httppost、parambody、charset); httpreSponse応答= httpclient.execute(httppost); if(resentity!= null){httpentity resentity = respons.getEntity(); if(resentity!= null){result = entityutils.toString(resentity、charset); }} return result; } public static string doget(httpclient httpclient、string url、map <string、string> paramhead、map <string、string> parambody)throws {return doget(httpclient、url、paramheader、parambody、default_charset); } public static string doget(httpclient httpclient、string url、map <string、string> paramheader、map <string、string> paramody、string charset)スロー例外{文字列結果= null; httpget httpget = new httpget(url); setheader(httpget、paramheader); httpresponse応答= httpclient.execute(httpget); if(response!= null){httpentity resentity = respons.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)スロー例外{//パラメーターif(parambody!= null){list <namevaluepair> list = new arraylist <namevaluepair>(); <string> keyset = parambody.keyset()を設定します。 for(string key:keyset){list.add(new BasicNameValuePair(key、parambody.get(key))); } if(list.size()> 0){urlencodedformentity entity = new urlencodedformentity(list、charset); httppost.setentity(entity); }}}}}}テストクラス:
パッケージcom.darren.test.https.v45; java.util.hashmapをインポートします。 java.util.mapをインポートします。 import org.apache.http.client.httpclient; public class httpsclienttest {public static void main(string [] args)throws exception {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> parambody = new Hashmap <>(); parambody.put( "client_id"、 "[email protected]"); parambody.put( "client_secret"、 "p@ssword_1"); string result = 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 // 7nxwxjs2cjijyhltvzunvmzxxxeqtgn07sc9yibpqte3hcjulskoxpeuyguveyii9jv7/wi klrzxykc3ospatsm0kcbckphu0tb2cn/nfzv9fmlueowfbdyz+n0seii9k+0gp7920dfencn17wujvmc0u2jwvm5fa jqkmilwodxzz6a0dq+d7dqdjwvcwxbvj2ilhyib3ppl805vppmi9atxrvako0oda006wejfofcgygg5p70wpj5rrbl85vvv fy9wcvkd1r7j6nvjhxgh2gnimhkjejormjdxw2gkiusiwseli/xpswao7/ctwnwtnctgk8px2zub0zfa == </token>
2。HTTPURLCONNECTION
3。Springのレストテンプレート
他の方法は後で補足されます
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。