2016-05-22 14 views
0

Ich benutze Apache HttpComponents v4.3.6 (Maven httpclient und httpmime). Ich muss eine Datei als Multipart hochladen. Der Fiddler-Befehl, der funktioniert, sieht folgendermaßen aus.Java http Post für mehrteilige Daten

Anforderungs-Header auf Fiddler:

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 

Anfrage Körper auf Fiddler:

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

Wo der eigentliche Inhalt der Datei ist:

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

Jetzt, Ich bin versuchen, diese Post-Anfrage (oben beschrieben) mit Apache Http Client zu implementieren, haben aber keine Ahnung, wie es eigentlich geht. Um die oben genannte Anforderung in Java (1.8) zu konvertieren, habe ich versucht: (Boundary-Wert: 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()); 

Ich bin sicher, dass die Art, wie ich bin Crafting den Anfrage-Körper in Java falsch ist. Daher sehe ich 403 Fehler, der irgendwie irreführend ist, da die REST-API, die ich anrufe, diesen Fehler verursacht, wenn er das erwartete Format nicht sieht. Ich würde jede Hilfe schätzen.

Vielen Dank im Voraus.

+0

403 kommt, wenn Server den Zugriff verweigert. Dein Code sieht für mich gut aus. Können Sie auch versuchen, den Body-Inhalt aus einer Datei zu lesen und zu benutzen? –

Antwort

1

Da ich erfolgreiche Transaktionen von Fiddler hatte, integrierte ich Fiddler mit Eclipse, um herauszufinden, welche Unterschiede die API-Aufrufe durch Java-Code gemacht haben. Und schließlich, war erfolgreich mit diesem Code:

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; 
}