因此,我正在尝试构建一个简单的 REST API,并想尝试 Spark,但由于某种原因,我似乎无法提取任何参数。
这是我测试这个的端点:
post("/hello", (req, res) -> {
String str = req.attribute(":username"); //TODO THIS IS ALWAYS NULL!!!!!!!
System.out.println(str);
System.out.println("BODY IS WORKING:");
System.out.println(req.body().toString());
return "PANNKAKA";
});
现在,如果我尝试使用正文向 http://localhost:4567/hello 发出请求 { “用户名”:“bla” },str 变量只是 null。但是,如果我调用 req 上的 body 方法,req.body().toString(); 它确实得到了正文:{ “用户名”:“bla” } 打印到控制台。所以 body 正在通过。
这是控制台窗口中的结果:
null
BODY IS WORKING:
[
{
"username": "bla"
}
]
那么如何从请求正文中提取参数呢?我已经尝试了很多不同的参数名称格式,但它不起作用。已经坐了几个小时了!
我查看了文档,我相信我做了正确的事情: http://sparkjava.com/documentation.html
请您参考如下方法:
我想有几种方法可以做到这一点。另外,你没有提到它,因为我假设你发送的数据格式为 JSON。 我使用 ObjectMapper(使用此包com.fasterxml.jackson.databind.ObjectMapper
)和 PayLoad 类来完成此操作。
我创建了一个简单的类用作 PayLoad。它只包含字段及其 getter 和 setter。对于您在 JSON 中发送的每个值,您将创建相应的字段,其名称完全相同(在您的情况下,您将有一个名为 username
的字段),然后对象映射器映射 JSON您从客户端发送到此类模式。示例:
public class UserPayload {
private long id;
private String username;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
然后我使用对象映射器将请求正文解析到此有效负载中:
class SomeClass {
...
private static Object postUser(Request req, Response res) throws JSONException {
ObjectMapper mapper = new ObjectMapper();
UserPayload pl = null;
try {
pl = mapper.readValue(req.body(), UserPayload.class); // <------
} catch (JsonMappingException e1) {
...
} catch (Exception e2) {
...
}
System.out.println(pl.getUsername() + " " + pl.getId());
...
}
}
当然还要注册您的路线:
post("/hello", SomeClass::postUser);
希望有帮助。 如果有人使用更简单的方法,我会很高兴听到。