<! - Googleのグアバ限流- >
<依存>
<groupIdを> com.google.guava </ groupIdを>
<たartifactId>グアバ</たartifactId>
<バージョン> 23.0 </バージョン>
</依存関係>
パッケージcom.yung.user.util。 輸入com.google.common.util.concurrent.RateLimiter。 輸入com.yung.user.dto.HttpResult。 輸入org.apache.commons.collections.MapUtils。 輸入org.apache.commons.httpclient.HttpClient。 輸入org.apache.commons.httpclient.HttpException。 輸入org.apache.commons.httpclient.MultiThreadedHttpConnectionManager。 輸入org.apache.commons.httpclient.methods.GetMethod; 輸入org.apache.commons.httpclient.methods.PostMethod; 輸入org.apache.commons.lang3.StringUtils。 輸入org.slf4j.Logger。 輸入org.slf4j.LoggerFactory; インポートにjava.io.IOException; 輸入java.util.Map; 輸入java.util.Set; 輸入java.util.concurrent.TimeUnit。 / ** * HTTP请求工具类 * / publicクラスHttpUtil { 民間最終静的ロガーロガー= LoggerFactory.getLogger(HttpUtil.class)。 プライベート静的最終文字列URL_PARAM_CONNECT_EQUAL_SIGN =「=」; プライベート静的最終文字列URL_PARAM_CONNECT_FLAG =「&」; プライベート静的最後の文字列HTTP_CONTENT_TYPE_KEY =「ContentTypeを」; プライベート静的MultiThreadedHttpConnectionManagerのConnectionManager = NULL; / ** *连接超时时间 * / プライベート静的int型のConnectionTimeout = 2000; / ** *响应超时时间 * / プライベート静的int型socketTimeOut = 2000; / ** *最大接続数 * / プライベート静的int型maxConnectionPerHost = 30; / ** *最大活动连接数 * / プライベート静的int型maxTotalConnections = 30; プライベート静的HttpClientをクライアント。 / ** *令牌桶限流 *每秒产生300个令牌 * / プライベート静的RateLimiter rateLimiter = RateLimiter.create(300); 静的{ のConnectionManager =新しいMultiThreadedHttpConnectionManager()。 connectionManager.getParams()setConnectionTimeout(のConnectionTimeout)。 connectionManager.getParams()setSoTimeout(socketTimeOut)。 connectionManager.getParams() .setDefaultMaxConnectionsPerHost(maxConnectionPerHost)。 connectionManager.getParams()setMaxTotalConnections(maxTotalConnections)。 =新しい新しいHttpClientをクライアント(のConnectionManager); } / ** データ提出する* POSTメソッド * @paramのURL URLは、要求される 提出するデータを* @paramはparamsは * @return応答結果 * / パブリック静的HttpResultのdoPost(文字列のURL、地図を<文字列、文字列>のparams){ //トークンを取得1秒なしのアクセスを拒否。 (rateLimiter.tryAcquire(1、TimeUnit.SECONDS。!)){IF スロー新しい新BusinessException(ErrorStatus.GET_LIMIT_TOKEN_FAIL_ERROR); } HttpResult新しい新しいHttpResult結果=() ; PostMethod PostMethod = NULL; IF(StringUtils.isEmpty(params.get(HTTP_CONTENT_TYPE_KEY))){ 試み{ postMethod =新しいPostMethod(URL); postMethod.setRequestHeader( "のContent-Type"、 "アプリケーション/ x-www-form-urlencodedで;のcharset = UTF8")。 } IF(MapUtils.isNotEmpty(paramsは)){ 設定<のMap.Entry <文字列、文字列>>エントリ= params.entrySet()。 (のMap.Entry <文字列、文字列>エントリ:エントリ)のために{ postMethod.addParameter(entry.getKey()、entry.getValue())。 } } client.executeMethod(postMethod)。 result.setStatusCode(postMethod.getStatusCode())。 result.setData(postMethod.getResponseBodyAsString())。 LOGGER.error( "致命的な例外が発生し、プロトコルは、問題またはコンテンツ・リターンではないかもしれない"、E)。 }キャッチ(IOExceptionを電子){ LOGGER.error(E "例外がネットワークに発生"); }最後に、{ (PostMethod = NULL!)IF { PostMethod .releaseConnection(); } } 戻り値の結果; } / ** データ提出する* GETメソッド * @paramのURL URLを要求する * @param paramsは提出するデータ * @return応答結果 * / 、パブリック静的HttpResultのdoGet(文字列のURLをマップ<文字列、文字列>のparams){ //トークンを取得1秒なしのアクセスを拒否。 (rateLimiter.tryAcquire(1、TimeUnit.SECONDS。!)){IF スロー新しい新BusinessException(ErrorStatus.GET_LIMIT_TOKEN_FAIL_ERROR)。 } HttpResult結果=新しいHttpResult()。 GetMethod getMethod = NULL; ストリングhttpGetParamsStr = getHttpGetParamsStr(paramsは)。 もし(StringUtils.isNotEmpty(httpGetParamsStr)){ URL = URL + "?" + httpGetParamsStr; } {試みる getMethod =新しいGetMethod(URL)を。 IF(StringUtils.isEmpty(params.get(HTTP_CONTENT_TYPE_KEY))){ getMethod.setRequestHeader( "のContent-Type"、 "アプリケーション/ x-www-form-urlencodedで;のcharset = UTF8")。 } client.executeMethod(getMethod)。 result.setStatusCode(getMethod.getStatusCode())。 result.setData(getMethod.getResponseBodyAsString())。 }キャッチ(HttpException E){ LOGGER.error(例えば、「致命的な例外が発生し、プロトコルは、問題またはコンテンツ・リターンではないかもしれません」)。 }キャッチ(IOExceptionを電子){ LOGGER.error( "发生网络异常"、E)。 }最後に、{ (!getMethod = NULL)であれば{ getMethod.releaseConnection()。 } } 戻り値の結果; } / ** *获取GET请求参数字符串 * @paramはparamsは * @return * / プライベート静的な文字列getHttpGetParamsStr(地図<文字列、文字列>のparams){ 場合(MapUtils.isEmpty(のparams)){ nullを返します。 } のStringBuilderビルダー=新規のStringBuilder(); セット<のMap.Entry <文字列、文字列>>エントリー= params.entrySet(); int型私= 0; (のMap.Entry <文字列、文字列>エントリ:エントリ)のために{ 。builder.append(entry.getKey())付加(URL_PARAM_CONNECT_EQUAL_SIGN).append(entry.getValue())。 IF(!I = entries.size() - 1){ builder.append(URL_PARAM_CONNECT_FLAG)。 } 私は++します; } )(builder.toStringを返します。 } }