Java 如何在HttpURLConnection中发布参数和正文
我如何同时做这两件事 这些参数只是查询字符串参数。主体是jsonJava 如何在HttpURLConnection中发布参数和正文,java,Java,我如何同时做这两件事 这些参数只是查询字符串参数。主体是json connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setDoOutput(true); connection.getOutputStream().write(parameters); connec
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Accept", "application/json");
connection.setDoOutput(true);
connection.getOutputStream().write(parameters);
connection.getOutputStream().write(sqlDatabase.toString().getBytes("UTF-8"));
sqlDatabase是一个JsonObject,而参数只是一个字节[] 显然,这取决于解释POST请求的服务器。但在我看来,您可能希望将数据视为包含文件的HTML表单 这样的表单将其数据发布为多部分/表单数据体。每个参数(无论是查询参数还是文件数据)都是多部分正文中的独立部分。并详细描述了这一点 可以使用库创建多部分正文:
List partList=new ArrayList();
ParameterList dispositionParams=新的ParameterList();
对于(字符串queryParam:parameters.split(“&”)){
字符串[]name和value=queryParam.split(“=”,2);
字符串名称=名称和值[0];
字符串值=名称和值[1];
name=urldecker.decode(名称,“UTF-8”);
value=urldecker.decode(值为“UTF-8”);
配置参数集(“名称”,名称);
内容处置=
新的ContentDisposition(“表单数据”,dispositionParams);
MimeBodyPart=新的MimeBodyPart();
part.setDisposition(disposition.toString());
第.setText部分(值);
部件列表。添加(部件);
}
dispositionParams.set(“数据库”,名称);
内容处置=
新的ContentDisposition(“表单数据”,dispositionParams);
MimeBodyPart dbPart=新的MimeBodyPart();
setDisposition(disposition.toString());
setDataHandler(新的DataHandler(
新的ByteArrayDataSource(sqlDatabase.toString(),“application/json”);
partList.add(dbPart);
BodyPart[]零件=零件列表.toArray(新的BodyPart[0]);
多部分正文=新的MimeMultipart(“表单数据”,部分);
connection.setRequestProperty(“内容类型”,body.getContentType());
setRequestProperty(“接受”、“应用程序/json”);
connection.setDoOutput(真);
writeTo(connection.getOutputStream());
如果它们是查询字符串参数,请将它们写入URL,而不是正文。在标准POST请求中,参数是请求正文。你可以考虑定义一个新的请求参数来携带额外的数据。我想如果它是GET,我只能这样做。@约翰伯林格:我如何定义一个新的请求?通过“定义一个新的请求参数”,我的意思是你选择了一个尚未使用的名字,并把它连同它的值一起写入到请求体中。当然,服务器必须配合,因为它需要通过新参数获取数据。
List<BodyPart> partList = new ArrayList<>();
ParameterList dispositionParams = new ParameterList();
for (String queryParam : parameters.split("&")) {
String[] nameAndValue = queryParam.split("=", 2);
String name = nameAndValue[0];
String value = nameAndValue[1];
name = URLDecoder.decode(name, "UTF-8");
value = URLDecoder.decode(value, "UTF-8");
dispositionParams.set("name", name);
ContentDisposition disposition =
new ContentDisposition("form-data", dispositionParams);
MimeBodyPart part = new MimeBodyPart();
part.setDisposition(disposition.toString());
part.setText(value);
partList.add(part);
}
dispositionParams.set("database", name);
ContentDisposition disposition =
new ContentDisposition("form-data", dispositionParams);
MimeBodyPart dbPart = new MimeBodyPart();
dbPart.setDisposition(disposition.toString());
dbPart.setDataHandler(new DataHandler(
new ByteArrayDataSource(sqlDatabase.toString(), "application/json")));
partList.add(dbPart);
BodyPart[] parts = partList.toArray(new BodyPart[0]);
Multipart body = new MimeMultipart("form-data", parts);
connection.setRequestProperty("Content-Type", body.getContentType());
connection.setRequestProperty("Accept", "application/json");
connection.setDoOutput(true);
body.writeTo(connection.getOutputStream());