user2598816
user2598816

Reputation: 67

How read data sent by Client with Spark?

I have to read some data sent by Client using Spark (a framework for Java).

This is the code of client's post request. I am using jQuery.

$.post("/insertElement", 
{item:item.value, value: value.value, dimension: dimension.value });

The code of server:

post(new Route("/insertElement") {
        @Override
        public Object handle(Request request, Response response) {
            String item = (String) request.attribute("item");
            String value = (String) request.attribute("value");
            String dimension = (String) request.attribute("dimension");
            Element e = new Element(item, value, dimension);
            ElementDAO edao = new ElementDAO();
            edao.insert(e);
            JSONObject json = JSONObject.fromObject( e );
            return json; 
        }
    });

I am using Spark so I only have to define the route. I would like to store in a database the data sent by client, but all the attributes are null.

I think that this way isn't correct. How can I read the sent data?

Upvotes: 4

Views: 7192

Answers (4)

shantanusinghal
shantanusinghal

Reputation: 724

Assuming this is the JSON I'm sending in my request

    { 'name': 'Rango' }

This is how I've configured my Controller to parse request body.

    public class GreetingsController {
        GreetingsController() {
            post("/hello", ((req, res) -> {
                Map<String, String> map = JsonUtil.parse(req.body());
                return "Hello " + map.get("name") + "!";
            })));
        }
    }

    public class JsonUtil {
        public static Map<String, String> parse(String object) {
            return new Gson().fromJson(object, Map.class);
    }

Upvotes: 0

Dherik
Dherik

Reputation: 19070

You will need something like this:

post(new Route("/insertElement") {
    @Override
    public Object handle(Request request, Response response) {

        String body = request.body();
        Element element = fromJson(body, Element.class);
        ElementDAO edao = new ElementDAO();
        edao.insert(e);
        JSONObject json = JSONObject.fromObject( e );
        return json; 
    }
});


public class Element {

    private String item;
    private String value;
    private String dimension;

    //constructor, getters and setters

}

public class JsonTransformer {

    public static String toJson(Object object) {
        return new Gson().toJson(object);
    }

    public static <T extends Object> T  fromJson(String json, Class<T> classe) {
        return new Gson().fromJson(json, classe);
    }

}

Upvotes: 3

Andy
Andy

Reputation: 221

try using request.queryParams("item") and so on.

Upvotes: 1

mthmulders
mthmulders

Reputation: 9705

They way you send your data, using HTTP POST, you're posting the JSON as request body, not as request attributes. This means you shouldn't use request.attribute("item") and the others, but instead parse the request body to a Java object. You can use that object to create the element and store it using the DAO.

Upvotes: 7

Related Questions