如何在服务器端调用带有多部分请求的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响应)。