2010-02-21 19 views
52

Estoy muy verde con HttpClient y estoy encontrando la falta de documentación (y/o descaradamente incorrecta) extremadamente frustrante. Estoy intentando implementar la siguiente publicación (enumerada a continuación) con Apache Http Client, pero no tengo idea de cómo hacerlo realmente. Voy a enterrarme en la documentación para la próxima semana, pero tal vez los codificadores HttpClient más experimentados puedan obtener una respuesta antes.Apache HttpClient haciendo multiparte formulario post

la publicación:

Content-Type: multipart/form-data; boundary=---------------------------1294919323195 
Content-Length: 502 
-----------------------------1294919323195 
Content-Disposition: form-data; name="number" 

5555555555 
-----------------------------1294919323195 
Content-Disposition: form-data; name="clip" 

rickroll 
-----------------------------1294919323195 
Content-Disposition: form-data; name="upload_file"; filename="" 
Content-Type: application/octet-stream 


-----------------------------1294919323195 
Content-Disposition: form-data; name="tos" 

agree 
-----------------------------1294919323195-- 
+2

Gracias por preguntar el tipo de pregunta directamente relacionada con la depuración de la aplicación web ... ¡Encontré esto en Firebug y hasta ahora no sabía cómo escribir una consulta para emularlo! –

Respuesta

75

Uso MultipartEntityBuilder del HttpMime library para llevar a cabo la solicitud que desea.

En mi proyecto lo hago de esta manera:

HttpEntity entity = MultipartEntityBuilder 
    .create() 
    .addTextBody("number", "5555555555") 
    .addTextBody("clip", "rickroll") 
    .addBinaryBody("upload_file", new File(filePath), ContentType.create("application/octet-stream"), "filename") 
    .addTextBody("tos", "agree") 
    .build(); 

HttpPost httpPost = new HttpPost("http://some-web-site"); 
httpPost.setEntity(entity); 
HttpResponse response = httpClient.execute(httpPost); 
HttpEntity result = response.getEntity(); 

Esperamos que esto ayude.

(actualizado este post utilizar MultipartEntityBuilder en lugar de MultipartEntity desuso, utilizando el código @mtomy como el ejemplo)

+2

MultipartEntity ahora aparece como obsoleto. Estoy usando apache httpclient 4.3.3. ¿Alguien sabe lo que se supone que debemos usar en su lugar? Las búsquedas de Google están tan llenas de ejemplos de MultipartEntity que no puedo encontrar nada. – vextorspace

+11

Utilice MultipartEntityBuilder. Ejemplo corto: HttpEntity entity = MultipartEntityBuilder.create(). AddTextBody ("campo1", "valor1"). AddBinaryBody ("myfile", nuevo archivo ("/ ruta/archivo1.txt"), ContentType.create (" application/octet-stream ")," file1.txt "). build(); – mtomy

13

MultipartEntity ahora se muestra como obsoleta. Estoy usando Apache httpclient 4.3.3 - ¿Alguien sabe lo que se supone que debemos usar en su lugar? Encuentro que las búsquedas de Google están tan llenas de ejemplos de MultipartEntity que no puedo encontrar nada. - vextorspace 31 de Mar '14 a 20:36

Aquí está el código de ejemplo en HttpClient 4.3.x

http://hc.apache.org/httpcomponents-client-4.3.x/httpmime/examples/org/apache/http/examples/entity/mime/ClientMultipartFormPost.java

import org.apache.http.entity.mime.MultipartEntityBuilder; 

HttpPost httppost = new HttpPost("http://localhost:8080" + 
     "/servlets-examples/servlet/RequestInfoExample"); 

FileBody bin = new FileBody(new File(args[0])); 
StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN); 

HttpEntity reqEntity = MultipartEntityBuilder.create() 
     .addPart("bin", bin) 
     .addPart("comment", comment) 
     .build(); 


httppost.setEntity(reqEntity); 

Para utilizar la clase MultipartEntityBuilder, necesita httpmime, que es un proyecto secundario de HttpCliente

HttpClient 4.3.x:

http://hc.apache.org/httpcomponents-client-4.3.x/index.html

httpmime 4.3.x:

http://hc.apache.org/httpcomponents-client-4.3.x/httpmime/dependency-info.html

2

si el envase uso org.apache.commons.httpclient.HttpClient, tal vez eso puede ayudarle!

HttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager(); 
    //here should set HttpConnectionManagerParams but not important for you 
    HttpClient httpClient = new HttpClient(httpConnectionManager); 

    PostMethod postMethod = new PostMethod("http://localhost/media"); 

    FilePart filePart = new FilePart("file", new File(filepath)); 
    StringPart typePart = new StringPart("type", fileContent.getType(), "utf-8"); 
    StringPart fileNamePart = new StringPart("fileName", fileContent.getFileName(), "utf-8"); 
    StringPart timestampPart = new StringPart("timestamp", ""+fileContent.getTimestamp(),"utf-8"); 
    Part[] parts = { typePart, fileNamePart, timestampPart, filePart }; 

    MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(parts, postMethod.getParams()); 
    postMethod.setRequestEntity(multipartRequestEntity); 
    httpClient.executeMethod(postMethod); 
    String responseStr = postMethod.getResponseBodyAsString(); 
+0

es para HttpClient 3.x no para 4.x. – M2E67

Cuestiones relacionadas