【问题标题】:RESTful client in order to test my POST methodRESTful 客户端以测试我的 POST 方法
【发布时间】:2017-06-08 12:02:18
【问题描述】:

我正在使用 Java 开发 RESTful 云应用程序,一旦我实现了 POST、DELETE、PUT 和 GET 的所有方法,我需要通过一个简单的 Java 客户端测试它们。我通过以下方式成功测试了 GET 和 DELETE:

String findById = target.path("..").path("..").path("17").request()
.accept(MediaType.APPLICATION_JSON).get(String.class).toString();
System.out.println(findById);

但是现在当我想尝试 PUT 和 POST 时,我无法让它工作。我尝试了以下方法:

String addBook = target.path("..").path("..").queryParam("author", "OO")
                .queryParam("language", "OO")
                .queryParam("publisher", "OO")
                .queryParam("subject", "OO")
                .queryParam("title", "OO")
                .queryParam("isbn", "OO").request().accept(MediaType.APPLICATION_JSON)
                .post(String.class);

错误表明 .post 期望“SyncInvoker 类型中的方法 post(Entity, Class) 不适用于参数 (String, Class)”。

所以我的问题是实体应该是什么以及我应该如何指定它?客户端项目单独运行,而不是在主(服务器)项目上。

【问题讨论】:

  • 这个我没用过,但是看看能用的代码,get 后有 .toString(),嗯,post 后能贴上 .toString() 吗?
  • 您使用什么工具来编写您的应用程序?许多框架都有特定的测试工具(例如 Spring MockMvc 甚至 Spring REST Docs)。

标签: java rest web-applications


【解决方案1】:

您不能使用查询参数来发送发布请求。 您必须使用可以是不同内容类型的帖子正文,例如 JSON。 您必须将代码更改为以下内容:

Map<String, Object> body = new HashMap<>();
body.put("language", "OO");
.....
String json = (new ObjectMapper()).writeValueAsString(body);
Entity<String> entity = javax.ws.rs.client.Entity.json(json);
String result = client.target(fullUrl).request().method("POST", entity, String.class);

【讨论】:

  • @MarkoOtasevic 实体是 javax.ws.rs.client.Entity 吗?对于 Object Mapper,您需要 Jackson 核心依赖项。如果您使用 Maven 将此依赖项添加到 pom com.fasterxml.jackson.corejackson-databind2.1.2 而如果您使用简单的 java add跟随类路径 jackson-core-2.1.X, jackson-databind-2.1.X
  • 谢谢 Nicolo,这是一个很好的解决方案并且有效:)
猜你喜欢
  • 2012-05-11
  • 2016-11-06
  • 2015-01-08
  • 2014-01-28
  • 1970-01-01
  • 2015-11-01
  • 2019-08-07
  • 1970-01-01
  • 2017-01-08
相关资源
最近更新 更多