JAVA 发送 使用 RestTemplate HTTP GET / POST 请求
###导入JAR
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId>
</dependency>
用Spring管理起来
@Configuration
public class RestConfig {
@Bean //必须new 一个RestTemplate并放入spring容器当中,否则启动时报错public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setReadTimeout(5000);//单位为msfactory.setConnectTimeout(5000);//单位为msreturn new RestTemplate(factory);}
}
###第一种 发送post请求 不带 token
在这里插入
public class test {
@Autowiredprivate RestTemplate restTemplate;@Value("${ics_auth.username}")private String username;@Value("${ics_auth.password}")private String password;@Value("${ics_url}")private String apiUrl;/*** Key*/private static final String ACCESS_TOKEN_ICS = "ICS_TOKEN";@GetMapping("/login")@ApiOperation(value = "用户登陆")public ApiResponse getToken(){
String url=apiUrl+"/login";Long expire = redisTemplate.opsForValue().getOperations().getExpire(ACCESS_TOKEN_ICS);//存在key且未过期if (expire > 1) {
String token = redisTemplate.opsForValue().get(ACCESS_TOKEN_ICS).toString();resp.setErrorCode(200);resp.setErrorMsg("登陆成功");resp.setData(token);return resp;}HashMap<String, String> reqInfo = new HashMap<>();reqInfo.put("username",username);reqInfo.put("password",password);HttpHeaders headers = new HttpHeaders();HttpEntity<HashMap<String, String>> req = new HttpEntity<>(reqInfo, headers);ResponseEntity<JSONObject> response = restTemplate.exchange(url, HttpMethod.POST, req, JSONObject.class);if (!response.getStatusCode().equals(HttpStatus.OK)){
throw new BizException("请求token错误!");}//调用redis的 工具将token存到 redis 服务当中String token = response.getBody().getString("token");String expirationStr = response.getBody().getString("expiration");Long expiration = Long.valueOf(expirationStr);redisTemplate.opsForValue().set(ACCESS_TOKEN_ICS, token, expiration, TimeUnit.SECONDS);resp.setErrorCode(200);resp.setErrorMsg("登陆成功");resp.setData(token);return resp;}
}
###第二种 携带token 发送POST 请求
@PostMapping("/relay")public ApiResponse getRelay(@RequestBody JSONObject param) {
Integer deviceId = param.getInteger("deviceId");Integer relayNum = param.getInteger("relayNum");Integer relayState = param.getInteger("relayState");ApiResponse resp = new ApiResponse();String token = authService.getToken();String url = apiUrl + "/relay";MediaType type = MediaType.parseMediaType("application/json");HttpHeaders headers = new HttpHeaders();headers.add("token", token);headers.add("Content-Type", "application/json");;//携带参数JSONObject para = new JSONObject();para.put("deviceId", deviceId);para.put("relayNum", relayNum);para.put("relayState", relayState);//之前采用这种方式传递请求参数 老是报 400 报请求参数错误 然后换成上面的形式 就成功了 有大神能解释一下不//MultiValueMap<String, String> para = new LinkedMultiValueMap<>();//para.put("deviceId", deviceId);//para.put("relayNum", relayNum);//para.put("relayState", relayState);//添加请求的实体类,这里第一个参数是要发送的参数,第二个参数是请求头里的数据//HttpEntity<Object> requestEntity = new HttpEntity<>(map, headers);//响应结果HttpEntity<Object> requestEntity = new HttpEntity<>(para.toJSONString(), headers);//处理响应ResponseEntity<String> resps = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);if (!resps.getStatusCode().equals(HttpStatus.OK)) {
resp.setErrorMsg("请求异常");resp.setErrorCode(500);return resp;} else {
resp.setErrorMsg("控制成功");resp.setErrorCode(200);return resp;}}
###第三 发送GET 请求
@GetMapping("/relay")
public ApiResponse getRelayList() {
ApiResponse resp = new ApiResponse();String token = authService.getToken();String url = apiUrl + "/relay";Map<String, Object> param = new HashMap<>();HttpHeaders headers = new HttpHeaders();headers.add("token", token);ResponseEntity<String> resps = restTemplate.exchange(url,HttpMethod.GET,new HttpEntity<String>(headers),String.class,param);if (!resps.getStatusCode().equals(HttpStatus.OK)) {
resp.setErrorMsg("请求异常");resp.setErrorCode(500);return resp;} else {
resp.setData(resps.getBody());resp.setErrorCode(200);return resp;}
}
###第四种 发送GET请求 携带参数
public void test02 {
//设备编号String serial = camera.getLivegbsSerial();String channel = camera.getLivegbsChannel();boolean realtime = true;boolean checkOutputs = true;int timeout = 10;//携带参数HashMap<String, Object> map = new HashMap<>();map.put("serial",serial);map.put("channel",channel);map.put("realtime",realtime);map.put("check_outputs",checkOutputs);map.put("timeout",timeout);HttpHeaders headers = new HttpHeaders();HttpEntity<Map<String, Object>> req = new HttpEntity<>(null, headers);ResponseEntity<byte[]> responseEntity = null;//发送请求 responseEntity = restTemplate.exchange(cutPictureUrl + "?serial={serial}&?channel={channel}",HttpMethod.GET, req, byte[].class, map);//处理请求int value = responseEntity.getStatusCode().value();....
}