package com.xinxin.everyxday.base.loopj.postdata;
import com.xinxin.everyxday.base.loopj.requestclient.RequestClient;
import com.xinxin.everyxday.util.AndroidOSInfoUtil;
import com.xinxin.everyxday.util.ProjectSettingInfoPreUtil;
import com.xinxin.everyxday.util.SignUtil;
import com.xinxin.everyxday.util.StringUtil;
import com.xinxin.everyxday.util.TimeUtil;
import org.apache.http.Header;
import org.apache.http.message.BasicHeader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
public class CommonRequestHeaderGenerate {
/**
* 请求header封装 (带签名/不带签名)
* @param httpVerb 动作类型(get/post/put)
* @return
*/
public static Header[] generateRequestHeader(String httpVerb,
String jsonStr, boolean isNeedSigned, String urlWithParams) {
String contentType = StringUtil.isEmpty(jsonStr) ? null : RequestClient.CONTENT_TYPE;
if(isNeedSigned){
return CommonRequestHeaderGenerate.generateSignedRequestHeader(contentType, httpVerb, urlWithParams);
}else{
return CommonRequestHeaderGenerate.generateCommonRequestHeader();
}
}
/**
* 生成普通不带签名的请求header
* @return
*/
public static Header[] generateCommonRequestHeader(){
ArrayList<Header> headers = new ArrayList<Header>();
headers.add(new BasicHeader(RequestClient.ACCEPT_KEY, RequestClient.ACCEPT_VALUE));
headers.add(new BasicHeader(RequestClient.USER_AGENT_KEY, generateUserAgent()));
//所有请求带上Access-Key 暂时只有首页晒单列表必须带上
ProjectSettingInfoPreUtil psip = ProjectSettingInfoPreUtil.getInstance();
String accessKey = psip.getAccessKey();
if(!StringUtil.isEmpty(accessKey)){
headers.add(new BasicHeader(RequestClient.ACCESS_KEY, accessKey));
}
Header[] hs = new Header[headers.size()];
return headers.toArray(hs);
}
/**
* 生成带签名的请求header
* @param contentType
* @param httpVerb
* @param urlWithParams
* @return
*/
public static Header[] generateSignedRequestHeader(String contentType, String httpVerb, String urlWithParams){
ArrayList<Header> headers = new ArrayList<Header>();
headers.add(new BasicHeader(RequestClient.HOST_KEY, RequestClient.HOST_VALUE));
headers.add(new BasicHeader(RequestClient.ACCEPT_KEY, RequestClient.ACCEPT_VALUE));
headers.add(new BasicHeader(RequestClient.USER_AGENT_KEY, generateUserAgent()));
if (!StringUtil.isEmpty(contentType))
headers.add(new BasicHeader(RequestClient.CONTENT_TYPE_KEY, contentType));
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
Date now = TimeUtil.getNow();
@SuppressWarnings("deprecation")
Date d = new Date(now.getTime() + now.getTimezoneOffset()*60*1000 + 5*60*1000);////获取当前时间+5分钟
String expires = sdf.format(d);
headers.add(new BasicHeader(RequestClient.EXPIRES_KEY, expires));
ProjectSettingInfoPreUtil psip = ProjectSettingInfoPreUtil.getInstance();
String accessKey = psip.getAccessKey();
String secretKey = psip.getSecretKey();
if (!StringUtil.isEmpty(accessKey) && !StringUtil.isEmpty(secretKey)){
SignUtil su = new SignUtil();
/*
* StringToSign = HTTP-Verb + "\n" +
Content-Type + "\n" +
Expire + "\n" +
ResourceURI; //资源URI,域名后面所有的部分.
*/
StringBuffer stringToSign = new StringBuffer();
stringToSign.append(httpVerb+"\n");
stringToSign.append((StringUtil.isEmpty(contentType)?"":contentType)+"\n");
stringToSign.append(expires+"\n");
stringToSign.append(urlWithParams);
try {
String ssig = su.genAuthorizationValue(stringToSign.toString(), secretKey);
headers.add(new BasicHeader("Authorization", accessKey+":"+ssig));
} catch (Exception e) {
e.printStackTrace();
}
}else{
//accessKey, secretKey不存在,不签名,服务器会直接返回相应错误
}
Header[] hs = new Header[headers.size()];
headers.toArray(hs);
return hs;
}
private static String generateUserAgent(){
StringBuilder userAgentBuilder = new StringBuilder();
userAgentBuilder.append(RequestClient.USER_AGENT_KEY);
userAgentBuilder.append(RequestClient.APP_PROJECT_NAME);
userAgentBuilder.append("/");
userAgentBuilder.append(AndroidOSInfoUtil.getAppVersionName());
userAgentBuilder.append("(");
userAgentBuilder.append(RequestClient.OS);
userAgentBuilder.append(";");
userAgentBuilder.append(AndroidOSInfoUtil.getDeviceModel());
userAgentBuilder.append("/");
userAgentBuilder.append(AndroidOSInfoUtil.getSystemVersion());
userAgentBuilder.append(";");
userAgentBuilder.append(RequestClient.JAVA_VERSION);
userAgentBuilder.append(")");
String accessKey = ProjectSettingInfoPreUtil.getInstance().getAccessKey();
if(StringUtil.isEmpty(accessKey)){
userAgentBuilder.append(" -");
}else{
userAgentBuilder.append(" " + accessKey);
}
return userAgentBuilder.toString();
}
}