使用spark从请求中提取param数据

时间:2017-03-06 16:27:07

标签: java parameters spark-java

所以我正在尝试构建一个简单的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

3 个答案:

答案 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发送的数据来获取数据。