使用Java&;提交带有参数和正文的POST请求;休息

使用Java&;提交带有参数和正文的POST请求;休息,java,rest,servlets,post,httprequest,Java,Rest,Servlets,Post,Httprequest,我正在尝试使用一个现有的API,该API调用使用POST“提交”json对象,但是页面在请求中也需要一些参数,在这个示例中,我们将使用name和email。我是新来休息的,所以我可能在这里的某个地方犯了一个无知的错误 以下是到目前为止我的servlet中的代码: String path = "http://www.test.com/submit"; URL url = new URL(path); conn = (HttpURLConnection)url.openConnection(); c

我正在尝试使用一个现有的API,该API调用使用POST“提交”json对象,但是页面在请求中也需要一些参数,在这个示例中,我们将使用name和email。我是新来休息的,所以我可能在这里的某个地方犯了一个无知的错误

以下是到目前为止我的servlet中的代码:

String path = "http://www.test.com/submit";
URL url = new URL(path);
conn = (HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");

Gson gson = new Gson();

//julySchedule is the object I want to submit with this request alongside the parameters.
String input = gson.toJson(julySchedule);

OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();

if (conn.getResponseCode() != 200) {
    throw new RuntimeException("HTTP POST Request Failed with Error code : "
                    + conn.getResponseCode());
        }
我尝试将参数放入URL中,如:

/submit?name=Name&email=test@gmail.com
但这不起作用,因为POST请求不会接受这样的参数。 然后我尝试将其添加到输出流中,如下所示:

String params = "name=Name&email=test@gmail.com"
OutputStream os = conn.getOutputStream();
os.write(path.toBytes());
os.write(input.getBytes());
os.flush();  

但这也不起作用。我在什么地方犯了一个愚蠢的错误吗

POST请求包含查询字符串是完全正确的(尽管不是最佳实践)

由于您将
application/json
用作
Content-Type
,因此我假设您的负载必须是一个json对象。您不能在POST body中混合参数。您有两种选择:

  • QueryString中的Kep email和name,POST payload中的json:您所做的应该是有效的
  • 仅使用POST-payload:Set
    内容类型:
    应用程序/x-www-form-urlencoded如下:
    name=name&email=email&jsonPayLoad={Your Json Object}
    。服务器应该从POST有效负载中提取
    jsonPayLoad

  • 在写入POST输出流之前,请确保使用
    encodeURIComponent
    进行转义。

    POST请求不接受URL中的参数。我已经了解了这一点,这就是为什么我尝试了下面的代码。在POST请求中传递“参数”有更好的方法吗?没有,您唯一的选择是修改服务以接受请求正文中的这些参数。POST请求可以通过servlet中的getInputStream()/getReader()获得。我已经尝试了这两种方法,但提交此请求时出现错误400。