gpt4 book ai didi

java - 如何在服务器端调用带有多部分请求的 URL,其中有一个包含文件内容的字符串而不是文件

转载 作者:搜寻专家 更新时间:2023-11-01 03:10:56 25 4
gpt4 key购买 nike

我的 servlet 中有一个 xml 文件内容作为字符串,我需要使用 multipart post 请求调用另一个 URL 以将其作为 xml 文件上传。

有什么办法可以做到吗?

目前这就是我正在做的

private def createConfiguration(def sessiontoken)
{
/*reqParams is request.getParameterMap(), fileParams is again a map*/
def charset = "UTF-8";
def query = String.format("emailaddress=%s&projectid=%s&cfgname=%s&cfgdesc=%s&cfgfile=%s",
URLEncoder.encode(sessiontoken, charset),
URLEncoder.encode(reqParams.c_Cfgname[0], charset),
URLEncoder.encode(reqParams.c_Cfgdesc[0], charset),
URLEncoder.encode(reqParams.c_Cfgtype[0], charset),
URLEncoder.encode(reqParams.CFGFILE[0], charset),)

URLConnection connection = new URL(fileParams.login).openConnection()
connection.setDoOutput(true)
connection.setRequestProperty("Accept-Charset", charset)
connection.setRequestProperty("Content-Type", "multipart/form-data;charset=" + charset)
try {
connection.getOutputStream().write(query.getBytes(charset))
}
finally {
connection.getOutputStream().close()
}
InputStream response = connection.getInputStream()
def xmlString=response.getText()
xmlString
}

下面是抓取到的异常

严重:servlet RedirectRequest 的 Servlet.service() 抛出异常java.io.IOException:服务器返回 HTTP 响应代码:800 URL:http://abhishek157:10070/project/create.action在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知来源)在 sun.net.www.protocol.http.HttpURLConnection$getInputStream.call(未知来源)..

更新

得到这个非常有用 link by BalusC所以我用了它。

private def getStreamFromString(str)
{
// convert String into InputStream
InputStream is = new ByteArrayInputStream(str.getBytes())
is
}

private def createConfiguration(def sessiontoken)
{


println "ok good $sessiontoken"
def charset = "UTF-8"
def boundary = Long.toHexString(System.currentTimeMillis())
def CRLF = "\r\n"
String param = "value"

URLConnection connection = new URL(fileParams.create).openConnection()
println fileParams.create
connection.setDoOutput(true)
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
PrintWriter writer = null
try {

OutputStream output = connection.getOutputStream()
writer = new PrintWriter(new OutputStreamWriter(output, charset), true)

// Sending normal param.
writer.append("--" + boundary).append(CRLF)
writer.append("Content-Disposition: form-data; name=\"sessiontoken\"$CRLF$CRLF$sessiontoken").append(CRLF)
//writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF)
writer.append(CRLF)
writer.append(param).append(CRLF).flush()

writer.append("--" + boundary).append(CRLF)
writer.append("Content-Disposition: form-data; name=\"cfgname\"$CRLF$CRLF${reqParams.c_Cfgname[0]}").append(CRLF)
//writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF)
writer.append(CRLF)
writer.append(param).append(CRLF).flush()

writer.append("--" + boundary).append(CRLF)
writer.append("Content-Disposition: form-data; name=\"cfgdesc\"$CRLF$CRLF${reqParams.c_Cfgdesc[0]}").append(CRLF)
//writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF)
writer.append(CRLF)
writer.append(param).append(CRLF).flush()

writer.append("--" + boundary).append(CRLF)
writer.append("Content-Disposition: form-data; name=\"cfgenv\"$CRLF$CRLF${reqParams.c_Cfgtype[0]}").append(CRLF)
//writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF)
writer.append(CRLF)
writer.append(param).append(CRLF).flush()

// Sending xml file.
writer.append("--" + boundary).append(CRLF)
writer.append("Content-Disposition: form-data; name=\"cfgfile\"; filename=\"" + reqParams.FILENAME[0] + "\"").append(CRLF)
writer.append("Content-Type: text/xml; charset=" + charset).append(CRLF)
writer.append(CRLF).flush()
BufferedReader reader = null
try {
reader = new BufferedReader(new InputStreamReader(getStreamFromString(reqParams.CFGFILE[0]), charset))
for (String line; (line = reader.readLine()) != null;) {
writer.append(line).append(CRLF)
}
}
catch(Exception e) {
e.printStackTrace()
}
finally {
if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}
writer.flush();
writer.append("--" + boundary + "--").append(CRLF)
}
finally {
if (writer != null) writer.close();
}
InputStream response = connection.getInputStream()
def xmlString=response.getText()
xmlString
}

然后在控制台上我得到了

<德尔> http://abhishek157:10070/project/create.action
完成

但它根本没有命中 http://abhishek157:10070/project/create.action
有帮助吗?

更多更新

真正的请求(从 html 表单工作,我从网络浏览器中选择文件)

-----------------------------7dcf4d30e8a
Content-Disposition: form-data; name="sessiontoken"

4611685684744086913
-----------------------------7dcf4d30e8a
Content-Disposition: form-data; name="cfgname"

sadf
-----------------------------7dcf4d30e8a
Content-Disposition: form-data; name="cfgdesc"

sadf
-----------------------------7dcf4d30e8a
Content-Disposition: form-data; name="cfgenv"

Production
-----------------------------7dcf4d30e8a
Content-Disposition: form-data; name="cfgfile"; filename="C:\Simon\xmls\agentind.xml"
Content-Type: text/xml

<?xml version="1.0" encoding="UTF-8"?> and so on...

根据 fiddler 中的实际请求匹配后更新了 params 部分。参见 createConfiguration 函数

获取异常(从 servlet 调用 create.action 时)

注意:我在发送create.action中的参数之前检查了servlet,都是有效的

java.lang.NumberFormatException: null 

服务器中没有读取任何参数,所有参数都以 null 的形式出现。问题出在哪儿。请帮忙。

最佳答案

在更新后的代码中,您忘记调用 connection.getInputStream(); 来实际发送 HTTP 请求(并检索 HTTP 响应)。

关于java - 如何在服务器端调用带有多部分请求的 URL,其中有一个包含文件内容的字符串而不是文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10447266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com