2

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>

soap 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>

次に、添付ファイル タブに添付ファイルを追加します。NameContent-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);

そのため、投稿リクエストにペイロードを文字列として設定しましたが、同時に添付ファイルを追加することはできません。

これは、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

同じ動作を再現できません

4

1 に答える 1

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

于 2012-08-23T21:55:10.410 に答える