On Sat, 2019-06-01 at 23:27 +0100, Adam Retter wrote:
> Hi Norm,
> 
> I think this might be what you are looking for:
> 
> package norm1;
> 
> import org.apache.http.HttpEntity;
> import org.apache.http.client.methods.HttpPost;
> import org.apache.http.entity.ContentType;
> import org.apache.http.entity.mime.FormBodyPart;
> import org.apache.http.entity.mime.FormBodyPartBuilder;
> import org.apache.http.entity.mime.MultipartEntityBuilder;
> import org.apache.http.entity.mime.content.StringBody;
> import org.apache.http.impl.client.CloseableHttpClient;
> import org.apache.http.impl.client.HttpClientBuilder;
> 
> import java.io.IOException;
> 
> public class MultipartExample {
> 
>     public static void main(final String args[]) throws IOException {
> 
>         try(final CloseableHttpClient client =
> HttpClientBuilder.create().build()) {
> 
>             final FormBodyPart part1 = FormBodyPartBuilder.create()
>                     .setName("part1")
>                     .addField("X-HELLO", "adam")
>                     .addField("X-HELLO", "norm")
>                     .setBody(new StringBody("<some-body/>",
> ContentType.TEXT_XML))
>                     .build();
> 
>             final FormBodyPart part2 = FormBodyPartBuilder.create()
>                     .setName("part2")
>                     .addField("X-BYE", "adam")
>                     .addField("X-BYE", "norm")
>                     .setBody(new StringBody("{\"some\": \"json\"}",
> ContentType.APPLICATION_JSON))
>                     .build();
> 
>             final HttpEntity entity = MultipartEntityBuilder.create()
>                     .addPart(part1)
>                     .addPart(part2)
>                     .build();
> 
> 
>             final HttpPost post = new HttpPost("http://localhost:8080
> ");
>             post.setEntity(entity);
> 
>             client.execute(post);
>         }
>     }
> }
> 
> 
> On my system that produces a HTTP Request like:
> 
> POST / HTTP/1.1
> Content-Length: 456
> Content-Type: multipart/form-data;
> boundary=ZQwFLuoO6V1SFdqg2lI6DaVwlvKIZjj2Pb
> Host: localhost:8080
> Connection: Keep-Alive
> User-Agent: Apache-HttpClient/4.5.8 (Java/1.8.0_202)
> Accept-Encoding: gzip,deflate
> 
> --ZQwFLuoO6V1SFdqg2lI6DaVwlvKIZjj2Pb
> X-HELLO: adam
> X-HELLO: norm
> Content-Disposition: form-data; name="part1"
> Content-Type: text/xml; charset=ISO-8859-1
> Content-Transfer-Encoding: 8bit
> 
> <some-body/>
> --ZQwFLuoO6V1SFdqg2lI6DaVwlvKIZjj2Pb
> X-BYE: adam
> X-BYE: norm
> Content-Disposition: form-data; name="part2"
> Content-Type: application/json; charset=UTF-8
> Content-Transfer-Encoding: 8bit
> 
> {"some": "json"}
> --ZQwFLuoO6V1SFdqg2lI6DaVwlvKIZjj2Pb--
> 
> 
> Personally I find the naming of some of these things
> inaccurate/misleading... i.e. the class `FormBodyPart`, and the
> method
> `addField` (which appears to actually add a header). Regardless it
> seems to "just about work".
> 
> Hope that helps?
> 
> Kind Regards. Adam.
> 

Here's something similar based on Apache Mime4j

---
StorageBodyFactory bodyFactory = new StorageBodyFactory();
Message message = Message.Builder.of()
        .setFrom("John Doe <jdoe@machine.example>")
        .setTo("Mary Smith <m...@example.net>")
        .setSubject("An image for you")
        .setDate(new Date())
        .generateMessageId(InetAddress.getLocalHost().getCanonicalHostName())
        .setBody(MultipartBuilder.create("mixed")
                .use(bodyFactory)
                .setPreamble("This is a multi-part message in MIME format.")
                .addBodyPart(BodyPartBuilder.create()
                        .use(bodyFactory)
                        .setBody("Why so serious?", Charsets.UTF_8)
                        .setContentTransferEncoding("quoted-printable")
                        .build())
                .addBodyPart(BodyPartBuilder.create()
                        .use(bodyFactory)
                        .setBody(new byte[] { 1, 2, 3}, 
"application/octet-stream")
                        .setContentTransferEncoding("base64")
                        .setContentDisposition("attachment", "smiley.png")
                        .build())
                .build())
        .build();

EntityTemplate entityTemplate = new EntityTemplate(outstream -> {
    try {
        MessageWriter writer = new DefaultMessageWriter();
        writer.writeMessage(message, outstream);
    } finally {
        message.dispose();
    }
});
entityTemplate.setContentType(message.getMimeType());
---

Oleg


> On Sat, 1 Jun 2019 at 18:58, Norman Walsh <n...@nwalsh.com> wrote:
> > 
> > Hi all,
> > 
> > Apologies if I’ve been down this road before on this list. The
> > HttpClient 4.5 library has changed the way multipart works (from
> > some
> > earlier 4.x where I had it working).
> > 
> > Near as I can tell from looking at the multipart examples in 4.5,
> > they’re all geared towards file uploading. I’m not interested in
> > file
> > uploading, I want to construct a payload for a web service that’s
> > expecting a multipart/mixed request: I want complete control over
> > the
> > parts, the headers associated with those parts, their content
> > types,
> > etc.
> > 
> > I stumbled from HttpClient to MIME4J, prehaps on the advice of
> > someone
> > from this list. I got a little further that way, at least in as
> > much
> > as I now believe I’ve constructed a mime4j.message that is
> > logically
> > what I want to send.
> > 
> > But I cannot see how to get from that back to an HttpEntity that I
> > can
> > set as the entity for an HttpClient request.
> > 
> > Does anyone have an example of sending a fully general
> > multipart/mixed
> > example? Or is anyone familiar enough with both HttpClient and
> > MIME4J
> > to point me to an explanation of how to turn one of those into a
> > request Entity?
> > 
> > (Multipart is only one possibility so I’d really, really rather not
> > have to have two entirely different code paths where I use
> > HttpClient
> > for some requests and use direct serialization of MIME4J payloads
> > over
> > a URLConnection for the other.)
> > 
> > Help and advice most humbly solicited.
> > 
> >                                         Be seeing you,
> >                                           norm
> > 
> > --
> > Norman Walsh <n...@nwalsh.com> | Why do writers write? Because it
> > isn't
> > http://nwalsh.com/m/            | there.--Thomas Berger
> 
> 
> 
> --
> Adam Retter
> 
> eXist Core Developer
> { United Kingdom }
> a...@exist-db.org
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
> For additional commands, e-mail: httpclient-users-h...@hc.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
For additional commands, e-mail: httpclient-users-h...@hc.apache.org

Reply via email to