2016-05-22 19 views
0

私はApache HttpComponents v4.3.6(maven httpclientとhttpmime)を使用しています。私はマルチパートとしてファイルデータをアップロードする必要があります。動作するFiddlerコマンドは、次のようになります。フィドラーにマルチパートデータのJava httpポスト

Content-Type: multipart/form-data; boundary=c2d7073062e24d86ad739647574e14b9 
Accept: application/json 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:22.0) Gecko/20100101 Firefox/22.0 

リクエストボディ:フィドラーに

要求ヘッダー

--c2d7073062e24d86ad739647574e14b9 
Content-Disposition: form-data; name="categoryFile"; filename="self-classification-categories.tsv" 

585743 583099 Existing Catrali 4Category ch Description of 4 Existing Category false false false Some notes 4 relating to Existing Category 
--c2d7073062e24d86ad739647574e14b9-- 

ファイルの実際の内容は次のとおり

585743 583099 Existing Catrali 4Category ch Description of 4 Existing Category false false false Some notes 4 relating to Existing Category 

今、私はApache Http Clientでこの投稿要求(上記)を実装しようとしましたが、実際にどのように行うのか分かりません。 Javaの(1.8)に上記の要求を変換するには、私が試した:(境界値:c2d7073062e24d86ad739647574e14b9)

httpclient = HttpClients.createDefault(); 
HttpPost httpPost = new HttpPost(createPostURI(host, path)); 

httpPost.setHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:22.0) Gecko/20100101 Firefox/22.0"); 
httpPost.setHeader("Content-Type", "multipart/form-data; boundary=c2d7073062e24d86ad739647574e14b9"); 
httpPost.setHeader("Accept", "application/json"); 


String fileContent = "--c2d7073062e24d86ad739647574e14b9\r\nContent-Disposition: form-data; name=\"categoryFile\"; filename=\"self-classification-categories.tsv\""+ 
       "\r\n\r\n"+ 
       "585743 583099 Existing Catrali 4Category ch Description of 4 Existing Category false false false Some notes 4 relating to Existing Category" 
       +"\r\n--c2d7073062e24d86ad739647574e14b9--"; 

MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
builder.setBoundary("c2d7073062e24d86ad739647574e14b9"); 
builder.addTextBody("body", fileContent,ContentType.MULTIPART_FORM_DATA); 

HttpEntity entity = builder.build(); 
httpPost.setEntity(entity); 

response = httpclient.execute(httpPost, new GenericResponseHandler()); 

を私はJavaでリクエストボディを作り上げています方法が間違っていることを確信しています。したがって、予想されるformat.Iが表示されない場合、私が呼び出しているREST APIがこのエラーをスローするので、誤解を招くような403エラーが表示されます。

ありがとうございます。

+0

サーバーがアクセスを拒否すると、403が表示されます。あなたのコードは私にはうまく見えます。また、あなたはファイルから本文の内容を読んでそれを使ってみることができますか? –

答えて

1

私はフィドラーからの成功したトランザクションを持っていたので、私はeclipseとフィディラーを統合して、Javaコードを通じてapi-callによって作られた違いを理解しました。最後に、このコードで成功しました。

public GenericResponse processHttpPostRequest(String host, String path,String content, Map<String, String> parameters, String multiPartDataBounadry ,String outfilePath) 
{ 
    CloseableHttpClient httpclient = null; 

    GenericResponse response = null; 
    try 
    { 
     //This is important to integrate eclipse with fiddler 
     HttpHost proxy = new HttpHost("localhost", 8888); 

     HttpPost httpPost = new HttpPost(createPostURI(host, path,parameters)); 


     setHeader(multiPartDataBounadry, httpPost); 

     //This is important to integrate eclipse with fiddler 
     httpclient = HttpClients.custom().setProxy(proxy).disableContentCompression().build(); 
     //httpclient = HttpClients.createDefault(); 

     HttpEntity entity = setRequestBody(content, multiPartDataBounadry); 

     httpPost.setEntity(entity); 

     LOGGER.info("Executing request URI " + httpPost.getURI()); 

     response = httpclient.execute(httpPost, new GenericResponseHandler()); 
     handleResponse(response, outfilePath); 

     if (response.getStatusCd() != 200) 
     { 
      handleResponseError(parameters, response); 
     } 

    } 
    catch(Throwable e) 
    { 
     e.printStackTrace(); 
     throw new RuntimeException(e); 
    } 

    finally 
    { 
     closeClient(httpclient); 
    } 

    return response; 
} 

private void setHeader(String multiPartDataBounadry, HttpEntityEnclosingRequestBase httpEntity) 
{ 
    httpEntity.setHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:22.0) Gecko/20100101 Firefox/22.0"); 
    httpEntity.setHeader("Content-Type", "multipart/form-data; boundary="+multiPartDataBounadry); 
    httpEntity.setHeader("Accept", "application/json"); 
} 

private HttpEntity setRequestBody(String content, String multiPartDataBounadry) 
{ 
    FormBodyPart bodyPart = FormBodyPartBuilder.create()      
      .setName("any_name") 
      .addField("Content-Disposition", "form-data; name=\"categoryFile\"; filename=\"self-classification-categories.tsv\"") 
      .setBody(new StringBody(content, ContentType.MULTIPART_FORM_DATA)) 
      .build(); 

    MultipartEntityBuilder builder = MultipartEntityBuilder.create() 
      .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) 
      .setBoundary(multiPartDataBounadry) 
      .addPart(bodyPart); 

    HttpEntity entity = builder.build(); 

    return entity; 

} 


private URI createPostURI(String host, String path , Map<String, String> parameters) throws Exception 
{ 
    URI finalURL = null; 
    try 
    { 
     URIBuilder url = null; 
     url = new URIBuilder(); 
     url.setScheme("http"); 
     url.setHost(host); 
     url.setPath(path); 
     url.setParameter("first_param", "first_param_value"); 
     url.setParameter("second_param","second_param_value"); 

     finalURL = url.build() ; 

    } 
    catch (URISyntaxException | IllegalArgumentException e) 
    { 
     e.printStackTrace(); 
     throw e; 
    } 

    return finalURL; 
} 
関連する問題