diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index bf82ff0..0000000 Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index ca5ab4b..0000000 --- a/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,18 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/pom.xml b/pom.xml index 1717a40..1a89111 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,11 @@ org.projectlombok lombok + + com.google.guava + guava + 29.0-jre + diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/CurlUtil.java b/src/main/java/cn/org/bjca/trust/java/imserver/CurlUtil.java new file mode 100644 index 0000000..3fa9e24 --- /dev/null +++ b/src/main/java/cn/org/bjca/trust/java/imserver/CurlUtil.java @@ -0,0 +1,280 @@ +package cn.org.bjca.trust.java.imserver; + +import cn.org.bjca.trust.java.imserver.common.json.GsonImplHelp; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.*; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.ResponseErrorHandler; +import org.springframework.web.client.RestTemplate; + +import java.io.*; +import java.net.URLEncoder; +import java.util.*; +import java.util.zip.GZIPInputStream; + +import static org.springframework.http.HttpMethod.GET; +import static org.springframework.http.HttpMethod.POST; + +@Slf4j +public class CurlUtil { + // 请求结果 + private String result = ""; + + /*** RestTemplate 请求构造内部类*/ + public static class Builder { + // 请求URL + private String url; + // basic auth用户名 + private String userName; + // basic auth密码 + private String passWord; + // 请求方式 默认为GET + private HttpMethod methodType = GET; + // 请求参数 + private HashMap paramMap; + // 请求header头 + private HashMap headerMap; + // RestTemplate 实例 + private RestTemplate client; + // header头实例 + private HttpHeaders headers; + // 请求结果 + private String result; + + /*** 基础请求* @param url*/ + public Builder(String url) { + this.url = url; + } + + + /*** basic auth 认证类型请求* @param url* @param userName* @param passWord*/ + public Builder(String url, String userName, String passWord) { + this.url = url; + this.userName = userName; + this.passWord = passWord; + } + + /*** 添加参数* @param key 参数key* @param value 参数内容* @return Builder*/ + public Builder addParam(String key, String value) { + if (paramMap == null) { + paramMap = new LinkedHashMap<>(16); + } + paramMap.put(key, value); + return this; + } + + /*** 添加header参数* @param key 参数key* @param value 参数内容* @return Builder*/ + public Builder addHeader(String key, String value) { + if (headerMap == null) { + headerMap = new LinkedHashMap<>(16); + } + headerMap.put(key, value); + return this; + } + + /*** GET 请求* @return Curl*/ + public CurlUtil get() { + this.methodType = GET; + this.getResponse(MediaType.APPLICATION_FORM_URLENCODED); + return new CurlUtil(this); + } + + /*** post 请求* @return Curl*/ + public CurlUtil post() { + this.methodType = POST; + this.getResponse(MediaType.APPLICATION_FORM_URLENCODED); + return new CurlUtil(this); + } + + /*** raw 方式提交json 请求* @return Curl*/ + public CurlUtil postRaw() { + HashMap paramRawMap = new HashMap<>(); + return this.raw(paramRawMap); + } + + /*** raw 方式提交json 请求* @param paramRawMap Map数据* @return Curl*/ + public CurlUtil postRaw(HashMap paramRawMap) { + return this.raw(paramRawMap); + } + + /*** RAW 请求* @param paramRawMap 参数* @return*/ + private CurlUtil raw(HashMap paramRawMap) { + client = new RestTemplate(); + client.setErrorHandler(new RestErrorHandler()); + headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + this.setHeadersMapData(); + this.responseRawExchange(GsonImplHelp.get().toJson(paramRawMap)); + return new CurlUtil(this); + } + + /*** 初始化请求体* @param type 请求类型*/ + private void getResponse(MediaType type) { + client = new RestTemplate(); + client.setErrorHandler(new RestErrorHandler()); + headers = new HttpHeaders(); + headers.setContentType(type); + this.setHeadersMapData(); + MultiValueMap params = this.setHttpMethodParamsMap(); + this.responseExchange(params); + } + + /*** 设置header头数据*/ + private void setHeadersMapData() { + if (headerMap != null) { + headerMap.forEach((k, v) -> { + this.headers.set(k, v); + }); + } + // 设置basic auth请求方式认证信息 + if (this.userName != null && this.passWord != null) { + String secretKey = this.userName + ":" + this.passWord; + String authValue = "Basic " + Base64.getEncoder().encodeToString(secretKey.getBytes()); + this.headers.set("Authorization", authValue); + } + } + + /*** 组装请求体参数* @return MultiValueMap*/ + private MultiValueMap setHttpMethodParamsMap() { + MultiValueMap params = new LinkedMultiValueMap<>(); + if (this.methodType.equals(GET)) { + if (this.paramMap != null) { + String _UrlParams = getUrlParamsByMap(this.paramMap); + this.url = this.url + "?" + _UrlParams; + } + + if (this.paramMap != null) { + this.paramMap.forEach((k, v) -> { + params.put(k, Collections.singletonList(v)); + }); + } + } else if (this.methodType.equals(POST)) { + if (this.paramMap != null) { + this.paramMap.forEach((k, v) -> { + params.put(k, Collections.singletonList(v)); + }); + } + } + return params; + } + + /*** 执行Curl请求操作* @param params 请求体参数*/ + private void responseExchange(MultiValueMap params) { + HttpEntity> requestEntity = new HttpEntity<>(params, this.headers); + // 执行HTTP请求,将返回的结构使用spring ResponseEntity处理http响应 + ResponseEntity responseEntity = this.client.exchange(this.url, this.methodType, requestEntity, byte[].class); + String contentEncoding = responseEntity.getHeaders().getFirst(HttpHeaders.CONTENT_ENCODING); + int httpCode = responseEntity.getStatusCodeValue(); + String httpCodeValue = responseEntity.getStatusCode().toString(); + log.info("状态码:{}", httpCodeValue); + try { + if ("gzip".equals(contentEncoding)) { + // gzip解压服务器的响应体 + byte[] data = unGZip(new ByteArrayInputStream(responseEntity.getBody())); + // log.info(new String(data, StandardCharsets.UTF_8)); + this.result = new String(data); + } else { + // 其他编码暂时不做处理(如果需要处理其他编码请自行扩展) + this.result = new String(responseEntity.getBody()); + } + } catch (NullPointerException e) { + log.error("请求错误: {}", e.getMessage()); + this.result = httpCodeValue; + } + } + + /*** 执行Curl Raw JSON请求操作* @param params 请求体参数*/ + private void responseRawExchange(String params) { + HttpEntity requestEntity = new HttpEntity<>(params, this.headers); + // 执行HTTP请求,将返回的结构使用spring ResponseEntity处理http响应 + ResponseEntity responseEntity = this.client.postForEntity(this.url, requestEntity, byte[].class); + String contentEncoding = responseEntity.getHeaders().getFirst(HttpHeaders.CONTENT_ENCODING); + if ("gzip".equals(contentEncoding)) { + // gzip解压服务器的响应体 + byte[] data = unGZip(new ByteArrayInputStream(responseEntity.getBody())); + this.result = new String(data); + } else { + // 其他编码暂时不做处理(如果需要处理其他编码请自行扩展) + this.result = new String(responseEntity.getBody()); + } + } + + /*** Gzip解压缩* @param inputStream 数据流* @return byte[]*/ + private byte[] unGZip(InputStream inputStream) { + byte[] result = null; + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + try { + try (GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream)) { + byte[] buf = new byte[4096]; + int len = -1; + while ((len = gzipInputStream.read(buf, 0, buf.length)) != -1) { + byteArrayOutputStream.write(buf, 0, len); + } + result = byteArrayOutputStream.toByteArray(); + } finally { + byteArrayOutputStream.close(); + } + } catch (IOException e) { + log.error("unGZip error :", e); + } + return result; + } + + /*** 组装GET参数* @param params 参数* @return String*/ + private String getUrlParamsByMap(Map params) { + List keys = new ArrayList(params.keySet()); + Collections.sort(keys); + String prestr = ""; + try { + for (int i = 0; i < keys.size(); i++) { + String key = keys.get(i); + String value = params.get(key); + value = URLEncoder.encode(value, "UTF-8"); + if (i == keys.size() - 1) { + //拼接时,不包括最后一个&字符 + prestr = prestr + key + "=" + value; + } else { + prestr = prestr + key + "=" + value + "&"; + } + } + } catch (UnsupportedEncodingException e) { + log.error("GET params error: {}", e); + } + return prestr; + } + } + + /*** RestTemplate 异常处理*/ + public static class RestErrorHandler implements ResponseErrorHandler { + /*** 判断返回结果response是否是异常结果* 主要是去检查response 的HTTP Status* 仿造DefaultResponseErrorHandler实现即可*/ + @Override + public boolean hasError(ClientHttpResponse response) throws IOException { + int rawStatusCode = response.getRawStatusCode(); + HttpStatus statusCode = HttpStatus.resolve(rawStatusCode); + return (statusCode != null ? statusCode.isError() : hasError(rawStatusCode)); + } + + protected boolean hasError(int unknownStatusCode) { + HttpStatus.Series series = HttpStatus.Series.resolve(unknownStatusCode); + return (series == HttpStatus.Series.CLIENT_ERROR || series == HttpStatus.Series.SERVER_ERROR); + } + + @Override + public void handleError(ClientHttpResponse response) throws IOException { + log.error("handleError:", response); + } + + } + + /*** CurlUtil 实例化* @param builder*/ + public CurlUtil(Builder builder) { + this.result = builder.result; + } + + /*** 结果* @return*/ + public String build() { + return this.result; + } +} diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/ImServerApplication.java b/src/main/java/cn/org/bjca/trust/java/imserver/ImServerApplication.java index e804e41..e3c8b35 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/ImServerApplication.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/ImServerApplication.java @@ -4,9 +4,11 @@ import cn.org.bjca.trust.java.imserver.im.ImManager; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.scheduling.annotation.EnableAsync; @EnableJpaAuditing @SpringBootApplication +@EnableAsync public class ImServerApplication { public static void main(String[] args) { diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/RabbitMqApiUtil.java b/src/main/java/cn/org/bjca/trust/java/imserver/RabbitMqApiUtil.java new file mode 100644 index 0000000..45b7273 --- /dev/null +++ b/src/main/java/cn/org/bjca/trust/java/imserver/RabbitMqApiUtil.java @@ -0,0 +1,47 @@ +package cn.org.bjca.trust.java.imserver; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class RabbitMqApiUtil { + /*** 获取RabbitMq概况* @return*/ + public static String getRabbitMqOverView(String rabbitMqUrl, String userName, String password) { + String url = String.format("%s/api/overview", rabbitMqUrl); + String result = new CurlUtil.Builder(url, userName, password).addHeader("Content-Type", "application/json; charset=utf-8").get().build(); + return result; + } + + /*** 获取RabbitMq vhosts* @return*/ + public static String getRabbitMqVhosts(String rabbitMqUrl, String userName, String password) { + String url = String.format("%s/api/vhosts", rabbitMqUrl); + return new CurlUtil.Builder(url, userName, password).addHeader("Content-Type", "application/json; charset=utf-8").get().build(); + } + + /*** 获取RabbitMq channels* @return*/ + public static String getRabbitMqChannels(String rabbitMqUrl, String userName, String password) { + String url = String.format("%s/api/channels", rabbitMqUrl); + String result = new CurlUtil.Builder(url, userName, password).addHeader("Content-Type", "application/json; charset=utf-8").get().build(); + return result; + } + + /*** 获取RabbitMq nodes* @return*/ + public static String getRabbitMqNodes(String rabbitMqUrl, String userName, String password) { + String url = String.format("%s/api/nodes", rabbitMqUrl); + String result = new CurlUtil.Builder(url, userName, password).addHeader("Content-Type", "application/json; charset=utf-8").get().build(); + return result; + } + + /*** 获取RabbitMq exchanges* @return*/ + public static String getRabbitMqExchanges(String rabbitMqUrl, String userName, String password) { + String url = String.format("%s/api/exchanges", rabbitMqUrl); + String result = new CurlUtil.Builder(url, userName, password).addHeader("Content-Type", "application/json; charset=utf-8").get().build(); + return result; + } + + /*** 获取RabbitMq queues* @param rabbitMqUrl* @param userName* @param password* @return*/ + public static String getRabbitMqQueues(String rabbitMqUrl, String userName, String password) { + String url = String.format("%s/api/queues", rabbitMqUrl); + String result = new CurlUtil.Builder(url, userName, password).addHeader("Content-Type", "application/json; charset=utf-8").get().build(); + return result; + } +} diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/common/RabbitMQHelper.java b/src/main/java/cn/org/bjca/trust/java/imserver/common/RabbitMQHelper.java index 8a08520..82d05c7 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/common/RabbitMQHelper.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/common/RabbitMQHelper.java @@ -1,11 +1,15 @@ package cn.org.bjca.trust.java.imserver.common; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; +@Service public class RabbitMQHelper { public static void requestByGetAndParams(String requestUrl, String param) throws Exception { System.out.println(requestUrl + ":\n" + param); @@ -31,4 +35,29 @@ public class RabbitMQHelper { bout.close(); bout.toByteArray(); } + @Async("asyncExecutor") + public void testIm(String requestUrl, String param) throws Exception { + System.out.println(requestUrl + ":\n" + param); + URL url = new URL(requestUrl); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + //设置请求方式,请求参数类型 + httpURLConnection.setRequestMethod("POST"); + httpURLConnection.setRequestProperty("content-type", "application/json;charset=UTF-8"); + httpURLConnection.setRequestProperty("Authorization", "Basic YWRtaW46YWRtaW4="); + httpURLConnection.setDoOutput(true); + OutputStream outputStream = httpURLConnection.getOutputStream(); + //将参数写入输出流,param必须是JSON格式 + outputStream.write(param.getBytes()); + outputStream.flush(); + InputStream inputStream = httpURLConnection.getInputStream(); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + byte[] bytes = new byte[1024]; + int len = 0; + while ((len = inputStream.read(bytes)) >= 0) { + bout.write(bytes, 0, len); + } + inputStream.close(); + bout.close(); + System.out.println(new String(bout.toByteArray()).toString());; + } } diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/controller/HelloController.java b/src/main/java/cn/org/bjca/trust/java/imserver/controller/HelloController.java index ddfb1c0..e8c7c6f 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/controller/HelloController.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/controller/HelloController.java @@ -1,20 +1,31 @@ package cn.org.bjca.trust.java.imserver.controller; +import cn.org.bjca.trust.java.imserver.common.RabbitMQHelper; import cn.org.bjca.trust.java.imserver.common.TLSSigAPIv2; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.*; @RestController @RequestMapping("hello") public class HelloController { private TLSSigAPIv2 tl; + @GetMapping("/{id}") public String getById(@PathVariable String id) throws Exception { System.out.println("id ==> " + id); return "{\"msg\":\"qdxorigin\",\"code\":200,\"data\":\"Sbfuiaefhaikufhcsauik\"}"; } + @GetMapping("/getUserSig/{id}") public String getUserSig(@PathVariable String id) throws Exception { System.out.println("id ==> " + id); @@ -23,4 +34,93 @@ public class HelloController { return "{\"code\":0,\"data\":{\"userId\":\"" + id + "\",\"userSig\":\"" + tl.genUserSig(id, 2592000) + "\"},\"message\":\"\"}"; } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/"); + + @PostMapping("/upload") + public String upload(MultipartFile file, HttpServletRequest req) { + + System.out.println("-------"); + System.out.println(req.toString()); + System.out.println("-------"); + if (null == file) return "{\n" + + " \"code\": 500,\n" + + " \"message\": \"系统异常\"\n" + + "}"; + String realPath = + req.getSession().getServletContext().getRealPath("/uploadFile/"); + String format = sdf.format(new Date()); + File folder = new File(realPath + format); + String filePath = ""; + if (!folder.isDirectory()) { + folder.mkdirs(); + String oldName = file.getOriginalFilename(); + String newName = UUID.randomUUID().toString() + + oldName.substring(oldName.lastIndexOf("."), oldName.length()); + try { + file.transferTo(new File(folder, newName)); + filePath = req.getScheme() + "://" + req.getServerName() + ":" + + req.getServerPort() + "/uploadFile/" + format + newName; + + } catch (IOException e) { + e.printStackTrace(); + return "上传失败! "; + } + } + return filePath; + } + + @GetMapping("/im/send") + public String testIm() throws Exception { +// new RabbitMQHelper().testIm("https://console.tim.qq.com/v4/group_open_http_svc/send_group_msg?sdkappid=1400810832&identifier=administrator&usersig=eJw1jl0LgjAYRv-Lbgt9t5UuoesyNfrwosAbdUteQltzRhH990Tr8jmHA8*bpPHRUU*NRpGAzRcMAKYDfChDAsIcIONu5TXXGiUJ6AxAUBCcjQalaixecAhyWWODrTW5vZl-ilVvijM-ZO5alXHqbzooaLXKXB-C0yTh2yhM9nH3inb3uhSthuUvtVj3x6gnPMoBqP-5AjnmNEc_&random=" + 4567 + "&contenttype=json", +// "{\"GroupId\":\"89196\",\"Random\":" + Math.abs(new Random().nextInt()) + ",\"From_Account\":\"13812345678\",\"MsgBody\":[{\"MsgType\":\"TIMTextElem\",\"MsgContent\":{\"Text\":\"red packet11111\"}}],\"CloudCustomData\":\"{\\\"doctor\\\":{\\\"name\\\":\\\"扁鹊\\\",\\\"department\\\":\\\"呼吸科\\\",\\\"avatar\\\":\\\"http://pic.imeitou.com/uploads/allimg/2018082917/11s0yqe4ggj.jpg\\\"},\\\"patient\\\":{\\\"name\\\":\\\"曹操\\\",\\\"age\\\":30,\\\"gender\\\":\\\"男\\\",\\\"avatar\\\":\\\"http://pic.imeitou.com/uploads/allimg/2018082917/o33xfvn24ct.jpg\\\"},\\\"createTime\\\":\\\"2020-12-12 12:30\\\"}\",\"SupportMessageExtension\":0,\"OfflinePushInfo\":{\"PushFlag\":0,\"title\":\"[量表填写通知]\",\"Desc\":\"医生[华佗]给您发送了一个开颅量表,请进入应用内填写。\",\"Ext\":\"{\\\"id\\\":\\\"123456\\\"}\"}}"); + createThead(); + System.out.println("-------------------------------"); + + + return "fgvhbjnkm"; + } + + private void createThead() { + ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build(); + ExecutorService singleThreadPool = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy()); + //异步执行的方法 + singleThreadPool.execute(new PatientOtherData()); + singleThreadPool.execute(new PatientOtherData()); + singleThreadPool.execute(new PatientOtherData()); + singleThreadPool.execute(new PatientOtherData()); + singleThreadPool.execute(new PatientOtherData()); + singleThreadPool.execute(new PatientOtherData()); + singleThreadPool.execute(new PatientOtherData()); + singleThreadPool.shutdown(); + + } + + /** + * + */ + private class PatientOtherData implements Runnable { + + public PatientOtherData() { + } + + @Override + public void run() { + + int a = Math.abs(new Random().nextInt()); + int b = Math.abs(new Random().nextInt()); + long c = (long) a + (long) b; + try { + new RabbitMQHelper().testIm("https://console.tim.qq.com/v4/group_open_http_svc/send_group_msg?sdkappid=1400810832&identifier=administrator&usersig=eJw1jl0LgjAYRv-Lbgt9t5UuoesyNfrwosAbdUteQltzRhH990Tr8jmHA8*bpPHRUU*NRpGAzRcMAKYDfChDAsIcIONu5TXXGiUJ6AxAUBCcjQalaixecAhyWWODrTW5vZl-ilVvijM-ZO5alXHqbzooaLXKXB-C0yTh2yhM9nH3inb3uhSthuUvtVj3x6gnPMoBqP-5AjnmNEc_&random=" + 4567 + "&contenttype=json", + "{\"GroupId\":\"89335\",\"Random\":" + c + ",\"From_Account\":\"13812345678\",\"MsgBody\":[{\"MsgType\":\"TIMTextElem\",\"MsgContent\":{\"Text\":\"red packet22222\"}}],\"CloudCustomData\":\"{\\\"doctor\\\":{\\\"name\\\":\\\"扁鹊\\\",\\\"department\\\":\\\"呼吸科\\\",\\\"avatar\\\":\\\"http://pic.imeitou.com/uploads/allimg/2018082917/11s0yqe4ggj.jpg\\\"},\\\"patient\\\":{\\\"name\\\":\\\"曹操\\\",\\\"age\\\":30,\\\"gender\\\":\\\"男\\\",\\\"avatar\\\":\\\"http://pic.imeitou.com/uploads/allimg/2018082917/o33xfvn24ct.jpg\\\"},\\\"createTime\\\":\\\"2020-12-12 12:30\\\"}\",\"SupportMessageExtension\":0,\"OfflinePushInfo\":{\"PushFlag\":0,\"title\":\"[量表填写通知]\",\"Desc\":\"医生[华佗]给您发送了一个开颅量表,请进入应用内填写。\",\"Ext\":\"{\\\"id\\\":\\\"123456\\\"}\"}}"); + + } catch (Exception e) { + + System.out.println(e); + } + + } + } + + }