You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
9.3 KiB
233 lines
9.3 KiB
2 years ago
|
package com.ynxbd.common.helper.xbd;
|
||
|
|
||
|
import com.alibaba.fastjson.JSONObject;
|
||
|
import com.ynxbd.common.helper.common.ErrorHelper;
|
||
|
import com.ynxbd.common.helper.http.OkHttpHelper;
|
||
|
import com.ynxbd.common.result.JsonResult;
|
||
|
import lombok.extern.slf4j.Slf4j;
|
||
|
import okhttp3.*;
|
||
|
|
||
|
import java.io.ByteArrayInputStream;
|
||
|
import java.io.ByteArrayOutputStream;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStream;
|
||
|
import java.net.URLEncoder;
|
||
|
import java.nio.charset.StandardCharsets;
|
||
|
import java.util.*;
|
||
|
import java.util.stream.Collectors;
|
||
|
import java.util.zip.GZIPInputStream;
|
||
|
import java.util.zip.GZIPOutputStream;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @author 李进才
|
||
|
* @ClassName HttpHelper
|
||
|
* @Description 在线病历打印请求的http请求方法
|
||
|
* @date 2023/4/20 09:40
|
||
|
*/
|
||
|
@Slf4j
|
||
|
public class XBDHttpHelper {
|
||
|
/**
|
||
|
* Get执行后台指定方法
|
||
|
* @param methodName 方法名
|
||
|
* @param paramDic 参数
|
||
|
* @return 返回的数据(Json)
|
||
|
*/
|
||
|
public static String ExecMethodGet (String methodName, Object paramDic){
|
||
|
return UseGet(methodName,paramDic);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 直接用lambda传参数的方法
|
||
|
* @param methodName 方法名
|
||
|
* @param params lambda表达式
|
||
|
* @return String
|
||
|
*/
|
||
|
public static String ExecMethodGet(String methodName, JsonResult.MapParams params){
|
||
|
Map<String, Object> requestParams = new HashMap<>();
|
||
|
if (params != null) {
|
||
|
params.setParams(requestParams);
|
||
|
}
|
||
|
return ExecMethodGet(methodName,requestParams);
|
||
|
}
|
||
|
|
||
|
public static String ExecMethodPost(String methodName,JsonResult.MapParams params) throws Exception {
|
||
|
Map<String, Object> requestParams = new HashMap<>();
|
||
|
if (params != null) {
|
||
|
params.setParams(requestParams);
|
||
|
}
|
||
|
log.info("[病案翻拍]未加密前请求-{}",requestParams);
|
||
|
RequestBody requestBody;
|
||
|
List<String> paramsNameList = new ArrayList<>(requestParams.keySet());
|
||
|
JSONObject jsonObj = new JSONObject();
|
||
|
jsonObj.put("method",compress(URLEncoder.encode(EncHelper.AES_Encrypt(methodName),StandardCharsets.UTF_8.toString())));
|
||
|
for (String paramsName:paramsNameList) {
|
||
|
if(requestParams.get(paramsName)==null){
|
||
|
jsonObj.put(paramsName,"");
|
||
|
continue;
|
||
|
}
|
||
|
jsonObj.put(paramsName,compress(URLEncoder.encode(EncHelper.AES_Encrypt(requestParams.get(paramsName).toString()),StandardCharsets.UTF_8.toString())));
|
||
|
}
|
||
|
MediaType jsonMedia = MediaType.parse("application/json; charset=utf-8");
|
||
|
RequestBody formBody = RequestBody.create(jsonMedia, jsonObj.toJSONString());
|
||
|
String test = jsonObj.toJSONString();
|
||
|
log.info("[病案翻拍]加密后请求-{}",test);
|
||
|
return UsePost(methodName,formBody);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Get执行后台指定方法
|
||
|
* @param methodName 方法名
|
||
|
* @return 返回的数据(Json)
|
||
|
*/
|
||
|
public static String ExecMethodGet (String methodName){
|
||
|
return UseGet(methodName,null);
|
||
|
}
|
||
|
|
||
|
private static String UsePost(String methodName, RequestBody requestBody){
|
||
|
OkHttpClient httpClient = OkHttpHelper.creatClient();
|
||
|
Headers.Builder headersBuilder = new Headers.Builder();
|
||
|
HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(XBDHelper.MEDICAL_RECORD_REMAKE_URL + "/api/SqlContext/PostMethodByNameEncryption")).newBuilder();
|
||
|
try (Response response = httpClient.newCall(new Request.Builder().url(urlBuilder.build()).post(requestBody).headers(headersBuilder.build()).build()).execute()) {
|
||
|
JSONObject JSON = JSONObject.parseObject(response.body().string());
|
||
|
if(response.isSuccessful()){
|
||
|
log.info("[在线病例打印]返回:方法名-{},内容-{}",methodName,JSON);
|
||
|
return JSON.getString("Data");
|
||
|
}
|
||
|
else {
|
||
|
log.error("[在线病例打印]返回错误:方法名-{},错误-{}",methodName,JSON.toJSONString());
|
||
|
throw new Exception("方法:" + methodName + "错误:" + JSON.getString("Msg") );
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
log.error("[在线病例打印]请求错误-{}",e.toString());
|
||
|
return e.getMessage();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static String UseGet(String methodName, Object paramDic) {
|
||
|
try {
|
||
|
OkHttpClient httpClient = OkHttpHelper.creatClient();
|
||
|
HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(XBDHelper.MEDICAL_RECORD_REMAKE_URL + "/api/SqlContext/ExecMethodByNameEncryption")).newBuilder();
|
||
|
// 加密序列化
|
||
|
String methodNameEnv = URLEncoder.encode(EncHelper.AES_Encrypt(methodName), StandardCharsets.UTF_8.toString());
|
||
|
urlBuilder.addQueryParameter("methodNameEnc", methodNameEnv);
|
||
|
String paramJson = JSONObject.toJSONString(paramDic==null? "" :paramDic);
|
||
|
// json 加密序列化传入链接
|
||
|
String paramsStrEnv = URLEncoder.encode(EncHelper.AES_Encrypt(paramJson), StandardCharsets.UTF_8.toString());
|
||
|
urlBuilder.addQueryParameter("paramsStrEnc", compress(paramsStrEnv));
|
||
|
String md5Check = URLEncoder.encode(EncHelper.MD5Encrypt64(methodName + paramJson),StandardCharsets.UTF_8.toString());
|
||
|
urlBuilder.addQueryParameter("modCode", md5Check);
|
||
|
|
||
|
|
||
|
Request request = new Request.Builder()
|
||
|
.url(urlBuilder.toString())
|
||
|
.get()
|
||
|
.build();
|
||
|
Response response = httpClient.newCall(request).execute();
|
||
|
// 清除并关闭线程池
|
||
|
// httpClient.dispatcher().executorService().shutdown();
|
||
|
// 清除并关闭连接池
|
||
|
// httpClient.connectionPool().evictAll();
|
||
|
JSONObject JSON = JSONObject.parseObject(response.body().string());
|
||
|
if(response.isSuccessful()){
|
||
|
log.info("[在线病例打印]返回:方法名-{},内容-{}",methodName,JSON);
|
||
|
if("200".equals(JSON.getString("Code"))){
|
||
|
JSON.getString("Data");
|
||
|
return JSON.getString("Data");
|
||
|
}
|
||
|
else {
|
||
|
log.error("[[在线病例打印] 请求错误:json-{}",JSON);
|
||
|
return JSON.toString();
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
log.error("[在线病例打印]返回错误:方法名-{},错误-{}",methodName,JSON.getString("Msg"));
|
||
|
throw new Exception("方法:" + methodName + "错误:" + JSON.getString("Msg") );
|
||
|
}
|
||
|
}
|
||
|
catch (Exception e){
|
||
|
log.error("[在线病例打印]请求错误-{}",e.toString());
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* gzip压缩方法
|
||
|
* @param primStr 压缩字符串
|
||
|
* @return 压缩后的字符
|
||
|
*/
|
||
|
private static String compress(String primStr) {
|
||
|
if (primStr == null || primStr.length() == 0) {
|
||
|
return primStr;
|
||
|
}
|
||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||
|
GZIPOutputStream gzip = null;
|
||
|
try {
|
||
|
gzip = new GZIPOutputStream(out);
|
||
|
gzip.write(primStr.getBytes());
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
} finally {
|
||
|
if (gzip != null) {
|
||
|
try {
|
||
|
gzip.close();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return new sun.misc.BASE64Encoder().encode(out.toByteArray());
|
||
|
}
|
||
|
private static String uncompress(String compressedStr) {
|
||
|
if (compressedStr == null) {
|
||
|
return null;
|
||
|
}
|
||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||
|
ByteArrayInputStream in = null;
|
||
|
GZIPInputStream ginzip = null;
|
||
|
byte[] compressed = null;
|
||
|
String decompressed = null;
|
||
|
try {
|
||
|
compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
|
||
|
in = new ByteArrayInputStream(compressed);
|
||
|
ginzip = new GZIPInputStream(in);
|
||
|
|
||
|
byte[] buffer = new byte[1024];
|
||
|
int offset = -1;
|
||
|
while ((offset = ginzip.read(buffer)) != -1) {
|
||
|
out.write(buffer, 0, offset);
|
||
|
}
|
||
|
decompressed = out.toString();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
} finally {
|
||
|
if (ginzip != null) {
|
||
|
try {
|
||
|
ginzip.close();
|
||
|
} catch (IOException ignored) {
|
||
|
}
|
||
|
}
|
||
|
if (in != null) {
|
||
|
try {
|
||
|
in.close();
|
||
|
} catch (IOException ignored) {
|
||
|
}
|
||
|
}
|
||
|
try {
|
||
|
out.close();
|
||
|
} catch (IOException ignored) {
|
||
|
}
|
||
|
}
|
||
|
return decompressed;
|
||
|
}
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
Map<String,Object> test = new HashMap<>();
|
||
|
test.put("patientID","10333037");
|
||
|
test.put("BorrowNo",-1);
|
||
|
System.out.println(ExecMethodGet("BLSM_Appointment_GetHistoryAppointment", test));
|
||
|
}
|
||
|
}
|