阿里api网关接口客户端demo,java实现源码,其他语言可参考
访问阿里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";//用自己的appKeypublic static String appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//用自己的appSecretpublic static String Host = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-cn-shenzhen.alicloudapi.com";//用自己的Hostpublic 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);//headersMap<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表单时添加此Headerheaders.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);//headersMap<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表单时添加此Headerheaders.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);//headersMap<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表单时添加此Headerheaders.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-typepublic static final String text = "text/plain;charset=UTF-8";// 标准的POST协议Content-typepublic 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;}@Overridepublic 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=vfor (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=vfor (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.*/@Overridepublic 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.*/@Overridepublic 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.*/@Overridepublic X509Certificate[] getAcceptedIssuers() {return sunJSSEX509TrustManager.getAcceptedIssuers();}}public static class TrustAnyHostnameVerifier implements HostnameVerifier {@Overridepublic 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);}@Overridepublic void execute() {JSONObject params = getJSONObject();String phone = params.optString("phone");String password = params.optString("password");//验证账号密码String token = "";if(true){//账号密码验证通过,创建tokentoken = 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
最后 , 这里提供的java客户端代码是针对我当前后端服务器提供的接口所实现,后端服务器接口接收的参数都是post请求 json字符串body传递,所以并没有使用阿里云api网关接口上提供的query字段之类的配置。如果不能满足你的项目需求,用来做参考应该是没问题的。
阿里api网关接口客户端demo,java实现源码,其他语言可参考相关推荐
- 阿里api网关接口创建、发布、授权、调试
阿里api网关接口创建.发布.授权.调试 下面会出现关于签名认证和阿里云api认证的概念以及认证方式的选择,如果这些还不是很清楚的可以看下我的上篇文章: <阿里云api网关的认证方式介绍以及选择 ...
- 微服务之API网关接口设计
微服务之API网关接口设计 API网关,顾名思义,就是外部到内部的一道门,其主要功能: 服务路由:将前段应用的调用请求路由定位并负载均衡到具体的后端微服务实例,对于前端应用看起来就是1个应用提供的服务 ...
- java B2B2C源码电子商务平台 - Zuul回退机制
1.在一些不稳定因素导致路由后面的微服务宕机或者无响应时,zuul 就会累计大量的请求,久而久之基本上所有的请求都会超时,但是请求链接数却不断的在增加,不断的占用资源池不能结束知道超时消耗殆尽导致zu ...
- java ssm 多租户_(十一)java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统- SSO单点登录之OAuth2.0登录流程(2)...
上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...
- 面试官系统精讲Java源码及大厂真题 - 24 举一反三:队列在 Java 其它源码中的应用
24 举一反三:队列在 Java 其它源码中的应用 世上无难事,只要肯登攀. 引导语 队列除了提供 API 供开发者使用外,自身也和 Java 中其他 API 紧密结合,比如线程池和锁,线程池直接使用 ...
- Gateway+Nacos+Sleuth+Zipkin网关链路追踪(测试及源码),Gateway+FeignClient+Nacos通过网关远程调用微服务(一)
Gateway+Nacos+Sleuth+Zipkin网关链路追踪(测试及源码),Gateway+FeignClient+Nacos通过网关远程调用微服务(一) 问题背景 Gateway+Nacos+ ...
- Java Executor源码解析(7)—Executors线程池工厂以及四大内置线程池
详细介绍了Executors线程池工具类的使用,以及四大内置线程池. 系列文章: Java Executor源码解析(1)-Executor执行框架的概述 Java Executor源码解析(2)-T ...
- java B2B2C 源码多租户电子商城系统-Spring Cloud组件详解
我们从整体上来看一下Spring Cloud各个组件如何来配套使用: 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码 一零三八七七四六二六 从上图可以看出 ...
- java B2B2C 源码多租户电子商城系统-Spring Cloud组件详解...
我们从整体上来看一下Spring Cloud各个组件如何来配套使用: 从上图可以看出Spring Cloud各个组件相互配合,合作支持了一套完整的微服务架构. 其中Eureka负责服务的注册与发现, ...
最新文章
- N-LTP:基于预训练模型的中文自然语言处理平台
- OpenCV 脸部跟踪(1)
- java list字符排序吗_List中存放字符串进行排序
- JS的事件对象和事件冒泡
- 详解Java中的clone方法 -- 原型模式
- Java集合:HashMap
- boost实用工具:创建一个禁止复制的类 noncopyable
- HTML/XHTML/HTML5/CSS学习链接
- UIImage指定区域自由拉伸
- 文献学习(part74)--Data Clustering: 50 Years Beyond K-means
- EntityFramework6.X 之 Fulent
- Spring开发--Bean配置实例讲解
- 计算机网络设计 pdf,计算机网络教学设计.pdf
- [Node.js月刊]2018年第1期
- C#里的三种定时器类型
- IEEE_Tec_Digtal Signal Analog Signal
- 软件详细设计的几个参考模板
- 2021-09-13 《鸟叔Linux私房菜》阅读纪录 第一章-Linux是什么如何学习-Linux 是什么Torvalds的Linux 发展
- 【电脑使用】插入SD卡图标是灰色的,点击显示“请将磁盘插入驱动器”
- USB转串口那些事儿—USB转串口工作原理及应用