访问阿里api网关接口客户端demo,java实现源码,其他语言可参考
上一篇文章 《阿里api网关接口创建、发布、授权、调试》 中,介绍了3个典型接口的创建并在阿里控制台调试完成,地址:https://blog.csdn.net/a704397849/article/details/89421342
- app用户账号密码登录 ,认证方式: OpenID Connect(模式:获取授权api) & 阿里云APP
- app用户查询用户信息 ,认证方式: OpenID Connect(模式:业务api) & 阿里云APP
- 设备(如:智能故事机)获取播放的资源 ,认证方式: 阿里云APP
本篇介绍 用java实现的客户端如何去访问这3个阿里api网关接口。
阿里官方有提供客户端demo,有java,Android,object-c,php 等语言,但是没有C的实现,github 搜索 aliyun/api-gateway-demo-sign ,可以看到官方提供的哪些语言访问api网关的客户端demo
既然官方已经提供了java语言demo了,那么本篇文章的意义又在哪里呢?
其他语言的demo我没有去看,看了下java的demo源码,虽然封装的比较多,但是可以使用,程序我也跑通了,但是官方没有提供C语言的代码,公司应用前端不仅仅有Android ,IOS,还有C语言开发的设备端。让C语言开发工程师去看java demo,而且还是封装的比较多的java代码,简直不要太坑!所以呢,为了方便和各个前端能快速开发调试api网关接口,我将官方提供的java demo代码 简化提取出来,虽然不是C实现,但是过程还是比较简单、清晰的,参考一下能快速开发出C的客户端实现,其他语言也可以参考这个代码。
AliApiGateWayTest 源码: (代码中用到的 fastjson 和 base64包,在下面有下载链接,如果有需要下载即可)
package test;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* @author zx
*/
public class AliApiGateWayTest {
public static String appKey = "xxxxxxxx";//用自己的appKey
public static String appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//用自己的appSecret
public static String Host = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-cn-shenzhen.alicloudapi.com";//用自己的Host
public static String url = "http://" + Host;
public static void main(String[] args) throws Exception {
//登录
userLogin();
/**
* 查询用户信息
* 参数token值是 userLogin() 登录成功 返回的token
*/
// userQueryPlaylist("eyJhbGciOiJSUzI1NiIsImtpZCI6IjAzNDFhMTFiNTg4NzQ0OWE5MmQxYzU4N2MyZDQ0NzMxIn0.eyJqdGkiOiJoT2xXb2Z3YmE4aUlvZkVPdzhkNlV3IiwiaWF0IjoxNTU1NTc5MTgxLCJleHAiOjE1NTU2NjU1ODEsIm5iZiI6MTU1NTU3OTEyMSwic3ViIjoiWU9VUl9TVUJKRUNUIiwiYXVkIjoiWU9VUl9BVURJRU5DRSIsInVzZXJJZCI6IjExMTcxNyJ9.Kiggtsa--lpXnVqmIRNH7Or0iREwqNk50uKivrL948Z8Jw4_LtBvEHSivhW6i4R8ZSkmNGxIrmbHFcg6NNTlkLjPGSDrqQ0nxyoh_9yKwh11Jof1kOrJo7dgV7MlqdWP2CPG4bDvIbxwMRwVoqcrShdpe-z7uuiotCGJ79Ed5vLXP9GrSn8IroXrFpENRRtp3N_X3wlWOaTpIZIxLRPCy3iHBnXItviVsH9_-sK40_dwSNGFoBcmjI_nFbsnvAFOwxBApUopPgb7T_3D3weVPH8mkgCpWp386el_P4GWJuGm5jSQ0QmWVTLQxKepPpT5HWkW3mnhBxM3KMomAhcZjA");
//设备获取播放资源
// deviceAudioQuery();
}
//用户登录
static void userLogin() throws Exception {
String path = "/user/login";
/*TEST RELEASE PRE */
String stage = "TEST";
String timestamp = System.currentTimeMillis() + "";
String nonce = UUID.randomUUID().toString().replaceAll("-", "");
Http http = new Http(url+path);
//Body内容
JSONObject jo = new JSONObject();
jo.put("phone","188xxxxxxxx");
jo.put("password","123456");
String body = jo.toString();
//body内容用 md5 base64 加密
String contentMd5 = "";
MessageDigest md = MessageDigest.getInstance("MD5");
md.reset();
md.update(body.getBytes("UTF-8"));
byte[] enbytes = new Base64().encode(md.digest());
contentMd5 = new String(enbytes);
//headers
Map<String,String> headers = new HashMap<String, String>();
// headers.put("Host",Host);
// headers.put("gateway_channel","http");
//(必填)根据期望的Response内容类型设置
headers.put("Accept", "application/json");
//(可选)Body MD5,服务端会校验Body内容是否被篡改,建议Body非Form表单时添加此Header
headers.put("Content-MD5",contentMd5 );
//(POST/PUT请求必选)请求Body内容格式
headers.put("Content-Type", "application/text; charset=UTF-8");
headers.put("X-Ca-Timestamp",timestamp);
headers.put("X-Ca-Key",appKey);
headers.put("X-Ca-Stage",stage);
headers.put("X-Ca-Nonce",nonce );
// headers.put("X-Ca-Signature-Headers","X-Ca-Timestamp,X-Ca-Request-Mode,X-Ca-Key,X-Ca-Stage");
headers.put("X-Ca-Signature-Headers","X-Ca-Key,X-Ca-Nonce,X-Ca-Timestamp");
String stringToSign=
"POST" + "\n" +
"application/json" + "\n" +
contentMd5 + "\n" +
"application/text; charset=UTF-8" + "\n" +
"" + "\n" +
"X-Ca-Key:" + appKey + "\n" +
"X-Ca-Nonce:" + nonce + "\n" +
"X-Ca-Timestamp:" + timestamp + "\n" +
path;
String sign = "";
try {
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = appSecret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
sign = new String(Base64.encodeBase64(hmacSha256.doFinal(stringToSign.getBytes("UTF-8"))),"UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
headers.put("X-Ca-Signature",sign);
//设置http的请求头
http.setRequestHeaders(headers);
//http.requestHeadersToISO_8859_1();
//http post 请求
String res = http.post(body);
System.out.println("response body:\n"+new String(res.getBytes("ISO-8859-1"), "UTF-8"));
}
//用户查询用户信息
static void userQueryPlaylist(String token) throws Exception {
String path = "/user/info/query" + "/" + token;
/*TEST RELEASE PRE */
String stage = "TEST";
String timestamp = System.currentTimeMillis() + "";
String nonce = UUID.randomUUID().toString().replaceAll("-", "");
Http http = new Http(url+path);
//Body内容
JSONObject jo = new JSONObject();
jo.put("id",110);
String body = jo.toString();
//body内容用 md5 base64 加密
String contentMd5 = "";
MessageDigest md = MessageDigest.getInstance("MD5");
md.reset();
md.update(body.getBytes("UTF-8"));
byte[] enbytes = new Base64().encode(md.digest());
contentMd5 = new String(enbytes);
//headers
Map<String,String> headers = new HashMap<String, String>();
//headers.put("Host",Host);
//headers.put("X-Ca-Request-Mode","debug");
//headers.put("gateway_channel","http");
//(必填)根据期望的Response内容类型设置
headers.put("Accept", "application/json");
//(可选)Body MD5,服务端会校验Body内容是否被篡改,建议Body非Form表单时添加此Header
headers.put("Content-MD5",contentMd5 );
//(POST/PUT请求必选)请求Body内容格式
headers.put("Content-Type", "application/text; charset=UTF-8");
headers.put("X-Ca-Timestamp",timestamp);
headers.put("X-Ca-Key",appKey);
headers.put("X-Ca-Stage",stage);
headers.put("X-Ca-Nonce",nonce );
headers.put("X-Ca-Signature-Headers","X-Ca-Key,X-Ca-Nonce,X-Ca-Timestamp");
String stringToSign=
"POST" + "\n" +
"application/json" + "\n" +
contentMd5 + "\n" +
"application/text; charset=UTF-8" + "\n" +
"" + "\n" +
"X-Ca-Key:" + appKey + "\n" +
"X-Ca-Nonce:" + nonce + "\n" +
"X-Ca-Timestamp:" + timestamp + "\n" +
path;
String sign = "";
try {
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = appSecret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
sign = new String(Base64.encodeBase64(hmacSha256.doFinal(stringToSign.getBytes("UTF-8"))),"UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
headers.put("X-Ca-Signature",sign);
//设置http的请求头
http.setRequestHeaders(headers);
//http.requestHeadersToISO_8859_1();
//http post 请求
String res = http.post(body);
System.out.println("response body:\n"+new String(res.getBytes("ISO-8859-1"), "UTF-8"));
}
//设备获取播放资源
static void deviceAudioQuery() throws Exception {
String path = "/device/audio/query";
/*TEST RELEASE PRE */
String stage = "TEST";
String timestamp = System.currentTimeMillis() + "";
String nonce = UUID.randomUUID().toString().replaceAll("-", "");
Http http = new Http(url+path);
//Body内容
String body = "";
//body内容用 md5 base64 加密
String contentMd5 = "";
MessageDigest md = MessageDigest.getInstance("MD5");
md.reset();
md.update(body.getBytes("UTF-8"));
byte[] enbytes = new Base64().encode(md.digest());
contentMd5 = new String(enbytes);
//headers
Map<String,String> headers = new HashMap<String, String>();
//headers.put("Host",Host);
//headers.put("X-Ca-Request-Mode","debug");
//headers.put("gateway_channel","http");
//(必填)根据期望的Response内容类型设置
headers.put("Accept", "application/json");
//(可选)Body MD5,服务端会校验Body内容是否被篡改,建议Body非Form表单时添加此Header
headers.put("Content-MD5",contentMd5 );
//(POST/PUT请求必选)请求Body内容格式
headers.put("Content-Type", "application/text; charset=UTF-8");
headers.put("X-Ca-Timestamp",timestamp);
headers.put("X-Ca-Key",appKey);
headers.put("X-Ca-Stage",stage);
headers.put("X-Ca-Nonce",nonce );
headers.put("X-Ca-Signature-Headers","X-Ca-Key,X-Ca-Nonce,X-Ca-Timestamp");
String stringToSign=
"POST" + "\n" +
"application/json" + "\n" +
contentMd5 + "\n" +
"application/text; charset=UTF-8" + "\n" +
"" + "\n" +
"X-Ca-Key:" + appKey + "\n" +
"X-Ca-Nonce:" + nonce + "\n" +
"X-Ca-Timestamp:" + timestamp + "\n" +
path;
String sign = "";
try {
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = appSecret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
sign = new String(Base64.encodeBase64(hmacSha256.doFinal(stringToSign.getBytes("UTF-8"))),"UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
headers.put("X-Ca-Signature",sign);
//设置http的请求头
http.setRequestHeaders(headers);
//http.requestHeadersToISO_8859_1();
//http post 请求
String res = http.post(body);
System.out.println("response body:\n"+new String(res.getBytes("ISO-8859-1"), "UTF-8"));
}
}
上面代码中用到的Http请求工具类源码: (注,不一定要用我提供的http工具,自己常用的http工具也是可以的)
package test;
import com.alibaba.fastjson.JSON;
import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
import javax.net.ssl.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.zip.GZIPInputStream;
/**
* Http协议工具
*
* @author
*/
public class Http {
// 文本协议Content-type
public static final String text = "text/plain;charset=UTF-8";
// 标准的POST协议Content-type
public static final String post = "application/x-www-form-urlencoded;charset=UTF-8";
public enum ContentType {
asf("video/x-ms-asf"), avi("video/avi"), mpg("ivideo/mpeg"), gif("image/gif"), jpg("image/jpeg"), bmp("image/bmp"), png("image/png"), wav(
"audio/wav"), mp3("audio/mpeg3"), html("text/html"), txt("text/plain"), zip("application/zip"), doc("application/msword"), xls(
"application/vnd.ms-excel"), rtf("application/rtf"), all("application/octet-stream");
private String type;
private ContentType(String type) {
this.type = type;
}
public String getType() {
return type;
}
@Override
public String toString() {
return type;
}
}
protected String httpURL;
protected URL url;
// 请求头参数
protected Map<String, String> requestProperty = new HashMap<String, String>();
// 连接超时时间
protected int connectTimeout = 5000;
// 响应超时时间
protected int readTimeout = 5000;
// 编码
protected String charset = "iso8859-1";
/**
* @param httpURL
* {@link String} URL地址
* @throws Exception
*/
public Http(String httpURL) throws Exception {
this.httpURL = httpURL;
init();
}
public void setRequestHeaders(Map<String,String> requestHeaders){
this.requestProperty = requestHeaders;
}
public void requestHeadersToISO_8859_1(){
if(requestProperty == null){
return;
}
Set<String> keySet = requestProperty.keySet();
try {
for (String key:keySet) {
requestProperty.put(key,new String(requestProperty.get(key).getBytes("UTF-8"), "ISO-8859-1"));
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 自定义POST请求
*
* @param params
* {@link String} post请求参数
* @return 响应
* @throws Exception
*/
public String post(String params) throws Exception {
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
if (httpURL.startsWith("https")) {
HttpsURLConnection hucs = (HttpsURLConnection) huc;
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
hucs.setSSLSocketFactory(ssf);
HttpsURLConnection.setDefaultSSLSocketFactory(ssf);
hucs.setHostnameVerifier(new TrustAnyHostnameVerifier());
}
huc.setRequestMethod("POST");
huc.setDoOutput(true);
huc.setDoInput(true);
huc.setConnectTimeout(connectTimeout);
huc.setReadTimeout(readTimeout);
for (String property : requestProperty.keySet()) {
huc.setRequestProperty(property, requestProperty.get(property));
}
huc.connect();
OutputStream out = huc.getOutputStream();
out.write(params.toString().getBytes(charset));
out.flush();
out.close();
String err = checkError(huc);
if (err != null) {
return err;
}
System.out.println("返回的头:\n"+JSON.toJSONString(huc.getHeaderFields()));
BufferedReader in = new BufferedReader(new InputStreamReader(huc.getInputStream(), charset));
StringBuffer resp = new StringBuffer();
String s = in.readLine();
while (s != null) {
resp.append(s);
s = in.readLine();
}
in.close();
return resp.toString();
}
/**
* 标准POST请求
*
* @param params
* {@link Map<String, String>} post请求参数
* @return 响应
* @throws Exception
*/
public String post(Map<String, String> params) throws Exception {
StringBuffer s = new StringBuffer();
// k=v&k=v
for (String k : params.keySet()) {
s.append("&").append(k).append("=").append(params.get(k));
}
s.deleteCharAt(0);
return post(s.toString());
}
/**
* 发送文件
*
* @param fileParamName
* {@link String} 文件参数名
* @param fileName
* {@link String} 文件名
* @param file
* {@link byte[]}文件
* @return 响应
* @throws Exception
*/
public String post(String fileParamName, String fileName, byte[] file) throws Exception {
return post(fileParamName, fileName, file, null);
}
/**
* 发送文件和参数
*
* @param fileParamName
* {@link String} 文件参数名
* @param fileName
* {@link String} 文件名
* @param file
* {@link byte[]}文件
* @param params
* {@link Map<String, String>} 参数
* @return 响应
* @throws Exception
*/
public String post(String fileParamName, String fileName, byte[] file, Map<String, String> params) throws Exception {
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
if (httpURL.startsWith("https")) {
HttpsURLConnection hucs = (HttpsURLConnection) huc;
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
hucs.setSSLSocketFactory(ssf);
HttpsURLConnection.setDefaultSSLSocketFactory(ssf);
hucs.setHostnameVerifier(new TrustAnyHostnameVerifier());
}
huc.setRequestMethod("POST");
huc.setDoOutput(true);
huc.setDoInput(true);
huc.setConnectTimeout(connectTimeout);
huc.setReadTimeout(readTimeout);
// 分割
String boundary = "-----------------------------114975832116442893661388290519";
huc.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
boundary = "--" + boundary;
StringBuffer sb = new StringBuffer();
// 参数
if (params != null) {
for (Iterator<String> it = params.keySet().iterator(); it.hasNext();) {
String k = it.next();
String v = params.get(k);
sb.append(boundary).append("\r\n");
sb.append("Content-Disposition: form-data; name=\"" + k + "\"\r\n\r\n");
sb.append(v).append("\r\n");
}
}
// 文件
sb.append(boundary).append("\r\n");
sb.append("Content-Disposition: form-data; name=\"" + fileParamName + "\"; filename=\"" + fileName + "\"\r\n");
sb.append("Content-Type: " + getContentType(fileName) + " \r\n\r\n");
huc.connect();
OutputStream out = huc.getOutputStream();
out.write(sb.toString().getBytes(charset));
out.write(file);
out.flush();
out.close();
String err = checkError(huc);
if (err != null) {
return err;
}
BufferedReader in = new BufferedReader(new InputStreamReader(huc.getInputStream(), charset));
StringBuffer resp = new StringBuffer();
String s = in.readLine();
while (s != null) {
resp.append(s);
s = in.readLine();
}
in.close();
return resp.toString();
}
// /**
// * 响应文件
// *
// * @param resp
// * {@link HttpServletResponse}
// * @param fileName
// * {@link String} 文件名
// * @param file
// * {@link byte[]} 文件
// * @return boolean
// * @throws Exception
// */
// public static boolean response(HttpServletResponse resp, String fileName, byte[] file) {
// if (resp == null || fileName == null || "".equals(fileName.trim()) || file == null || file.length == 0) {
// throw new NullPointerException("param is null");
// }
// try {
// fileName = new String(fileName.getBytes("GBK"), "ISO8859-1");
// } catch (Throwable e) {
// e.printStackTrace();
// }
// resp.reset();
// resp.setCharacterEncoding("UTF-8");
// resp.addHeader("Content-Disposition", "attachment;filename=" + fileName + ";");
// resp.setContentType(getContentType(fileName));
// try {
// OutputStream out = resp.getOutputStream();
// out.write(file);
// out.flush();
// out.close();
// } catch (Throwable e) {
// return false;
// }
// return true;
// }
/**
* GET请求
*
* @param params
* {@link Map<String, String>} 参数
* @return {@link String} 响应
* @throws Exception
*/
public String get(Map<String, String> params) throws Exception {
StringBuffer s = new StringBuffer();
// k=v&k=v
for (String k : params.keySet()) {
s.append("&").append(k).append("=").append(params.get(k));
}
s.deleteCharAt(0);
return get(httpURL + "?" + s.toString());
}
/**
* GET请求
*
* @return {@link String} 响应
* @throws Exception
*/
public String get() throws Exception {
return get(httpURL);
}
/**
* GET请求,返回内容是gzip格式,解码返回字符串
*
* @return {@link String} 响应
* @throws Exception
*/
public String get_decode_gzip() throws Exception {
return get_decode_gzip(httpURL);
}
/**
* GET请求
*
* @return {@link String} 响应
* @throws Exception
*/
protected String get(String httpURL) throws Exception {
URL url = new URL(httpURL);
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
if (httpURL.startsWith("https")) {
HttpsURLConnection hucs = (HttpsURLConnection) huc;
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
hucs.setSSLSocketFactory(ssf);
HttpsURLConnection.setDefaultSSLSocketFactory(ssf);
hucs.setHostnameVerifier(new TrustAnyHostnameVerifier());
}
huc.setRequestMethod("GET");
huc.setDoOutput(false);
huc.setDoInput(true);
huc.setConnectTimeout(connectTimeout);
huc.setReadTimeout(readTimeout);
for (String property : requestProperty.keySet()) {
huc.setRequestProperty(property, requestProperty.get(property));
}
huc.connect();
String err = checkError(huc);
if (err != null) {
return err;
}
BufferedReader in = new BufferedReader(new InputStreamReader(huc.getInputStream(), charset));
StringBuffer resp = new StringBuffer();
String s = in.readLine();
while (s != null) {
resp.append(s);
s = in.readLine();
}
in.close();
return resp.toString();
}
/**
* GET请求,返回内容是gzip格式,解码返回字符串
*
* @return {@link String} 响应
* @throws Exception
*/
protected String get_decode_gzip(String httpURL) throws Exception {
URL url = new URL(httpURL);
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
if (httpURL.startsWith("https")) {
HttpsURLConnection hucs = (HttpsURLConnection) huc;
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
hucs.setSSLSocketFactory(ssf);
HttpsURLConnection.setDefaultSSLSocketFactory(ssf);
hucs.setHostnameVerifier(new TrustAnyHostnameVerifier());
}
huc.setRequestMethod("GET");
huc.setDoOutput(false);
huc.setDoInput(true);
huc.setConnectTimeout(connectTimeout);
huc.setReadTimeout(readTimeout);
for (String property : requestProperty.keySet()) {
huc.setRequestProperty(property, requestProperty.get(property));
}
huc.connect();
String err = checkError(huc);
if (err != null) {
return err;
}
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(huc.getInputStream()), charset));
StringBuffer resp = new StringBuffer();
String s = in.readLine();
while (s != null) {
resp.append(s);
s = in.readLine();
}
in.close();
return resp.toString();
}
public ByteInputStream getByteInputStream() throws Exception {
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
if (httpURL.startsWith("https")) {
HttpsURLConnection hucs = (HttpsURLConnection) huc;
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
hucs.setSSLSocketFactory(ssf);
HttpsURLConnection.setDefaultSSLSocketFactory(ssf);
hucs.setHostnameVerifier(new TrustAnyHostnameVerifier());
}
huc.setRequestMethod("GET");
huc.setDoOutput(false);
huc.setDoInput(true);
huc.setConnectTimeout(connectTimeout);
huc.setReadTimeout(readTimeout);
huc.setRequestProperty("Content-type", "text/plain;charset=" + charset);
huc.connect();
String err = checkError(huc);
if (err != null) {
return null;
}
int countent_length = huc.getContentLength();
byte[] datas = new byte[countent_length];
InputStream is = huc.getInputStream();
is.read(datas);
ByteInputStream bis = new ByteInputStream(datas, countent_length);
return bis;
}
/**
* 获取文件类型
*
* @param fileName
* {@link String}
* @return {@link String}
*/
public static String getContentType(String fileName) {
String filename = fileName.toLowerCase();
if (filename.endsWith(".asf")) {
return ContentType.asf.toString();
} else if (filename.endsWith(".avi")) {
return ContentType.avi.toString();
} else if (filename.endsWith(".mpg") || filename.endsWith(".mpeg")) {
return ContentType.mpg.toString();
} else if (filename.endsWith(".gif")) {
return ContentType.gif.toString();
} else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg")) {
return ContentType.jpg.toString();
} else if (filename.endsWith(".bmp")) {
return ContentType.bmp.toString();
} else if (filename.endsWith(".png")) {
return ContentType.png.toString();
} else if (filename.endsWith(".wav")) {
return ContentType.wav.toString();
} else if (filename.endsWith(".mp3")) {
return ContentType.mp3.toString();
} else if (filename.endsWith(".htm") || filename.endsWith(".html")) {
return ContentType.html.toString();
} else if (filename.endsWith(".txt")) {
return ContentType.txt.toString();
} else if (filename.endsWith(".zip")) {
return ContentType.zip.toString();
} else if (filename.endsWith(".doc")) {
return ContentType.doc.toString();
} else if (filename.endsWith(".xls")) {
return ContentType.xls.toString();
} else if (filename.endsWith(".rtf")) {
return ContentType.rtf.toString();
}
return ContentType.all.toString();
}
/**
* 检查错误
*
* @param huc
* {@link HttpURLConnection}
* @return {@link String}
* @throws Exception
*/
private static String checkError(HttpURLConnection huc) throws Exception {
if (huc.getResponseCode() == HttpURLConnection.HTTP_INTERNAL_ERROR // 500
|| huc.getResponseCode() == HttpURLConnection.HTTP_BAD_REQUEST // 400
|| huc.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED // 401
) {
System.out.println("返回的头:\n"+JSON.toJSONString(huc.getHeaderFields()));
StringBuffer resp = new StringBuffer();
BufferedReader in = new BufferedReader(new InputStreamReader(huc.getErrorStream(), "ISO8859-1"));
String s = in.readLine();
while (s != null) {
resp.append(s).append("\n");
s = in.readLine();
}
in.close();
return resp.toString();
}
return null;
}
//
private void init() throws Exception {
if (httpURL == null || (!httpURL.startsWith("http://") && !httpURL.startsWith("https://"))) {
throw new NullPointerException("param is't url-" + httpURL);
}
url = new URL(httpURL);
requestProperty.put("Content-type", text);
// requestProperty.put("Content-type", post);
}
public static class MyX509TrustManager implements TrustManager, X509TrustManager {
X509TrustManager sunJSSEX509TrustManager;
MyX509TrustManager() throws Exception {
// create a "default" JSSE X509TrustManager.
System.setProperty("javax.net.ssl.trustStore", "*.keystore");
System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
System.setProperty("java.protocol.handler.pkgs", "javax.net.ssl");
KeyStore ks = KeyStore.getInstance("JKS");
// ks.load(new
// FileInputStream("trustedCerts"),"passphrase".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", "SunJSSE");
tmf.init(ks);
TrustManager tms[] = tmf.getTrustManagers();
/*
* Iterate over the returned trustmanagers, look for an instance of
* X509TrustManager. If found, use that as our "default" trust
* manager.
*/
for (int i = 0; i < tms.length; i++) {
if (tms[i] instanceof X509TrustManager) {
sunJSSEX509TrustManager = (X509TrustManager) tms[i];
return;
}
}
/*
* Find some other way to initialize, or else we have to fail the
* constructor.
*/
throw new Exception("Couldn't initialize");
}
/*
* Delegate to the default trust manager.
*/
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
try {
sunJSSEX509TrustManager.checkClientTrusted(chain, authType);
} catch (CertificateException excep) {
// do any special handling here, or rethrow exception.
}
}
/*
* Delegate to the default trust manager.
*/
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
try {
sunJSSEX509TrustManager.checkServerTrusted(chain, authType);
} catch (CertificateException excep) {
/*
* Possibly pop up a dialog box asking whether to trust the cert
* chain.
*/
}
}
/*
* Merely pass this through.
*/
@Override
public X509Certificate[] getAcceptedIssuers() {
return sunJSSEX509TrustManager.getAcceptedIssuers();
}
}
public static class TrustAnyHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
}
public String getHttpURL() {
return httpURL;
}
public int getConnectTimeout() {
return connectTimeout;
}
/**
* 设置连接超时时间
*
* @param connectTimeout
* {@link int} 毫秒
*/
public void setConnectTimeout(int connectTimeout) {
if (connectTimeout < 1) {
return;
}
this.connectTimeout = connectTimeout;
}
public int getReadTimeout() {
return readTimeout;
}
/**
* 设置响应超时时间
*
* @param readTimeout
* {@link int} 毫秒
*/
public void setReadTimeout(int readTimeout) {
if (readTimeout < 1) {
return;
}
this.readTimeout = readTimeout;
}
/**
* 设置请求头参数
*
* @param key
* {@link String}
* @param value
* {@link String}
*/
public void setRequestProperty(String key, String value) {
requestProperty.put(key, value);
}
/**
* 设置编码
*
* @param charset
* {@link String}
*/
public void setCharset(String charset) {
this.charset = charset;
}
}
用到的 fastjson 和 base64 jar包
链接:https://pan.baidu.com/s/1rcN5PZwx2PmoALfihsgPpA
提取码:dw47
上述源码运行结果
- 运行 userLogin()
返回结果(在阿里云api网关上Mock模式固定返回的结果)如下:
{ "ret":"0", "token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IjAzNDFhMTFiNTg4NzQ0OWE5MmQxYzU4N2MyZDQ0NzMxIn0.eyJqdGkiOiJoT2xXb2Z3YmE4aUlvZkVPdzhkNlV3IiwiaWF0IjoxNTU1NTc5MTgxLCJleHAiOjE1NTU2NjU1ODEsIm5iZiI6MTU1NTU3OTEyMSwic3ViIjoiWU9VUl9TVUJKRUNUIiwiYXVkIjoiWU9VUl9BVURJRU5DRSIsInVzZXJJZCI6IjExMTcxNyJ9.Kiggtsa--lpXnVqmIRNH7Or0iREwqNk50uKivrL948Z8Jw4_LtBvEHSivhW6i4R8ZSkmNGxIrmbHFcg6NNTlkLjPGSDrqQ0nxyoh_9yKwh11Jof1kOrJo7dgV7MlqdWP2CPG4bDvIbxwMRwVoqcrShdpe-z7uuiotCGJ79Ed5vLXP9GrSn8IroXrFpENRRtp3N_X3wlWOaTpIZIxLRPCy3iHBnXItviVsH9_-sK40_dwSNGFoBcmjI_nFbsnvAFOwxBApUopPgb7T_3D3weVPH8mkgCpWp386el_P4GWJuGm5jSQ0QmWVTLQxKepPpT5HWkW3mnhBxM3KMomAhcZjA"}
- 运行 userQueryUserInfo(token); //token值是用户登录返回的token
返回结果如下:
返回异常 , 401
打印返回头信息,如下
{
null:["HTTP/1.1 401 Unauthorized"],
"X-Ca-Error-Message":["OpenId Connect Verify Fail: 241, idToken expired"],"Server":["Tengine"],"Access-Control-Allow-Origin":["*"],"Access-Control-Allow-Methods":["GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH"],"Connection":["keep-alive"],"Access-Control-Max-Age":["172800"],"Content-Length":["0"],"X-Ca-Request-Id":["87A74F9F-BE3C-421D-87F1-21344E9DDF06"],"Access-Control-Allow-Headers":["X-Requested-With,X-Sequence,X-Ca-Key,X-Ca-Secret,X-Ca-Version,X-Ca-Timestamp,X-Ca-Nonce,X-Ca-API-Key,X-Ca-Stage,X-Ca-Client-DeviceId,X-Ca-Client-AppId,X-Ca-Signature,X-Ca-Signature-Headers,X-Ca-Signature-Method,X-Forwarded-For,X-Ca-Date,X-Ca-Request-Mode,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range,Content-MD5"],"Date":["Mon, 22 Apr 2019 07:24:46 GMT"],"Content-Type":["application/json; charset=UTF-8"]}
报错:idToken expired , 这是因为我们在阿里api网关接口上创建的用户登录接口采用了Mock模式,固定返回了一个登录结果,每次返回的token 一直没变。下面等会会在服务器后端实现认证服务器接口,实际创建一个用户登录获取token的接口,api网关用户登录接口不再使用mock模式固定返回,而是去请求后端的登录接口。
- 运行 deviceAudioQuery()
{ "ret":"0", "url":"http://xxxx.mp3"}
阿里云api网关用户登录接口不再返回mock模式固定结果,而是访问服务器后端认证服务器登录接口
- 1 在后端服务器添加一个简单的用户登录接口 (只是为了测试,后端并没有去保存token)
import frame.http.HttpCmd;
import org.json.JSONObject;
import service.v2.AuthorizationServer.AsServer;
/**
* 账号密码登录接口
* @author Administrator
*
*/
public class HttpCmdUserLoginTest extends HttpCmd {
static {
HttpCmd.register("/user/login",HttpCmdUserLoginTest.class);
}
@Override
public void execute() {
JSONObject params = getJSONObject();
String phone = params.optString("phone");
String password = params.optString("password");
//验证账号密码
String token = "";
if(true){
//账号密码验证通过,创建token
token = AsServer.createIdToken(phone+"");
}
//保存账号和token
//...
result.put("ret", "0");
result.put("phone", phone);
result.put("token", token);
response(result);
}
}
注: 篇幅问题,这里就不介绍这个接口所用框架实现,这个接口大致意思就是 从http请求的body参数中拿到 phone(账号) 和 密码, 验证账号、密码 成功后创建token,保存账号和token , 然后返回token 。 创建token 的AsServer 类 在上一篇文章有介绍。
- 2 服务器后端提供了登录接口,我们还要在阿里api网关,编辑’用户登录接口’访问后端定义那里将mock模式固定返回改为访问服务器后端指定接口,如下图:
- 3 改完保存后,要重新发布到测试,如下图
重新测试运行 userLogin() 和 userQueryUserInfo(token) 接口
这次访问登录时真是的登录接口返回有效的token
- 1 运行 userLogin() 接口,返回结果如下:
{"ret":"0","phone":"18823732089","cmd":"/user/login/response","token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IjAzNDFhMTFiNTg4NzQ0OWE5MmQxYzU4N2MyZDQ0NzMxIn0.eyJqdGkiOiItX005TU85N3Qxa1o4dHVfdXVfRGJRIiwiaWF0IjoxNTU1OTIwMjk1LCJleHAiOjE1NTYwMDY2OTUsIm5iZiI6MTU1NTkyMDIzNSwic3ViIjoiWU9VUl9TVUJKRUNUIiwiYXVkIjoiWU9VUl9BVURJRU5DRSIsInVzZXJJZCI6IjE4ODIzNzMyMDg5In0.WmvIBayeXGFXTs2lkVfu60QGj7nSsnLSpt2BpdrZrorYU8bvxZISS_xu3iZT9OR3jPtkieKOns11ky3fKAM4In9DjOPCIOD5sMQFn6byZcNjhPBmRSg89nW6sogfahPTM2eVwM4ey2mBK8u8S2limjPrC3sOJA8sGMh76To-Hp7g-f2MYnSaQtaI6JoCFL0TCSDqLID3yZDpJkbPwllopZFXIwsYgPtspoXZXXMa4w4zWSuXwi6CQUo-J8DH21CRM5G4Y8cFuE9nm52DE6_4VMHbMgCl5vr7wf9g-NnDYqQV6SIpooop5BzOfZaYKvv9vzk7-mdN6MdJGOHg2Hh6tQ"}
- 2 运行 userQueryUserInfo(token) 接口 ,token 是刚刚登录成功后返回的token,返回结果如下
{ "ret","0", "id","110", "nickname":"小明" }
测试成功了! 这次并没有报错.
注意: 上述api网关接口发布的是测试,正式上线接口 ,代码中的stage要改为 RELEASE