`

java 通过HttpsUrlConnection访问接口数据

    博客分类:
  • java
 
阅读更多
server:
  ssl:
    key-store: classpath:key/rsakey.jks
    key-store-password: 123456
    key-store-type: JKS
    key-alias: tomcatjks
    urls: /*
  port: 8443
  non-ssl-port: 8080


1.Http请求工具类
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.json.JSONObject;

public class HttpsGetData {
    private static class TrustAnyTrustManager implements X509TrustManager {
        
        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }
 
        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }
 
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[] {};
        }
    }
 
    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
    
    /**
     * 返回的结果是字符串格式
     * url:请求url
     * hearderKey:请求消息头ke值
     * headerValue:请求消息头key对应的value值
     * requestMethod:请求方式
     * param:json请求参数 
     */
    public String Do(String url,String hearderKey,String headerValue,String requestMethod,String param) throws Exception
    {
         String result = "";
         BufferedReader in = null;
            try {
                System.out.println("请求的URL为:"+url);
                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },new java.security.SecureRandom());
                URL realUrl = new URL(url);
                // 打开URL连接
                HttpsURLConnection connection = (HttpsURLConnection) realUrl.openConnection();
                // 设置https相关属性
                connection.setSSLSocketFactory(sc.getSocketFactory());
                connection.setHostnameVerifier(new TrustAnyHostnameVerifier());
                connection.setDoOutput(true);
                connection.setDoInput(true);
                // 设置通用的请求属性
                connection.setRequestProperty("Content-Type", " application/json");
                connection.setRequestProperty("Connection", "keep-alive");
                connection.setRequestProperty(hearderKey, headerValue);//基于base基本认证							
                connection.setRequestMethod(requestMethod);
                // 建立实际的连接
                connection.connect();
                // 添加请求参数
                if(StringUtil.isNotEmpty(param)){
                	OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());  
                    writer.write(param);
                    writer.flush(); 
                }
                
                // 读取URL的响应结果
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
                System.out.println("获取的结果为:"+result);
            } catch (Exception e) {
                System.out.println("发送请求出现异常!" + e);
                throw e;
            }
            // 使用finally块来关闭输入流
            finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (Exception e2) {
                    //e2.printStackTrace();
                    throw e2;
                }
            }
            return result;
    
    } 
    
}


2.接口服务编写
@SuppressWarnings("unchecked")
	@RequestMapping(value="/getCatHosOrg",method=RequestMethod.POST)
	@ApiOperation(value="xxxxxx查询")
	public ResponseData<CatHosOrgEntity> getCatHosOrg(@RequestBody(required=false) CatHosOrgEntity catHosOrgEntity,
														@RequestParam(defaultValue="1",required=false) int page,
														@RequestParam(defaultValue="15",required=false) int size,
														ComebakColumn comBak){
		QueryParams<xxxx> params = new QueryParams<xxxxx>();
		Page pageSize = new Page();
		pageSize.setPages(page);
		pageSize.setPageSize(size);
		params.setPaging(pageSize);
		params.setEntity(catHosOrgEntity);
		try {
			List<xxxx> catHosOrgList = this.catHosOrgService.queryEntityPage(params);
			jsonObjects = new ArrayList<JSONObject>();
			if(comBak.getList() != null && comBak.getList().size() >0){
				for(CatHosOrgEntity catHosOrgEntitys:catHosOrgList){
					jsonObject = new JSONObject();
					for(Field field:catHosOrgEntitys.getClass().getDeclaredFields()){
						for(String list:comBak.getList()){
							if(field.getName().equals(list)){
								Method method = CatHosOrgEntity.class.getMethod("get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1));
								jsonObject.put(field.getName(),(Object)method.invoke(catHosOrgEntitys));
							}
							
						}
					}
					jsonObjects.add(jsonObject);
				}
				return success(jsonObjects);
			}else {
				return success(catHosOrgList);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			return error("xxx查询");
		}
		
	}


3.拦截器定义
/**
 * 对请求用户进行拦截
 * @author 
 */
public class MvcInteractor implements HandlerInterceptor{
	
	protected Logger log = LoggerFactory.getLogger(MvcInteractor.class);
	
	@SuppressWarnings("all")
	@Override
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
		boolean flag = false;
		String token = request.getHeader("Authorization").substring(7);
		@SuppressWarnings("restriction")
		BASE64Encoder encoder = new BASE64Encoder();
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		PrintWriter out = null;
		JSONObject res = new JSONObject();
		ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
		JdbcTemplate jt = (JdbcTemplate) ac.getBean("jdbcTemplate");
		AppInfoRepository ap = (AppInfoRepository) ac.getBean("appInfoRepository");
		//获取用户信息
		try {
			AppInfo appInfo = ap.findByAppId(request.getParameter("account").toString());
			log.info("认证地址:"+request.getServerName());
			log.info("认证端口:"+request.getServerPort());
			// token验证地址
			String tokenUrl = "https://"+request.getServerName()+":"+request.getServerPort()+"/oauth/token";
			HttpsGetData httpsGetData = new HttpsGetData();
			String tokenResult = httpsGetData.Do(tokenUrl+"?grant_type=client_credentials&scope","Authorization","Basic "+encoder.encode((appInfo.getAppId()+":"+appInfo.getAppKey()).getBytes()),"POST",null);
			// 转成json数据
			JSONObject tokenJSon = new JSONObject(tokenResult);
			if(!tokenJSon.getString("access_token").equals(token)){
				res.put("code", "202");
				res.put("msg", "该账号无权限访问,请联系管理员!token不匹配!");
				out = response.getWriter();
				out.append(res.toString());
				return flag;
			}
			// 判断该APP_ID下面的角色是否有权访问该URL
			StringBuilder sql = new StringBuilder(500);
			sql.append("SELECT A.INTERFACE_URL FROM APP_INTERFACE A LEFT JOIN ROLES_URL R ON A.ID = R.APP_INTERFACE_ID LEFT JOIN ROLES S ON R.ROLE_ID = S.ID WHERE S.ID IN (");
			sql.append("SELECT B.ID FROM APP_ROLES A JOIN ROLES B ON A.ROLE = B.ID WHERE A.APP_ID = ? )") ;
			List<String> urlList = jt.query(sql.toString(),new Object[]{appInfo.getAppId()}, new RowMapper<String>() {
	            @Override
	            public String mapRow(ResultSet resultSet, int i) throws SQLException {
	                return resultSet.getString("interface_url");
	            }
	        });
			for(String url:urlList){
				if(request.getRequestURL().indexOf(url) > -1){
					return true ;
				}
			}
			if(!flag){
				res.put("code", "202");
				res.put("msg", "该账号无权限访问,请联系管理员!");
				out = response.getWriter();
				out.append(res.toString());
			}
		} catch (Exception e) {
			e.getCause();
			log.error("该账号无权限访问,请联系管理员!");
		}	
		return flag;
	}

	@Override
	public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request,HttpServletResponse response,
						 Object handler, Exception ex)throws Exception {
	}
}


4.测试代码
public static void main(String[] args) throws Exception {
		//String clientReq = "appId:appKey";//默认客户端ID和客户端秘钥
		String client_id="appId";//默认客户端ID
		String client_secret = "appKey";//默认客户端秘钥
		BASE64Encoder encoder = new BASE64Encoder();
		BASE64Decoder decoder = new BASE64Decoder();
		//String tokenUrl = "https://101.37.25.220:8091/oauth/token?grant_type=client_credentials&scope";
		String tokenUrl = "https://localhost:8443/oauth/token";
		HttpsGetData httpsGetData = new HttpsGetData();
		List<String> list = new ArrayList<String>();
		/**
		 * 获取返回的token
		 * 注:请求头为Authorization,值为Basic加空格加client_id:client_secret的Base64编码
		 */
		String tokenResult = httpsGetData.Do(tokenUrl+"?grant_type=client_credentials&scope","Authorization","Basic "+encoder.encode((client_id+":"+client_secret).getBytes()),"POST",null);
		JSONObject tokenJSon = new JSONObject(tokenResult);//转成json数据
		String token = tokenJSon.getString("access_token");
		/**
		 * 请求参数为json格式
		 */
		JSONObject paramJson = new JSONObject();
		paramJson.put("modifyDate", "2017-10-30");
//		paramJson.put("facNameF","江西");
//		paramJson.put("convertF","盒");		
//		paramJson.put("nameCn", "片");
//		paramJson.put("smlNameF", "片");
//		paramJson.put("normF", "2G");
		/**
		 * 返回字段为字符串的list集合
		 */
		list.add("facNameF");
		list.add("convertF");
		list.add("nameCn");
		list.add("smlNameF");
		list.add("normF");
		String params = (StringUtils.strip(list.toString(), "[]").replaceAll(" ", ""));//删除集合中的空格
		/**
		 * 分页
		 * 默认:page="1";size="15"
		 * 注:请求头为Authorization,值为Bearer加空格加token
		 */
		String page = "1";
		String size = "10";
//		String resultUrl = "https://localhost:8443/api/v1.0/catZxmedProduct/getCatZxmedProduct?page="+page+"&size="+size+"&list="+params+"&account="+client_id;
		String resultUrl = "https://localhost:8443/api/v1.0/catZxmedProduct/getCatZxmedProductByDate?page="+page+"&size="+size+"&list="+params+"&account="+client_id;
		//String resultUrl = "https://localhost:8443/api/v1.0/demo/HXUDP0000000000000000000000034?account="+client_id;
		//注:若无json请求参数,则paramJson = null;
		httpsGetData.Do(resultUrl,"Authorization","Bearer "+token,"POST",paramJson.toString());//请求获取数据
	}



分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics