所以我正在尝试构建一个简单的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 发出请求 “username”:“bla” } ,str变量只是null。但是如果我在req上调用body方法, req.body()。toString(); 它确实得到了正文: { “username”:“bla” } 打印到控制台。身体正在经历。
这是控制台窗口中的结果:
null
BODY IS WORKING:
[
{
"username": "bla"
}
]
那么如何从请求的主体中提取参数呢?我在param名称上尝试了很多不同的格式,但它不起作用。几个小时以来一直坐在这里!
我查看了文档,我相信我做了正确的事情: http://sparkjava.com/documentation.html
答案 0 :(得分:1)
我想有几种方法可以做到这一点。另外,你没有提到它,我假设你发送格式为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);
希望它有所帮助。 如果有人使用更简单的方法,我会很高兴听到。
答案 1 :(得分:0)
您应该使用参数:username作为路径名称的一部分声明您的路线,如下所示:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="row">
<div id="mydata"></div>
<button onclick="ShowNext();">Get Next</button>
</div>
<script>
function MyClass() {
this.MyData = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U']; // Public variable
this.UpdateGrid = function () { // Public Method
if (typeof MyClass.currentIndex == 'undefined') {
// It has not... perform the initialization
MyClass.currentIndex = 0;
}
var myhtml = '';
var limit = MyClass.currentIndex + 8;
for (var i = MyClass.currentIndex; i <limit; i++)
{
myhtml += this.MyData[i] + " ";
if (i % 3 === 0)
myhtml += "<br/>";
}
$('#mydata').html(myhtml);
MyClass.currentIndex += 8;
alert(MyClass.currentIndex);
};
}
function ShowNext()
{
var myClass = new MyClass();
myClass.UpdateGrid();
}
</script>
或者,如果您想要处理查询参数,请查看this answer。
答案 2 :(得分:0)
正如Laercio所说,如果你想获得这一行的价值
String str = req.attribute(":username"); //TODO THIS IS ALWAYS NULL!!!!!!!
您应该将相同的var声明为URI的一部分
post("/hello/:username" ...) ...
但是如果你试图以Content-Type: application/json
的身份发送JSON,那么你就不会以这种方式获得参数,这只有在你将值发送为Content-Type: application/x-www-form-urlencoded
并且你可以使用时才有效req.params("username")
这最后是普通HTML表单发送数据的方式
Java默认情况下不能很好地处理JSON,你需要做一些技巧来做到这一点,或者更好地使用Gson
如果您不想使用Gson,那么您需要读取每行的正文行,并由您自己处理application / json发送的数据来获取数据。