package com.ycl.controller.platformApi; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.ycl.annotation.LogSave; import com.ycl.api.CommonResult; import com.ycl.dto.v1.Req.FirstReq; import com.ycl.dto.v1.Req.SecondReq; import com.ycl.dto.v1.Res.FirstRes; import com.ycl.dto.video.AlarmParam; import com.ycl.enums.common.ResultCode; import com.ycl.utils.MD5Util; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.DefaultResponseErrorHandler; import org.springframework.web.client.RestTemplate; import java.net.URI; @Api(tags = "第三方接口-大华") @RestController @RequestMapping("/API/videoService/eventCenter/messages") public class TranspondDHController { @Value("${videoPoint.web_url}") private String url; @Value("${videoPoint.userName}") private String userName; @Value("${videoPoint.passWord}") private String passWord; @Value("${videoPoint.ip}") private String ip; @ApiOperation("消息订阅") @GetMapping("/subscribeAddress") public CommonResult subscribeAddress() { String url = "/videoService/eventCenter/messages/subscribeAddress"; return getResult(url, ""); } @ApiOperation("长轮询获取消息") @GetMapping("/subscribe") public CommonResult subscribe(@RequestParam Integer type, @RequestParam Integer msgId, @RequestParam(required = false) Integer msgNum, @RequestParam(required = false) Integer waitSec) { String url = "/videoService/eventCenter/messages/subscribe"; String param = "?type=" + type + "&msgId=" + msgId + "&waitSec=" + waitSec + "&msgNum=" + msgNum; return getResult(url, param); } private CommonResult getResult(String reqUrl, String param) { try { String token = getToken(); System.out.println("定位接口url:" + url + reqUrl + param); HttpHeaders deviceHeaders = new HttpHeaders(); ObjectMapper objectMapper = new ObjectMapper(); deviceHeaders.add("X-Subject-Token", token); HttpEntity deviceEntity = new HttpEntity<>(deviceHeaders); RestTemplate restTemplate = new RestTemplate(); ResponseEntity exchange = restTemplate.exchange(url + reqUrl + param, HttpMethod.GET, deviceEntity, String.class); System.out.println(exchange); return CommonResult.success(exchange); } catch (Exception ex) { System.out.println("定位接口错误:" + ex.getMessage()); return CommonResult.failed(); } } private String getToken() throws JsonProcessingException { String clientType = "winpc"; String reqUrl = "/videoService/accounts/authorize"; RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new DefaultResponseErrorHandler() { @Override public boolean hasError(HttpStatus status) { return super.hasError(status); } @Override public void handleError(URI url, HttpMethod method, ClientHttpResponse response) { } }); SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); simpleClientHttpRequestFactory.setOutputStreaming(false); restTemplate.setRequestFactory(simpleClientHttpRequestFactory); //请求头 HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); //第一次权限请求体 FirstReq firstReq = new FirstReq(); firstReq.setIpAddress(ip); firstReq.setUserName(userName); firstReq.setClientType(clientType); ObjectMapper objectMapper = new ObjectMapper(); HttpEntity firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders); ResponseEntity responseEntity = restTemplate.postForEntity(url + reqUrl, firstEntity, String.class); FirstRes firstRes = objectMapper.readValue(responseEntity.getBody(), FirstRes.class); String signature = MD5Util.md5Encrypt(passWord); signature = MD5Util.md5Encrypt(userName + signature); signature = MD5Util.md5Encrypt(signature); signature = MD5Util.md5Encrypt(userName + ":" + firstRes.getRealm() + ":" + signature); signature = MD5Util.md5Encrypt(signature + ":" + firstRes.getRandomKey()); SecondReq secondReq = new SecondReq(); secondReq.setIpAddress(ip); secondReq.setEncryptType(firstRes.getEncryptType()); secondReq.setSignature(signature); secondReq.setRandomKey(firstRes.getRandomKey()); secondReq.setClientType(clientType); secondReq.setUserName(userName); HttpEntity secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders); ResponseEntity secondResEntity = restTemplate.postForEntity(url + reqUrl, secondEntity, String.class); return objectMapper.readTree(secondResEntity.getBody()).get("token").textValue(); } }