AppEngine上的多部分POST(Java)

时间:2012-11-27 19:32:29

标签: java google-app-engine http apache-httpclient-4.x

简单的问题(我很困惑,我在这里找不到答案):

我想从我的AppEngine Java servlet(出站)执行多部分编码的HTTP POST。 AppEngine似乎不支持Apache HTTP lib,也不提供API本身(仅setPayload(byte[])),但我想避免自己实现Multipart编码。所以:

  1. 有没有办法从AppEngine Java发送多部分HTTP主体?

  2. 是否有一个将这样的主体编码为byte[]数组的库? (请注意,MultiPartEntity.getContent()未实现。)然后我可以使用AppEngine内部URLFetch API(由于异步调用功能,我更喜欢它)。

2 个答案:

答案 0 :(得分:2)

我编写了一个小帮助方法,为AppEngine添加了Multipart POST支持(使用Apache HTTP客户端库)。

public static void addMultipartBodyToRequest(MultipartEntity entity, HTTPRequest req) throws IOException{

    /*
     * turn Entity to byte[] using ByteArrayOutputStream
     */
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    entity.writeTo(bos);
    byte[] body = bos.toByteArray();

    /*
     * extract multipart boundary (body starts with --boundary\r\n)
     */
    String boundary = new BufferedReader(new StringReader(new String(body))).readLine();
    boundary = boundary.substring(2, boundary.length());

    /*
     * add multipart header and body
     */
    req.addHeader(new HTTPHeader("Content-type", "multipart/form-data; boundary=" + boundary));
    req.setPayload(body);
}

调用代码如下所示:

            MultipartEntity e = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
            e.addPart("part1", new StringBody("value1"));
            e.addPart("part2", new StringBody("value2"));

            HTTPRequest req = new HTTPRequest(new URL(myUrl), HTTPMethod.POST);
            ServletHelper.addMultipartBodyToRequest(e, req);

            URLFetchServiceFactory.getURLFetchService().fetchAsync(req);

答案 1 :(得分:0)

您可以使用MultipartEntity中的httpmime

她是an example