RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。
1、restTemplate发送GET请求带header(不带Query参数的请求)
HttpHeaders headers = new HttpHeaders(); headers.set("Authorization","Bearer "+token); RestTemplate restTemplate = new RestTemplate(); HttpEntity<String> strEntity = new HttpEntity<String>(null,headers); String url = ""; String forObject = restTemplate.getForObject(url , String.class, strEntity); return JSONObject.parseObject(forObject);
2、restTemplate发送GET请求带header(带Query参数的请求)
HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); RestTemplate restTemplate = new RestTemplate(); String url = ""; UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url) .queryParam("msisdn", msisdn) .queryParam("email", email) .queryParam("clientVersion", clientVersion) .queryParam("clientType", clientType) .queryParam("issuerName", issuerName) .queryParam("applicationName", applicationName); HttpEntity<?> entity = new HttpEntity<>(headers); HttpEntity<String> response = restTemplate.exchange( builder.build().encode().toUri(), HttpMethod.GET, entity, String.class); String body = response.getBody(); JSONObject jsonObject = JSONObject.parseObject(body);
使用Spring的UriComponentsBuilder类。手动连接字符串更干净,它为你处理URL编码。
3、restTemplate发送POST请求
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.valueOf("application/json;UTF-8")); RestTemplate restTemplate = new RestTemplate(); JSONObject params = new JSONObject(); params.put("ak", "***"); params.put("sk", "***"); HttpEntity<String> strEntity = new HttpEntity<String>(params.toJSONString(), headers); JSONObject res = restTemplate.postForObject(url, strEntity, JSONObject.class); String accessToken = res.getString("key");
4、当请求头的ContentType类型为:application/x-www-form-urlencoded 时:
MultiValueMap<String, String> parmas= new LinkedMultiValueMap<String, String>(); RestTemplate restTemplate=new RestTemplate(); parmas.put("client_id", "123123"); parmas.put("client_secret","454656"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<MultiValueMap<String, String>>(parmas, headers); String url = ""; String post = restTemplate.postForObject(url,httpEntity, String.class); String idToken = JSONObject.parseObject(post).getString("id_token");
5、如果报错 HttpClientErrorException$NotAcceptable 406
采用 ResponseEntity<String> 可以hold的住绝大部分的返回值。-> 建议一直用String
ResponseEntity<String> response = restTemplate.exchange("https//xxxx.xxxx.xxx/xxx/xx", HttpMethod.POST, entity, String.class);
XMLPOJO xml = xmlParse(response);
写法示例(POST)
RestTemplate restTemplate = new RestTemplate(); HttpHeaders header1 = new HttpHeaders(); header1.setContentType(MediaType.valueOf("application/json;UTF-8")); header1.set("Access-Token",accessToken); JSONObject params = new JSONObject(); String[] str = new String[]{uuid}; params.put("alarm_uuids", str); params.put("alarm_classification", "INTELLIGENT"); HttpEntity<String> strEntity = new HttpEntity<String>(params.toJSONString(), header1); String url = urlPrefix + "/v1/" + vo.getUserId() + "/alarms/pictures"; String picUrl = null; try{ ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, strEntity, String.class); String body = exchange.getBody(); JSONObject res = JSONObject.parseObject(body); String isSucess = res.get("failed_num").toString(); if(isSucess.equals("0")){ JSONArray alarms = res.getJSONArray("alarms"); picUrl = alarms.getJSONObject(0).get("url").toString(); } }catch (Exception e){ e.printStackTrace(); } return picUrl;
写法示例(POST)
RestTemplate restTemplate = new RestTemplate(); HttpHeaders header1 = new HttpHeaders(); header1.setContentType(MediaType.valueOf("application/json;UTF-8")); JSONObject params = new JSONObject(); params.put("ak", vo.getAk()); params.put("sk", vo.getSk()); HttpEntity<String> strEntity = new HttpEntity<String>(params.toJSONString(), header1); JSONObject res = null; String accessToken = null; try{ res = restTemplate.postForObject(urlPrefix + "/v1/" + vo.getUserId() + "/enterprises/access-token", strEntity, JSONObject.class); accessToken = res.getString("access_token"); redisTemplate.opsForValue().set(vo.getUserId(),accessToken,6, TimeUnit.DAYS); }catch (Exception e){ } return accessToken;
写法示例(GET)
//headers HttpHeaders headers = new HttpHeaders(); headers.set("Access-Token",accessToken); //body MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>(); //HttpEntity HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(requestBody, headers); RestTemplate restTemplate = new RestTemplate(); HttpEntity<String> strEntity = new HttpEntity<String>("",headers); String url = urlPrefix + "/v1/" + vo.getUserId() + "/devices/" + vo.getDeviceId() + "/channels/" + vo.getChannelId(); ResponseEntity<String> responseEntity1 = null; try{ responseEntity1 = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); }catch (Exception e){ } if(ObjectUtils.isEmpty(responseEntity1)){ return null; }else{ return JSONObject.parseObject(responseEntity1.getBody()); }