我可以在SOAP UI中执行POST请求。但我不能从java做同样的事情,已经尝试了大约5-6个小时而无法找到胜利的组合。这是我正在努力工作的帖子的xsd架构部分:
<method name="POST">
<request>
<param name="username" style="query" type="xs:string"/>
<param name="id" style="query" type="xs:long"/>
<representation mediaType="multipart/form-data"/>
</request>
我只是用肥皂ui中的c / p有效载荷:
<?xml version="1.0" encoding="UTF-8"?>
<ImageList xmlns="http://someurl/1.0/image" >
<Image>
<Name>sampler.jpg</Name>
<Filename>C:\\sampler.jpg</Filename>
<Label>
<Value>Test image</Value>
</Label>
<ImageMetadata>
<Format>jpg</Format>
<Height>300</Height>
<Width>400</Width>
</ImageMetadata>
</Image>
</ImageList>
然后我在附件标签中添加附件。 Name
,Content-Type
等,我得到了有效的响应代码,但是我没有设法对java做同样的事情,这就是我得到的:
HttpRequestBase post = new HttpPost();
HttpClient client = new DefaultHttpClient();
try {
post.setURI(new URI(URL));
} catch (URISyntaxException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// set number of retries
post.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(1, false));
HttpResponse response = null;
HttpPost post = (HttpPost) method;
try {
post.setURI(new URI(URL));
} catch (URISyntaxException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
FileBody uploadFilePart = new FileBody(new File("C:\\sampler.jpg"));
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("upload-file", uploadFilePart);
//payload
String requestBody = fileToString("src/main/resources/imageBodyPayload.xml");
HttpParams parameters = new BasicHttpParams();
parameters.setLongParameter("id", 951);
parameters.setParameter("username", "test");
post.setParams(parameters);
post.setEntity(new StringEntity(requestBody, "multipart/form-data", HTTP.UTF_8));
response = client.execute(post);
所以我将有效负载设置为post请求,但我不能同时添加文件附件。
这是来自soap ui的原始请求的样子:
POST http://localhost:9080/imageUpload/?id=951&userame=test HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: multipart/form-data; boundary="----=_Part_9_23652504.1341953390382"
MIME-Version: 1.0
无法复制相同的行为
答案 0 :(得分:1)
您未在示例中将MultipartEntity
附加到HttpPost
请求,这就是文件未上传的原因。也许尝试这样的事情:
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
MultipartEntity reqEntity = new MultipartEntity();
String requestBody = fileToString("src/main/resources/imageBodyPayload.xml");
reqEntity.addPart("request-body", new StringBody(requestBody));
FileBody fileBody = new FileBody(new File("C:\\sampler.jpg"));
reqEntity.addPart("upload-file", fileBody);
HttpParams parameters = new BasicHttpParams();
parameters.setLongParameter("id", 951);
parameters.setParameter("username", "test");
httppost.setParams(parameters);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
我不知道你的情况下“request-body”的价值是多少,但是multipart / form-data请求的每个部分都需要有一个名字,所以如果你试图发送一个文件和在单个请求中有一些XML,您需要同时提供文件部分和XML部分名称。
“multipart / form-data”消息包含一系列部分,每个部分代表一个成功的控件。 每个部分都应包含一个name属性,用于指定相应控件的控件名称。
http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2