Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在HttpURLConnection中发布参数和正文_Java - Fatal编程技术网

Java 如何在HttpURLConnection中发布参数和正文

Java 如何在HttpURLConnection中发布参数和正文,java,Java,我如何同时做这两件事 这些参数只是查询字符串参数。主体是json connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setDoOutput(true); connection.getOutputStream().write(parameters); connec

我如何同时做这两件事

这些参数只是查询字符串参数。主体是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,而参数只是一个字节[]

显然,这取决于解释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());