【问题标题】:RestTemplate with encoded parameters带有编码参数的 RestTemplate
【发布时间】:2016-07-16 18:08:55
【问题描述】:

我需要向身份验证提供程序 (Auth0) 发送 HTTP 请求。我想通过其电子邮件地址获取一位特定用户。

请求必须去:

curl -H "Authorization: Bearer ..." https://.../users?q=email%3A%22mymail%40abc.de%22&search_engine=v2

我用 RestTemplate(春季)试试运气:

public void doSomething() {
    ...

    Map<String, String> requestMap = new HashMap<>();
    requestMap.put("q", "email%3A%22mymail%40abc.de%22");
    requestMap.put("search_engine", "v2");

    RestTemplate restTemplate = getRestTemplateForRequestMap();

    HttpHeaders headers = getHeaders();
    HttpEntity<Map<String, String>> request = new HttpEntity<>(requestMap, headers);

    ResponseEntity<UserInfo[]> response = restTemplate.exchange(URI.create(baseApiUrl + "users"), HttpMethod.GET, request, UserInfo[].class);

    ...
}

private RestTemplate getRestTemplateForRequestMap() {
    RestTemplate restTemplate = new RestTemplate();
    List messageConverters = new ArrayList<>();
    messageConverters.add(new MappingJackson2HttpMessageConverter());
    restTemplate.setMessageConverters(messageConverters);

    return restTemplate;
}

看起来q 参数的值需要编码(他们称之为“Lucene 查询语法”)。我尝试了不同的变化。我什至把它们“硬编码”了。

但是,q 参数似乎不起作用,因为结果不仅包括具有指定电子邮件地址的用户,还包括所有用户。 标头很好(否则我将根本没有用户)。

【问题讨论】:

    标签: java spring resttemplate spring-rest auth0


    【解决方案1】:

    您可以在restTemplate.exchange 的重载方法上添加请求参数的映射:

        ResponseEntity<UserInfo[]> response = restTemplate.exchange(URI.create(baseApiUrl + "users"), HttpMethod.GET,
     request, UserInfo[].class,requestMap);
    

    【讨论】:

    • 你错过了什么吗?方法无法解决。看起来我不能用那个参数来做。
    • 不,我正在使用org.springframework.http.HttpEntityorg.springframework.web.client.RestTemplate;,我可以解决方法
    • 在将 URI 转换为字符串时工作。但是我得到了相同的结果(所有用户而不是指定的用户)。
    • 您确定这是正确的邮件地址email%3A%22mymail%40abc.de%22 吗?
    • 是的,我从他们页面上的“交互式 API”中复制了这些参数(顺便说一句:它是匿名的)。
    【解决方案2】:

    为我工作:

     UriComponentsBuilder builder;
            try {            
    String emailEncoded = URLEncoder.encode("email:" + email, "UTF-8");
                    builder = UriComponentsBuilder.fromHttpUrl(url)
                            .queryParam("include_fields", "true")
                            .queryParam("search_engine", "v3")
                            .queryParam("q", emailEncoded);
                } catch (UnsupportedEncodingException e) {
                    .....
                }
    
                HttpEntity<?> httpEntity = HttpUtility.getHttpEntity(jwtToken);
                ResponseEntity<String> response = restTemplate.exchange(builder.build().toUriString(), HttpMethod.GET, httpEntity, String.class);
    

    【讨论】:

      猜你喜欢
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      相关资源
      最近更新 更多