Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.opensearch.javasdk;
  
  import java.util.Date;
 import java.util.Map;
 import java.util.UUID;
 
 
 
Cloudsearch Client。 此类主要提供一下功能: 1、根据请求的参数来生成签名和nonce。 2、根据需求向API服务提出请求并返回response结果。

Author(s):
guangfan.qu
 
 public class CloudsearchClient {

    
指定默认的请求方式;默认为GET.
 
     public static final String DEFAULT_METHOD = "GET";

    
GET请求。
 
     public static final String METHOD_GET = "GET";

    
POST请求。
 
     public static final String METHOD_POST = "POST";

    
用户的client id。 此信息由网站中提供。
 
     private String clientId;

    
用户的秘钥。 此信息由网站中提供。
 
     private String clientSecret;

    
请求API的base URI.
 
     private String baseURI;

    
当前API的版本号。
 
     private String version = "v2";

    
请求的domain地址。
 
     private String host = "http://opensearch.aliyuncs.com";

    
用户类型,包含opensearch老用户和阿里云用户
 
     private KeyTypeEnum keyType = .;

    
用户阿里云网站中的accesskey,keyYype为ALIYUN使用 此信息阿里云网站中提供
 
     private String accesskey;

    
用户阿里云网站中的secret,keyYype为ALIYUN使用 此信息阿里云网站中提供
 
     private String secret;

    
构造函数。

Parameters:
clientId 用户的client id,从网站中可以获得此信息。
clientSecret 用户的client secret,从网站中可以获得此信息。
opts 一些可选信息,包含: version 当前sdk的版本信息,默认为v2。 host 指定请求的host地址,默认为this.host。 timeout 指定请求超时时间,单位为:秒。用户可以根据自己的场景来设定此值, 例如如果搜索可以设定时间稍短,如果推送文档,可以设定稍长的时间。 connect_timeout 指定连接超时时间,单位为:秒。 gzip 指定使用gzip方式传输数据
    public CloudsearchClient(String clientIdString clientSecret,
            Map<StringObjectopts) {
        this. = clientId;
        this. = clientSecret;
        if (opts != null && opts.size() > 0) {
            if (opts.get("host") != null) {
                this. = (String) (opts.get("host"));
            }
            if (opts.get("version") != null) {
                this. = (String) (opts.get("version"));
            }
            if (opts.get("gzip") != null && opts.get("gzip").equals(true)) {
                HttpClientManager.setGzip();
            }
            if (opts.get("timeout") != null) {
                int timeout = (Integeropts.get("timeout");
                if (timeout > 0) {
                    HttpClientManager.setTimeout(timeout);
                }
            }
            if (opts.get("connect_timeout") != null) {
                int connectTimeout = (Integeropts.get("connect_timeout");
                if (connectTimeout > 0) {
                    HttpClientManager.setConnectTimeout(connectTimeout);
                }
            }
        }
        StringBuilder sb = new StringBuilder();
        sb.append(this..endsWith("/") ?
                this..substring(0, this..length() - 1) : this.);
        this. = sb.toString();
    }

    
指定连接池的最大连接数

Parameters:
maxConnections
    public void setMaxConnections(int maxConnections) {
        if (maxConnections > 0) {
            HttpClientManager.setMaxConnections(maxConnections);
        }
    }

    
构造函数。

Parameters:
clientId 用户的client id,从网站中可以获得此信息。
clientSecret 用户的client secret,从网站中可以获得此信息。
opts 一些可选信息,包含: version 当前sdk的版本信息,默认为v2。 host 指定请求的host地址,默认为this.host。 timeout 指定请求超时时间,单位为:秒。用户可以根据自己的场景来设定此值, 例如如果搜索可以设定时间稍短,如果推送文档,可以设定稍长的时间。 connect_timeout 指定连接超时时间,单位为:秒。
keyType 指定当前的用户类型,例如: 如果为KeyTypeEnum.OPENSEARCH则使用client_id和secret 如果为KeyTypeEnum.ALIYUN则用户需要使用阿里云的access key
    public CloudsearchClient(String accesskeyString secret,
            Map<StringObjectoptsKeyTypeEnum keyType) {
        this(nullnullopts);
        this. = accesskey;
        this. = secret;
        this. = keyType;
    }

    
向服务器发出请求并获得返回结果。

Parameters:
path 当前请求的path路径。
params 当前请求的所有参数数组。
method 当前请求的方法,使用CloudsearchClient.METHOD_GET或者 CloudsearchClient.METHOD_POST。
Returns:
String 返回获取的结果。
Throws:
java.io.IOException
java.net.UnknownHostException
    public String call(String pathMap<StringStringparamsString method,
            boolean isPBthrows ClientProtocolExceptionIOException,
            UnknownHostException {
        return call(pathparamsmethodisPBnew StringBuffer());
    }

    
向服务器发出请求并获得返回结果。

Parameters:
path 当前请求的path路径。
params 当前请求的所有参数数组。
method 当前请求的方法,使用CloudsearchClient.METHOD_GET或者 CloudsearchClient.METHOD_POST。
debugInfo 当前请求的调试信息
Returns:
String 返回获取的结果。
Throws:
java.io.IOException
org.apache.http.client.ClientProtocolException
java.net.UnknownHostException
    public String call(String pathMap<StringStringparamsString method,
            boolean isPBStringBuffer debugInfo)
            throws ClientProtocolExceptionIOExceptionUnknownHostException {
        String uri = "";
        if (this. == .) {
            uri = "/" + this. + "/api";
        }
        String url = this. + uri + path;
        TreeMap<StringStringparameters = new TreeMap<StringString>(
                new Comparator<String>() {
                    @Override
                    public int compare(String o1String o2) {
                        return o1.compareTo(o2);
                    }
                });
        parameters.putAll(params);
        if ( == .) {
            parameters.put("client_id"this.);
            parameters.put("nonce"getNonce());
            parameters.put("sign"doSign(parameters));
        } else if ( == .) {
            parameters.put("Version""v2");
            parameters.put("AccessKeyId"this.);
            parameters.put("Timestamp"formatIso8601Date(new Date()));
            parameters.put("SignatureMethod""HMAC-SHA1");
            parameters.put("SignatureVersion""1.0");
            parameters.put("SignatureNonce", UUID.randomUUID().toString());
            parameters.put("Signature"getAliyunSign(parametersmethod));
        }
        if (method == null) {
            method = ;
        }
        debugInfo.setLength(0);
        debugInfo.append(url + getHTTPParamsStr(parameters));
        String result = this.doRequest(urlparametersmethodisPB);
        return result;
    }

    
获取阿里云使用的signature

Parameters:
parameters 参数
Returns:
    private String getAliyunSign(TreeMap<StringStringsortMapString method) {
        boolean isSignMode = false;
        String items = null;
        // 如果有items,先将items排除
        if (sortMap.get("sign_mode") != null
                && sortMap.get("sign_mode").equals("1")
                && sortMap.containsKey("items")) {
            isSignMode = true;
            items = sortMap.get("items");
            sortMap.remove("items");
        }
        try {
            String stringToSign = buildQuery(sortMap);
            stringToSign = method + "&%2F&" + percentEncode(stringToSign);
            // 以下是一段计算签名的示例代码
            final String ALGORITHM = "HmacSHA1";
            final String ENCODING = "UTF-8";
            String accessKeySecret = this. + "&";
            Mac mac = Mac.getInstance(ALGORITHM);
            mac.init(new SecretKeySpec(accessKeySecret.getBytes(ENCODING),
                    ALGORITHM));
            byte[] signData = mac.doFinal(stringToSign.getBytes(ENCODING));
            String signature = new String(Base64.encodeBase64(signData));
            if (isSignMode && items != null) {
                sortMap.put("items"items);// 将之前排除的items补上
            }
            return signature;
        } catch (Exception e) {
            return null;
        }
    }
    public String call(String pathMap<StringStringparamsString method)
            throws ClientProtocolExceptionIOException {
        return call(pathparamsmethodfalse);
    }
    public String call(String pathMap<StringStringparamsString method,
            StringBuffer debugInfothrows ClientProtocolException,
            IOExceptionUnknownHostException {
        return call(pathparamsmethodfalsedebugInfo);
    }
    protected String doRequest(String urlMap<StringStringrequestParams,
            String methodboolean isPBthrows ClientProtocolException,
            IOException {
        String result = "";
        if (method.equals()) {
            result = HttpClientManager.doPost(urlrequestParams"utf-8");
        } else if (method.equals()) {
            url = url + getHTTPParamsStr(requestParams);
            result = HttpClientManager.doGet(url"utf-8"isPB);
        }
        return result;
    }

    
向服务器发出请求并获得返回结果,默认使用Get方法。

Parameters:
path 当前请求的path路径。
params 当前请求的所有参数数组。
Returns:
返回获取的结果。
Throws:
java.io.IOException
org.apache.http.client.ClientProtocolException
    public String call(String pathMap<StringStringparamsboolean isPB)
            throws ClientProtocolExceptionIOException {
        return call(pathparamsisPB);
    }
    protected String getHTTPParamsStr(Map<StringStringparams) {
        if (params == null || params.size() <= 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (Entry<StringStringentry : params.entrySet()) {
            String value = null;
            String key = null;
            try {
                key = percentEncode(entry.getKey());
                value = percentEncode(entry.getValue());
            } catch (UnsupportedEncodingException e) {
                // ignore
            }
            sb.append("&").append(key).append("=").append(value);
        }
        return "?" + sb.substring(1);
    }

    
生成当前的nonce值。 NOTE: time为10位的unix时间戳。

Returns:
返回生成的nonce串。
    private String getNonce() {
        long timestemp = System.currentTimeMillis() / 1000;
        String signStr = new StringBuilder().append(this.).append(
                this.).append(timestemp).toString();
        byte[] bytes = null;
        try {
            bytes = signStr.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            // ignore
        }
        // MD5 加密
        return new StringBuilder().append(DigestUtils.md5Hex(bytes))
                .append(".").append(timestemp).toString();
    }

    
根据参数生成当前的签名。 如果指定了sign_mode且sign_mode为1,则参数中的items将不会被计算签名。 注意

Parameters:
params 需要计算签名的参数列表。
Returns:
返回计算的签名。
    private String doSign(TreeMap<StringStringsortMap) {
        boolean isSignMode = false;
        String items = null;
        if (sortMap.get("sign_mode") != null
                && sortMap.get("sign_mode").equals("1")
                && sortMap.containsKey("items")) {
            isSignMode = true;
            items = sortMap.get("items");
            sortMap.remove("items");
        }
        byte[] bytes = null;
        try {
            bytes = (buildQuery(sortMap) + this.).getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            // ignore
        }
        // MD5 加密
        String md5 = DigestUtils.md5Hex(bytes);
        if (isSignMode && items != null) {
            sortMap.put("items"items);
        }
        return md5;
    }

    
把Map生成http请求需要的参数。

Parameters:
params 需要转换为参数的Map。
Returns:
返回转换完毕的字符串。
    private String buildQuery(TreeMap<StringStringsortMap) {
        StringBuilder query = new StringBuilder();
        try {
            for (Entry<StringStringentry : sortMap.entrySet()) {
                query.append("&").append(percentEncode(entry.getKey())).append(
                        "=").append(percentEncode(entry.getValue()));
            }
        } catch (UnsupportedEncodingException e) {
            // ignore
        }
        return query.substring(1);
    }

    
Java的URLEncode是按照“application/x-www-form-urlencoded”的MIME类型的规则进行编码的。 需要手动替换掉'+','*'和'%7E'

Parameters:
value
Returns:
Throws:
java.io.UnsupportedEncodingException
    private String percentEncode(String value)
            throws UnsupportedEncodingException {
        return value != null ? URLEncoder.encode(value"UTF-8").replace("+",
                "%20").replace("*""%2A").replace("%7E""~") : null;
    }
    private final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";

    
生成符合规范的TimeStamp字符串

Parameters:
date 时间
Returns:
    private String formatIso8601Date(Date date) {
        df.setTimeZone(new SimpleTimeZone(0, "GMT"));
        return df.format(date);
    }
New to GrepCode? Check out our FAQ X