【问题标题】:'Improperly formatted request' error after switching from Commons HttpClient to HttpComponents从 Commons HttpClient 切换到 HttpComponents 后出现“格式不正确的请求”错误
【发布时间】:2014-12-03 14:15:40
【问题描述】:

我有一些代码,向 API 发送 multipart/form-data 请求。使用 Apache 的 commons-httpclient 3.1 它可以工作,但是切换到 httpclient 4.3.5,我遇到了 API 的问题。您可以在下面找到这两个代码示例。由于它与 Salesforce API 有关,我还向SFSE 发布了一个问题,因为我仍然不确定这是否是我或他们方面的问题。但是,我的问题是:我是否将代码正确迁移到 4.3.5?如果是,httpclient 在执行multipart/form-data 请求时的行为是否有任何变化?

代码示例如下:

commons-httpclient 3.1

String json = "{ \"body\":{ \"messageSegments\":[ { \"type\":\"Text\", \"text\":\"Here is another receipt.\" } ] }, \"capabilities\":{ \"content\":{ \"title\":\"receipt2\"} } }";

PostMethod filePost = new PostMethod("https://eu3.salesforce.com/services/data/v32.0/chatter/feed-elements/<some_feed_element_id>/capabilities/comments/items");
filePost.addRequestHeader("Authorization", token());

StringPart jsonPart = new StringPart("json", json);
jsonPart.setContentType(ContentType.APPLICATION_JSON.getMimeType());

FilePart filePart = new FilePart("feedElementFileUpload", file);
filePart.setContentType(ContentType.APPLICATION_OCTET_STREAM.getMimeType());

Part[] parts = { jsonPart, filePart };
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
int response = httpclient.executeMethod(filePost);

有线/上下文日志:http://pastebin.com/RCg20Ygn

httpclient 4.3.5

String json = "{ \"body\":{ \"messageSegments\":[ { \"type\":\"Text\", \"text\":\"Here is another receipt.\" } ] }, \"capabilities\":{ \"content\":{ \"title\":\"receipt2\"} } }";

String attachmentName = "package.xml";
CloseableHttpClient client = HttpClientBuilder
    .create()
    .setDefaultHeaders(Lists.newArrayList())
    .build();
HttpPost post = new HttpPost(
   "https://eu3.salesforce.com/services/data/v32.0/chatter/feed-elements/<feed_element_id>/capabilities/comments/items"
);
post.addHeader(HttpHeaders.AUTHORIZATION, token());
post.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.MULTIPART_FORM_DATA.getMimeType());

post.setEntity(
    MultipartEntityBuilder.create()
        .setStrictMode()
        .addPart(
            "json",
            new StringBody(
                json,
                ContentType.APPLICATION_JSON
            )
        )
        .addPart(
            "feedElementFileUpload",
            new FileBody(
                new File(attachmentName),
                ContentType.APPLICATION_OCTET_STREAM,
                attachmentName
            )
        )
        .build()
);
CloseableHttpResponse response = client.execute(post);

有线/上下文日志:http://pastebin.com/EHXd1y50

更新 1:

我已经尝试了MultipartEntityBuilderSTRICTBROWSER_COMPATIBLERFC6532)的所有三种可用模式,但它仍然不起作用。

【问题讨论】:

    标签: java migration apache-httpclient-4.x apache-commons-httpclient


    【解决方案1】:

    在使用 MultipartEntityBuilder 构造请求实体时尝试使用“浏览器兼容”模式而不是“严格”模式

    更新 1:

    "Content-Type: multipart/form-data[\r][\n]"
    

    这显然是错误的(缺少边界属性)并且可能是请求被拒绝的原因。

    请删除此行并重试

    post.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.MULTIPART_FORM_DATA.getMimeType());
    

    【讨论】:

    • 感谢您的回复!我刚刚尝试了所有三种可用模式,但仍然无法正常工作。
    • 发布 HC3 和 HC4 会话的线路/上下文日志。有关详细信息,请参阅 HttpClient 日志记录指南。
    • 我已经在相应的代码示例下面添加了日志。
    • 有效!感谢无数次!
    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2012-08-22
    相关资源
    最近更新 更多