java - 如何使用 Spring RestTemplate 代替 Apache Httpclient?

标签 java spring apache rest spring-mvc

我想使用 Spring RestTemplate 而不是 Apache HttpClient 来处理远程 API

With HttpClient

// build request JSON
JSONObject json = new JSONObject();
json.put("username", username);
json.put("serial", serial);
json.put("keyId", keyId);
json.put("otp", otp);

String json_req = json.toString();           

// make HTTP request and get response
HttpPost request = new HttpPost(AuthServer);
request.setHeader("Content-Type", "application/json");
request.setEntity(new StringEntity(json_req));

response = client.execute(request);

With RestTemplate

Map<String, String> paramMap = new HashMap<String,String>();
paramMap.put("username", userName);
paramMap.put("serial", serial);
paramMap.put("keyId", keyId);
paramMap.put("otp", otp);

String mapAsJson = new ObjectMapper().writeValueAsString(paramMap);

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> request = new HttpEntity<String>(mapAsJson,requestHeaders);

try {
  ResponseEntity<String> response = restTemplate.exchange(AuthServer, HttpMethod.POST, request, String.class);

  return response.getHeaders();
} catch (HttpClientErrorException e) {
  return null;
}

}

使用 HttpClient 的代码可以工作,但使用 RestTemplate 的代码则不行。我不知道如何在 RestTemplate 中使用 StringEntity

Spring版本是3.0.0,JVM是1.6。

最佳答案

RestTemplate 更适合处理对象。举个例子:

AuthenticationRequest.java

class AuthenticationRequest {
  private String username;
  private String serial;
  private String key;
  private String otp;
}

AuthenticationResponse.java

class AuthenticationResponse {
  private boolean success;
}

AuthenticationCall.java

class AuthenticationCall {
  public AuthenticationResponse execute(AuthenticationRequest payload) {
    HttpEntity<AuthenticationRequest> request = new HttpEntity<AuthenticationRequest>(payload, new HttpHeaders());

    return restTemplate.exchange("http://www.domain.com/api/endpoint"
                                 , HttpMethod.POST
                                 , request
                                 , AuthenticationResponse.class).getBody();
  }
}

这些类可以按如下方式使用:

if(new AuthenticationCall().execute(authenticationRequest).isSuccess()) {
  // Authentication succeeded.
}
else {
  // Authentication failed.
}
<小时/>

所有这些都要求类路径上有一个 JSON 库,例如 Jackson 或 GS​​ON。

关于java - 如何使用 Spring RestTemplate 代替 Apache Httpclient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37450028/

相关文章:

django - 具有两个 URL 和两个不同 SSL 证书的 Apache

java - 我需要在java中初始化 map 列表,但我尝试过的每种方法都将其初始化为空

java - JTree有时不扩展

java - 怎样才能拿到卖家的产品

Spring - 绑定(bind)到对象而不是字符串或基元

启用安全性的 Spring Boot 1.4 测试?

php - 如何正确使用 Wamp Server 设置虚拟主机?

java - 用于 Java/Android 的 echoprint 代码生成器

java - 什么时候在 Spring 中使用 ModelAndView 和 Model?

php - 在 Docker 中启用 Apache SSL 以进行本地开发