Параметры URL не передаются с помощью curl POST

Это мой код Java:

@POST
@Path("/sumPost")
@Produces(MediaType.TEXT_PLAIN)
public String sumPost(@QueryParam(value = "x") int x,
        @QueryParam(value = "y") int y) {
    System.out.println("x = " + x);
    System.out.println("y = " + y);
    return (x + y) + "\n";
}

Я называю это следующим образом:

curl -XPOST "http://localhost:8080/CurlServer/curl/curltutorial/sumPost" -d 'x:5&y:3'

Проблема заключается в том, что вызов System.out.println продолжает публикацию нулевого нуля, кажется, что я не передаю x и y правильно.

Update

После ответа я изменил свой запрос на:

curl   -d '{"x" : 4, "y":3}'  "http://localhost:8080/CurlServer/curl/curltutorial/sumPost" -H "Content-Type:application/json" -H "Accept:text/plain"  --include

и услуга:

@POST
@Path("/sumPost")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_JSON)
public String sumPost(@QueryParam(value = "x") int x,
        @QueryParam(value = "y") int y) {
    System.out.println("sumPost");
    System.out.println("x = " + x);
    System.out.println("y = " + y);
    return (x + y) + "\n";
}

но у меня все еще такая же проблема. Вот ответ с сервера:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/plain
Transfer-Encoding: chunked
Date: Wed, 23 Sep 2015 11:12:38 GMT

0

В конце вы можете увидеть нуль: (

Ответ 1

-d x=1&y=2 (обратите внимание, что =, not :) - данные формы (application/x-www-form-urlencoded) отправил ему тело запроса, в котором ваш метод ресурса должен больше походить на

@POST
@Path("/sumPost")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public String sumPost(@FormParam("x") int x,
                      @FormParam("y") int y) {

}

и следующий запрос будет работать

curl -XPOST "http://localhost:8080/CurlServer/curl/curltutorial/sumPost" -d 'x=5&y=3'

Примечание: В Windows требуется двойные кавычки ("x=5&y=3")

Вы даже можете отделить пары значений ключа

curl -XPOST "http://localhost:8080/..." -d 'x=5' -d 'y=3'

По умолчанию Content-Type - application/x-www-form-urlencoded, поэтому вам не нужно его устанавливать.

@QueryParam должны быть частью строки запроса (часть URL), а не частью данных тела. Таким образом, ваш запрос должен быть больше похож на

curl "http://localhost:8080/CurlServer/curl/curltutorial/sumPost?x=1&y=2"

При этом, поскольку вы не отправляете какие-либо данные в теле, скорее всего, вы должны просто сделать метод ресурса методом GET.

@GET
@Path("/sumPost")
@Produces(MediaType.TEXT_PLAIN)
public String sumPost(@QueryParam("x") int x,
                      @QueryParam("y") int y) {
}

Если вы хотите отправить JSON, то лучше всего убедиться, что у вас есть поставщик JSON [ 1] который обрабатывает десериализацию в POJO. Тогда вы можете иметь что-то вроде

public class Operands {
    private int x;
    private int y;
    // getX setX getY setY
}
...
@POST
@Path("/sumPost")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_JSON)
public String sumPost(Operands ops) {

}

[ 1] - Важно то, что у вас есть провайдер JSON. Если у вас его нет, вы получите исключение с сообщением типа "No MessageBodyReader, найденным для приложения mediatype application/json и операндами типа". Мне нужно знать, какую версию Джерси и если вы используете Maven или нет, чтобы определить, как вы должны добавить поддержку JSON. Но для общей информации вы можете видеть

Ответ 2

Вам не хватает части данных команды:

curl --data "param1=value1&param2=value2" https://example.com/fakesite.php

До -d (или --data) должны появиться перед ссылкой. И "пара значений имени" должна быть varName = varValue & otherVar = otherValue

Кроме того, из документации команда -X неверна:

This option only changes the actual word used in the HTTP request, it does not alter the way curl behaves. So for example if you want to make a proper HEAD request, using -X HEAD will not suffice. You need to use the -I, --head option. 

Он должен быть -X POST

Наконец, не забудьте использовать "html encode" для кодирования ваших значений.

Ответ 3

Вы пробовали называть это следующим образом:

curl -XPOST "http://localhost:8080/CurlServer/curl/curltutorial/sumPost?x=5&y=3" 

?