使用参数Spring RestTemplate GET
我必须进行REST调用,包括自定义标题和查询参数。 我设置我的HttpEntity
只有标题(没有主体),我使用RestTemplate.exchange()方法如下:
HttpHeaders headers = new HttpHeaders(); headers.set("Accept", "application/json"); Map<String, String> params = new HashMap<String, String>(); params.put("msisdn", msisdn); params.put("email", email); params.put("clientVersion", clientVersion); params.put("clientType", clientType); params.put("issuerName", issuerName); params.put("applicationName", applicationName); HttpEntity entity = new HttpEntity(headers); HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class, params);
这在客户端失败,调度程序servlet无法将请求parsing为处理程序。 Havinfdebugging它,它看起来像请求参数不被发送。
当我使用请求Body和没有查询参数与POST进行交换时,它工作得很好。
有没有人有任何想法?
为了方便操作URLs / path / params /等,你可以使用Spring的UriComponentsBuilder类。 手动连接string更简洁,并且为您处理URL编码:
HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); 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);
uriVariables也在查询string中展开。 例如,以下调用将扩展帐户和名称的值:
restTemplate.exchange("http://my-rest-url.org/rest/account/{account}?name={name}", HttpMethod.GET, httpEntity, clazz, "my-account", "my-name" );
所以实际的请求url将是
http://my-rest-url.org/rest/account/my-account?name=my-name
查看HierarchicalUriComponents.expandInternal(UriTemplateVariables)以获取更多详细信息。 Spring的版本是3.1.3。
好吧,所以我是一个白痴,我混淆查询参数与url参数。 我有点希望有一个更好的方式来填充我的查询参数,而不是一个丑陋的串联的string,但我们是。 这只是使用正确的参数构buildURL的情况。 如果你把它作为一个string传递,Spring也将为你编码。
我试图做类似的事情, RoboSpice的例子帮助我解决了这个问题 :
HttpHeaders headers = new HttpHeaders(); headers.set("Accept", "application/json"); HttpEntity<String> request = new HttpEntity<>(input, createHeader()); String url = "http://awesomesite.org"; Uri.Builder uriBuilder = Uri.parse(url).buildUpon(); uriBuilder.appendQueryParameter(key, value); uriBuilder.appendQueryParameter(key, value); ... String url = uriBuilder.build().toString(); HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request , String.class);
我采取不同的方法,你可能会同意或不,但我想从.properties文件而不是编译的Java代码控制
在application.properties文件里面
endpoint.url = https:// yourHost / resource?requestParam1 = {0}&requestParam2 = {1}
Java代码在这里,你可以编写如果或切换条件,以找出.properties文件中的终点URL是否有@PathVariable(包含{})或@RequestParam(yourURL?key = value)等…然后调用相应的方法..这样它的dynamic,而不需要在未来的一站式代码更改…
我试图给更多的想法比实际的代码在这里…尝试编写@RequestParam和@PathVariable等的通用方法…然后根据需要调用
@Value("${endpoint.url}") private String endpointURL; // you can use variable args feature in Java public String requestParamMethodNameHere(String value1, String value2) { RestTemplate restTemplate = new RestTemplate(); restTemplate .getMessageConverters() .add(new MappingJackson2HttpMessageConverter()); HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); HttpEntity<String> entity = new HttpEntity<>(headers); try { String formatted_URL = MessageFormat.format(endpointURL, value1, value2); ResponseEntity<String> response = restTemplate.exchange( formatted_URL , HttpMethod.GET, entity, String.class); return response.getBody(); } catch (Exception e) { e.printStackTrace(); }