如果一个平台的前端调用另一个平台的后端接口,由于跨域问题,而那边的后端接口不开放安全控制不支持跨域,所以由后端用Java代码模拟http请求,代理发起请求获取数据,然后在组装返回给前端需要的数据结构即可。
这是利用java代码模拟的发起http请求,相当于伪代理
public class HttpRequest {
/**
* 向指定URL发送GET方法的请求
* @param url 发送请求的URL
* @param param 请求参数,请求参数是 name1=value1&name2=value2 的形式。
* @return 远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
log.info(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (IOException e) {
log.info("Send GET request exception!",e);
}finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e) {
log.info("The input stream closes an exception!",e);
}
}
return result;
}
}
这是Callable的实现
public class MyCallable implements Callable<String> {
private String url;
private String param;
public MyCallable(String url,String param){
this.url = url;
this.param = param;
}
@Override
public String call() throws Exception {
String app = HttpRequest.sendGet(url,param);
return app;
}
}
这是具体的执行Controller代码
public class ApplicationController {
@GetMapping(value = "/get")
public PojoResult getApplicationName(){
try {
//发送 GET 请求
String str = HttpRequest.sendGet("url", "param");
List<Atorage> list = new ArrayList<>();
JSONArray jsonArray = JSONObject.parseObject(str).getJSONArray("object");
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject json = jsonArray.getJSONObject(i);
Atorage atorage = new Atorage();
//用这边取到的值作为下面的参数
atorage.setId(json.getInteger("id"));
atorage.setName(json.getString("name"));
//省略构造数据结构的过程。。。。。。
}
// 创建一个线程池
ExecutorService pool = new ThreadPoolExecutor(list.size(), list.size(),
0, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(512),
new ThreadPoolExecutor.DiscardPolicy());
// 创建多个有返回值的任务
List<Future<String>> futures = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Atorage atorage = list.get(i);
List<ProductVO> productVOS = new ArrayList<>();
Integer reginId = atorage.getId();
String url = "https://www.baidu.com/";
String param = reginId;
Callable c = new MyCallable(url,param);
// 执行任务并获取Future对象
Future f = pool.submit(c);
futures.add(f);
}
// 关闭线程池
pool.shutdown();
// 获取所有并发任务的运行结果
for (Future<String> future : futures) {
List<ProductVO> productVOS = new ArrayList<>();
// 从Future对象上获取任务的返回值,并对返回的json数据进行操作
String app = future.get();
//直接操纵json对象,对于没有pojo类的情况
JSONArray appArray = JSONObject.parseObject(app).getJSONObject("object").getJSONArray("dataList");
//沈略封装参数的过程。。。。。。
}
return PojoResultUtil.success(appVOS);
} catch (Exception e) {
log.error("ApplicationController.getApplicationName Exception", e);
return PojoResultUtil.fail(ResBookingMessageCode.SERVER_ERROR);
}
}
}
网友评论