繁体   English   中英

使用Java和REST提交带有参数和正文的POST请求

[英]submit a POST request with parameters and a body using Java & REST

我正在尝试使用一个现有的API,该API要求使用POST“提交”一个json对象,但是该页面在请求中还需要一些参数,在此示例中,我们将使用名称和电子邮件。 我是REST的超级新手,所以我可能在这里的某个地方犯了一个无知的错误。

这是我到目前为止在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请求不会接受这样的参数。 然后,我尝试将其添加到Output流中,如下所示:

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正文中混合使用参数。 您有2个选择:

  1. 在QueryString中保留电子邮件和名称,在POST负载中保留json:您所做的应该可以工作。
  2. 仅使用POST有效负载:设置Content-Type: application/x-www-form-urlencoded ,如下所示: name=NAME&email=EMAIL&jsonPayLoad={Your Json Object} 服务器应从POST负载中提取jsonPayLoad

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM