Java - 如何通过HttpUrlConnection发送表单数据或www-form-urlencoded数据

时间:2016-11-17 23:10:17

标签: java post httpurlconnection arcgis

我正在尝试使用仅支持通过form-data或www-form-urlencoded属性传递JSON数据的REST API。所以,我的问题是,如何使用HttpUrlConnection附加多个表单数据项?当我通过浏览器使用API​​时,Chrome中的请求如下所示:

  

表单数据
  的增加结果   更新: [{“attributes”:{“OBJECTID”:2241,“OTHER_FIELD”:“500”}}]
  的删除:结果   的 gdbVersion:结果   的 rollbackOnFailure:结果     f: pjson

但我无法弄清楚如何在Java中复制它。

这是我到目前为止所尝试的:

  HttpURLConnection urlConnection =(HttpURLConnection)url.openConnection();
    urlConnection.setUseCaches(假);
    urlConnection.setDoOutput(真);
    urlConnection.setRequestMethod( “POST”);
    urlConnection.addRequestProperty(“f”,“json”);
    urlConnection.addRequestProperty(“adds”,null);
    urlConnection.addRequestProperty(“updates”,“[{\”attributes \“:{\”OBJECTID \“:2241,\”OTHER_FIELD \“:\”500 \“}}]”);
    urlConnection.addRequestProperty(“删除”,null);
    urlConnection.addRequestProperty(“rollbackOnFailure”,“true”);
    urlConnection.addRequestProperty(“gdbVersion”,null);
 

但它并没有附加数据......

对于那些感兴趣的人,我正在尝试连接到ArcGIS要素服务API,以便我可以添加,更新或删除功能,但在这里我使用的是ApplyEdits

1 个答案:

答案 0 :(得分:4)

所以我想出了如何解决这个问题,以下是解决方案:

  HttpURLConnection urlConnection =(HttpURLConnection)url.openConnection();
urlConnection.setDoOutput(真);
urlConnection.setRequestMethod( “POST”);
 

首先将请求设置为POST请求,并且会有一些输出

  StringBuilder encodedUrl = new StringBuilder(“adds =”+ URLEncoder.encode(“[{\”attributes \“:{\”OBJECTID \“:2241,\”MAXIMOID_PRE \“:\”HYD \“ },“,”UTF-8“));
encodedUrl.append(“&updates =”+ URLEncoder.encode(“”,“UTF-8”));
encodedUrl.append(“&deletes =”+ URLEncoder.encode(“”,“UTF-8”));
encodedUrl.append(“&f =”+ URLEncoder.encode(“json”,“UTF-8”));
encodedUrl.append(“&rollbackOnFailure =”+ URLEncoder.encode(“true”,“UTF-8”));
encodedUrl.append(“&gdbVersion =”+ URLEncoder.encode(“”,“UTF-8”));
 

这是每个表单数据值的设置方式。每个键值只是一个java字符串,然后使用URLEncoder.encode对值进行编码。使用包含所有表单数据元素的字符串,然后将其写入输出流:

  final BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream()));
bfw.write(encodedUrl);
bfw.flush();
bfw.close();
 

之后,可以接收并解析响应。