当前位置: 首页 > 知识库问答 >
问题:

用spark从请求中提取参数数据

柴磊
2023-03-14

因此,我试图html" target="_blank">构建一个简单的REST API,并希望试用spark,但由于某种原因,我似乎无法提取任何参数。

下面是我的测试endpoint:

    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"
    }
]

那么如何从请求体中提取参数呢?我已经尝试了很多不同的格式的参数名称,但它就是不工作。已经坐了好几个小时了!

我看了文档,我相信我做了正确的事情:http://sparkjava.com/documentation.html

共有2个答案

韩单弓
2023-03-14

您应该像下面这样声明您的路由,并将参数:username作为路由名称的一部分:

post("/hello/:username", (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";
});

或者,如果您想要的是处理查询参数,请看一下这个答案。

严修谨
2023-03-14

我猜这方面的方法很少。另外,您没有提到它,我假设您将数据格式化为JSON。我使用一个ObjectMapper(使用这个包com.fasterxml.jackson.databind.ObjectMapper)和一个有效负载类来实现。

我创建了一个简单的类用作有效负载。它只包含字段及其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);

希望有帮助。如果有人用更简单的方法,我很乐意听到。

 类似资料:
  • 问题内容: 我已经环顾了几天,无法解决这个问题。基本上,我正在将图像上传到服务器并获得ID作为回报,问题是我无法弄清楚如何提取此ID并将其更改为准备好保存到数据库的String。 程式码 这是我得到的输出 问题答案: 您正在接收JSON;您已经使用该方法将其解码为Python结构: 您可以将其视为任何其他Python列表;内容只是一个字典,因此另一个字典键可以获取值: 当您知道上传了多少张图像时,

  • 我正在使用curl发出一个POST请求,如下所示 但在servlet中,我无法获取任何数据。 有什么建议吗?还有一种在数据内部获取数据的更好方法,如?

  • 问题内容: 如何在Jinja2模板中检索请求参数? 问题答案: 我对这个答案有些迟,但是其他解决方案并不能真正解决你使用Flask的问题。 将Flask与Jinja2一起使用的事实使你的情况与其他框架有所不同。Flask实际上使所有Jinja2模板中都可以使用一些全局变量,而无需你将它们显式传递给模板。 在http://flask.pocoo.org/docs/templating/#standa

  • 我在POST请求中从角应用程序发送表单数据到我的Azure函数,这些函数在java中编译。 客户端看起来像这样: 当物品接收到azure功能时 功能的目的是通过firebase向android应用程序发送推送通知。 带有HTTP触发器的azure函数如下所示: 当我运行我得到: ------WebKitFormBoundary2gNlxQx5pqyAeDL3内容处置:表单数据。。。。 我很高兴知道

  • 可以在模板中直接使用$Request对象,直接输入它的属性或调用它的大部分方法,但只支持方法的第一个参数; // 调用Request对象的get方法 传入参数为id {$Request.get.id} // 调用Request对象的param方法 传入参数为name {$Request.param.name} // 调用Request对象的param方法 传入参数为post.post_title

  • 可以在模板中直接使用$Request对象,直接输入它的属性或调用它的大部分方法,但只支持方法的第一个参数; // 调用Request对象的get方法 传入参数为id {$Request.get.id} // 调用Request对象的param方法 传入参数为name {$Request.param.name} // 调用Request对象的param方法 传入参数为post.post_title