我如何同时做两件事?
参数只是查询字符串参数。身体是json。
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,而参数只是一个byte [];
答案 0 :(得分:0)
显然,这取决于解释您的POST请求的服务器。但在我看来,您希望将数据视为包含文件的HTML表单。
这样的表单将其数据作为multipart / form-data主体发布。每个参数(无论是查询参数还是文件数据)都是多部分主体中的单独部分。 HTML 4 spec和RFC 2388详细描述了这一点。
可以使用JavaMail库创建多部分正文:
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());