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