阿里api网关接口客户端demo,java实现源码,其他语言可参考

版权声明:本文为CSDN博主 无、涯 原创文章,可以转载但请注明出处。联系方式:[email protected] 博客地址 https://blog.csdn.net/a704397849 https://blog.csdn.net/a704397849/article/details/89455262

访问阿里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

最后 , 这里提供的java客户端代码是针对我当前后端服务器提供的接口所实现,后端服务器接口接收的参数都是post请求 json字符串body传递,所以并没有使用阿里云api网关接口上提供的query字段之类的配置。如果不能满足你的项目需求,用来做参考应该是没问题的。

猜你喜欢

转载自blog.csdn.net/a704397849/article/details/89455262
今日推荐