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

我的servlet中有一个xml文件内容作为字符串,我需要调用另一个带有多部分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 } 

以下是获取的exception

严重:servlet的Servlet.service()RedirectRequest引发exceptionjava.io.IOException:服务器返回HTTP响应代码:800为URL: http://abhishek157:10070/project/create.action at sun.net.www.protocol。 sun.net.www.protocol.http.HttpURLConnection $ getInputStream.call(未知来源)中的http.HttpURLConnection.getInputStream(未知来源)。 。

更新

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 /项目/ create.action
DONE

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

更多更新

真实的请求(从html表单开始,我从web浏览器中选择文件)

 -----------------------------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  and so on... 

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

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

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

 java.lang.NumberFormatException: null 

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

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