从 Spring 框架调用 RESTlet API

Calling RESTlet API from Spring Framework

我有一个 POST API 写在 Restlet framework 中,它接受 org.restlet.representation.Representation 形式的数据,我想用一些变量和那里的值来访问服务Spring 项目。怎么做?

现在我正在使用 HTTPHeaders 发送数据,但是 API 不接受这些值,API 的所有字段都显示为 NULL .代码如下:

    final String uri = "http://localhost:8080/MyServices/adduser";
    String userid = "05580a6caa7244a6986ca834403f1a93";
    String usertype = "buyer";
    String username = "shivam42";
    RestTemplate restTemplate = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    headers.add("userid", userid);
    headers.add("usertype", usertype);
    headers.add("username", username);
    HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

    ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.POST, entity, String.class);
    System.out.println(result);

服务是这样的:

@Post
public String newUser(Representation entity) {
    Form form = new Form(entity);
    String userid = form.getValues("userid");
    String usertype = form.getValues("usertype");
    String username = form.getValues("username");
    System.out.println(userid);
    System.out.println(usertype);
    System.out.println(username);
    return userid;
}

这是从 curl 生成的代码也许有人可以帮助我:

curl -X POST -H "Cache-Control: no-cache" -H "Postman-Token: 33e6a1c5-c1c9-694f-3d7f-26cbcea61870" -H "Content-Type: application/x-www-form-urlencoded" -d 'userid=05580a6caa7244a6986ca834403f1a93&usertype=buyer&username=shivam42' "http://localhost:8080/MyServices/adduser"

当我从 POSTMAN 调用 API 时,它给出了正确的 userid,现在如何从 Spring 项目调用它?我做错了什么吗?

Spring forum 我找到了解决这个问题的方法。 现在我的代码是:

final String uri = "http://localhost:8080/MyServices/adduser";
String userid = "05580a6caa7244a6986ca834403f1a93";
String usertype = "buyer";
String username = "shivam42";
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("userid", userid);
params.add("usertype", usertype);
params.add("username", username);

RestTemplate restTemplate = new RestTemplate();
HttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
HttpMessageConverter stringHttpMessageConverternew = new StringHttpMessageConverter();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(stringHttpMessageConverternew);
messageConverters.add(formHttpMessageConverter);
restTemplate.setMessageConverters(messageConverters);
System.out.println(restTemplate.postForObject(uri, params, String.class));

在我的例子中,如果我排除以下代码,我也会得到预期的结果:

HttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
HttpMessageConverter stringHttpMessageConverternew = new StringHttpMessageConverter();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(stringHttpMessageConverternew);
messageConverters.add(formHttpMessageConverter);
restTemplate.setMessageConverters(messageConverters);

@Shivam 感谢您更新问题。有了 curl 命令,我现在看到您基本上想要发送的数据在请求的正文中。因此,使用 HttpHeaders 的第一种方法将不起作用。这是使用 Springs RestTemplate:

exchange 方法的第一种方法的示例
@Test
public void test() {
    RestTemplate restTemplate = new RestTemplate();
    final String uri = "http://localhost:8080/adduser";
    String userid = "05580a6caa7244a6986ca834403f1a93";
    String usertype = "buyer";
    String username = "shivam42";

    // create request body
    JSONObject request = new JSONObject();
    request.put("userid", userid);
    request.put("usertype", usertype);
    request.put("username", username);

    // set headers
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<String> entity = new HttpEntity<>(request.toString(), headers);

    ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.POST, entity, String.class);
    System.out.println(result.getBody());
}

这也应该按预期工作,return userid。另请参阅 POST request via RestTemplate in JSON 了解更多信息。