package com.mm.android.deviceaddmodule.openapi;
|
|
import android.net.Uri;
|
import android.text.TextUtils;
|
|
import com.google.gson.Gson;
|
import com.google.gson.GsonBuilder;
|
import com.google.gson.JsonElement;
|
import com.google.gson.JsonObject;
|
import com.google.gson.JsonParser;
|
import com.google.gson.reflect.TypeToken;
|
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
|
import java.io.ByteArrayOutputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
import java.net.URL;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.List;
|
import java.util.Map;
|
|
import javax.net.ssl.HttpsURLConnection;
|
|
public class HttpClient {
|
private static final String TAG=HttpClient.class.getSimpleName();
|
/**
|
* post
|
*
|
* @param urlStr
|
* @param paramStr
|
* @param contentType
|
* @param debugTag
|
* @return
|
*/
|
public static String post(String urlStr, String paramStr, String contentType, String debugTag,int timeOut) throws IOException {
|
LogUtil.debugLog(TAG,urlStr+"..."+paramStr);
|
HttpsURLConnection conn = null;
|
String resultData = "";
|
OutputStream outputStream = null;
|
InputStream inputStream = null;
|
ByteArrayOutputStream baos = null;
|
try {
|
URL url = new URL(urlStr);
|
conn = (HttpsURLConnection) url.openConnection();
|
conn.setHostnameVerifier(SSLSocketClient.getHostnameVerifier());
|
conn.setConnectTimeout(timeOut);
|
conn.setReadTimeout(timeOut);
|
conn.setDoOutput(true);
|
conn.setDoInput(true);
|
conn.setRequestMethod("POST");
|
conn.setUseCaches(false);
|
conn.setInstanceFollowRedirects(true);
|
conn.setRequestProperty("Content-Type", contentType);
|
conn.setRequestProperty("Authorization","Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI5MWFjM2FlOWVlMDY0MDY4OWU2NmQzMjQ3MzkxZmQ3MiIsImNvbXBhbnlJZCI6IjIwMiIsInJvbGUiOiIiLCJoZWFkZXJQcmVmaXgiOiJCZWFyZXIgIiwidXNlckFjY291bnQiOiJ3eHIiLCJ0ZW5hbnRJZCI6IjIwIiwidXNlclR5cGUiOiJVU0VSX0IiLCJ0b2tlblR5cGUiOiJhY2Nlc3NfdG9rZW4iLCJ1c2VyTmFtZSI6Ind4ciIsIm9wZW5BcHBsaWNhdGlvbklkIjoiMCIsInVzZXJJZCI6IjEzOTIwMzU1NjgyMDQ0MjMxNjkiLCJleHAiOjE2NjkxMDE2NTEsIm5iZiI6MTY2OTA5NDQ1MX0.BhY5cZDds87lpCOVscCjiH-EnvFSuOFjgXvVkWvGr4elUHFwFTNumhtvfCcQY4Nbu0MNTaPbb36ydNPtXHLAZrXVPdijk_WvnhoTBvA_RUOZOrQ1G4Iep3ZjgHuHam1bsCmgATQqDJR66q3ZiLwe5o_Snce2rAK4aI2Das9uN_M");
|
conn.connect();
|
outputStream = conn.getOutputStream();
|
outputStream.write(paramStr.getBytes());
|
outputStream.flush();
|
outputStream.close();
|
int responseCode = conn.getResponseCode();
|
if (debugTag != null)
|
LogUtil.debugLog(debugTag, "response code " + responseCode);
|
if (200 == responseCode) {
|
inputStream = conn.getInputStream();
|
byte[] buffer = new byte[1024];
|
baos = new ByteArrayOutputStream();
|
boolean var13 = true;
|
int len;
|
while ((len = inputStream.read(buffer)) != -1) {
|
baos.write(buffer, 0, len);
|
}
|
byte[] b = baos.toByteArray();
|
resultData = new String(b, "utf-8");
|
baos.flush();
|
if (debugTag != null)
|
LogUtil.debugLog(debugTag, "request data " + resultData);
|
} else
|
throw new IOException(String.format("http_get failed: status=%d", responseCode));
|
} catch (IOException e) {
|
throw e;
|
} catch (Throwable e) {
|
throw new IOException(e);
|
} finally {
|
try {
|
if (outputStream != null) {
|
outputStream.close();
|
}
|
if (baos != null) {
|
baos.close();
|
}
|
if (inputStream != null) {
|
inputStream.close();
|
}
|
} catch (IOException e) {
|
}
|
if (conn != null) {
|
conn.disconnect();
|
}
|
}
|
return resultData;
|
}
|
|
|
/**
|
* 需要按字母排序
|
*
|
* @param json 所有字段使用urlParameter拼接,除了appSecret
|
*/
|
public static String getSign(JsonObject json, String appSecret) {
|
String builder = jsonToUrlParameter(json) +
|
appSecret;
|
return HDLMD5Utils.encodeMD5(builder);
|
}
|
|
|
private static JsonObject getBodyJson(Map<String,Object> map) {
|
|
JsonObject object = new JsonObject();
|
|
for (Map.Entry<String, Object> entry : map.entrySet()) {
|
object.addProperty(entry.getKey(), entry.getValue().toString());
|
}
|
return object;
|
}
|
|
|
|
|
/**
|
* 添加sign字段
|
*/
|
public static JsonObject encrypt(Map<String,Object> map ) {
|
final String timestamp = String.valueOf(System.currentTimeMillis());
|
final String appKey ="HDL-HOME-APP-TEST";
|
final String appSecret ="WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss";
|
final JsonObject json = getBodyJson(map);
|
if (json != null) {
|
json.addProperty("appKey", appKey);
|
json.addProperty("timestamp", timestamp);
|
json.addProperty("sign", getSign(json, appSecret));
|
}
|
return json;
|
}
|
|
|
|
private static String jsonToUrlParameter(JsonObject object) {
|
final Map<String, String> map = new Gson().fromJson(object, new TypeToken<Map<String, String>>() {
|
}.getType());
|
final Uri.Builder builder = new Uri.Builder();
|
List<String> list = new ArrayList<>(map.keySet());
|
Collections.sort(list);
|
for (String key : list) {
|
//判断当前值是否需要参与签名,保持跟云端一致
|
if (IfValueNeedSign(map.get(key))) {
|
builder.appendQueryParameter(key, map.get(key));
|
// HDLSDKLog.e("要签名:" + key + " :" + map.get(key));
|
} else {
|
// HDLSDKLog.e("不需要签名:" + key + " :" + map.get(key));
|
}
|
}
|
return builder.build().getQuery();
|
}
|
|
/**
|
* 判断当前值是否需要参与签名,保持跟云端一致
|
* 空字符串不参与
|
* 数组,集合,对象不参与
|
*
|
* @param valueStr
|
* @return
|
*/
|
private static boolean IfValueNeedSign(String valueStr) {
|
if (TextUtils.isEmpty(valueStr))
|
return false;
|
final char[] strChar = valueStr.substring(0, 1).toCharArray();
|
final char firstChar = strChar[0];
|
//System.out.println("getJSONType firstChar = "+firstChar);
|
if (firstChar != '{' && firstChar != '[')
|
return true;
|
|
return false;
|
}
|
|
}
|