Извлечь данные параметров из запроса с помощью искры

Итак, я пытаюсь создать простой REST API и хотел попробовать искру, но по какой-то причине я не могу извлечь какие-либо параметры.

Вот моя конечная точка для тестирования:

    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 просто равна нулю. Но если я вызову метод body для req, req.body().toString(); он действительно получит тело: { "username": "bla" } вывод на консоль. Итак, тело проходит.

Вот результат в окне консоли:

null
BODY IS WORKING:
[
    {
        "username": "bla"
    }
]

Так как же извлечь параметр из тела запроса? Я пробовал много разных форматов имени параметра, но это просто не работает. Сижу с этим уже несколько часов!

Я просмотрел документацию и считаю, что делаю правильно: http://sparkjava.com/documentation.html


person hujja    schedule 06.03.2017    source источник


Ответы (3)


Я думаю, есть несколько способов сделать это. Кроме того, вы не упомянули об этом, я предполагаю, что вы отправляете свои данные в формате JSON. Я делаю это с помощью ObjectMapper (используя этот пакет com.fasterxml.jackson.databind.ObjectMapper) и класса PayLoad.

Я создаю простой класс, используемый в качестве PayLoad. Он содержит только поля и их геттеры и сеттеры. для каждого значения, которое вы отправляете в 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);

Надеюсь, поможет. Если кто-то использует более простой способ, буду рад услышать.

person SHG    schedule 07.03.2017

Вы должны были объявить свой маршрут, как показано ниже, с параметром :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";
});

или, если вам нужно иметь дело с параметрами запроса, просто взгляните на этот ответ.

person Laercio Metzner    schedule 07.03.2017

как сказал Лаэрсио, если вы хотите получить значение этой строки

String str = req.attribute(":username"); //TODO THIS IS ALWAYS NULL!!!!!!!

вы должны объявить тот же var как часть вашего URI

post("/hello/:username" ...) ...

но если вы пытаетесь отправить JSON как Content-Type: application/json, вы не получите параметры таким образом, это работает, только если вы отправляете значение как Content-Type: application/x-www-form-urlencoded, а затем можете использовать req.params("username"), это последний способ, которым обычная HTML-форма отправляет данные

По умолчанию Java не очень хорошо обрабатывает JSON, для этого вам нужно придумать некоторые хитрости или, что еще лучше, использовать Гсон

Если вы не хотите использовать Gson, вам нужно прочитать строку тела в строке и самостоятельно обработать данные, отправленные приложением/json, чтобы получить данные.

person Juorder Gonzalez    schedule 01.06.2017