当前位置: 首页 > 知识库问答 >
问题:

Apache Http 4.5 StringBody构造函数未在请求中导出内容类型

秦昂然
2023-03-14

使用Apache Http 4.5 MultipartEntityBuilder,似乎无法理解为什么StringBody(String,ContentType)构造函数实际上没有在请求表单正文中输出内容类型。

public HttpRequestBase build() throws UnsupportedEncodingException {
    HttpPost httpPost = new HttpPost("https://{server}/restapi/{apiVersion}/accounts/{accountId}/envelopes");

    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    builder.setContentType(ContentType.MULTIPART_FORM_DATA);
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    builder.setBoundary("AAA");

    //add form body
    builder.addPart(generateJsonFormBodyPart());

    //add file body
    builder.addPart(generateFileFormBodyPart()); //<--intentionally omitted

    HttpEntity multipart = builder.build();

    httpPost.setEntity(multipart);

    return httpPost;

}

private FormBodyPart generateJsonFormBodyPart() throws UnsupportedEncodingException{
        StringBody json = new StringBody(packageJson(), ContentType.APPLICATION_JSON); //<--THIS DOESN'T SEEM TO WORK    
        StringBuilder buffer = new StringBuilder();
        buffer.append("form-data");

        String contentDisposition = buffer.toString();

        FormBodyPartBuilder partBuilder = FormBodyPartBuilder.create("application/json", json);
        partBuilder.setField(MIME.CONTENT_DISPOSITION, contentDisposition);

        FormBodyPart fbp = partBuilder.build();

        return fbp;
    }

文件部分输出正常,但是我从对等端得到一个“坏请求”返回,我假设这是因为它有非常特定的请求参数。

所需的请求输出

接受:应用程序/json内容类型:多部分/表单数据;边界=AAA

--AAA内容类型:应用程序/json内容处置:表单数据

删除json

--AAA内容类型:应用程序/pdf内容配置:文件;filename=“test1.pdf”;documentid=1

删除的文件

实际Apache Http 4.5输出

X-Docusign-Act-As-User:xyz@company.com接受编码:gzip,deflate用户代理:apachehttpclient/4.5(Java/1.8.0_65)连接时间:0主机:requestb。连接中:关闭内容长度:3178授权:承载xxxxrandomoauthtokenxxxxx内容类型:多部分/表单数据;边界=AAA;charset=ISO-8859-1 Via:1.1 vegur X-Request-Id:89cd1cf5-3615-41e8-84ba-cd076a03af67总路线时间:0

--AAA内容配置:表单数据//

{"状态":"已创建","emailBlurb":"欢迎Confluence","email主题":"欢迎Confluence","文档":{"名称":"欢迎onfluence.html","文件ID":"1","订单":"1"},"收件人":{}}

########################################################################################################################

已删除h t m l字符串

问:那么为什么StringBody构造函数中的ContentType会被忽略呢?有解决办法吗?还是我做错了?

共有1个答案

闾丘选
2023-03-14

我确信这是ApacheHTTPMIME中FormBodyPart的一个bug。处理StringBody时生成()。4.5发行说明中的证据。2表示未输出“内容类型”的其他“正文”类型的错误修复支持这一点。我将记录一个缺陷。

解决办法:

private FormBodyPart generateJsonFormBodyPart() throws UnsupportedEncodingException{
    StringBody json = new StringBody(getMyJsonStuff(), ContentType.APPLICATION_JSON); //<--THE GOGGLES, THEY DO NOTHING!!

    StringBuilder buffer = new StringBuilder();
    buffer.append("form-data");
    buffer.append("\r\n");
    buffer.append("Content-Type: application/json"); //<--tack this on to the 

    String kludgeForDispositionAndContentType = buffer.toString();

    FormBodyPartBuilder partBuilder = FormBodyPartBuilder.create("stuff", json);
    partBuilder.setField(MIME.CONTENT_DISPOSITION, kludgeForDispositionAndContentType);

    FormBodyPart fbp = partBuilder.build();

    return fbp;
}

像魅力一样工作。

 类似资料:
  • 我有两个类:Date和Person Person有Date类的两个属性 案例1 类是与Person类分开的类。我有这段代码正常工作: 案例2:内部类(赋值要求) 我把作为Person的私有内部类 现在,上面的构造函数代码不再工作了。以下是错误消息: 说明资源路径位置类型由于某些中间构造函数调用人员,类型Person的封闭实例不可用。java/Wk03_Ch10_文件IO_Ch13_接口/Wk03_

  • C++ 类 & 对象 类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地理解构造函数的概念:#include <iostream> using namespace std; class Line { public: v

  • 说明: Worker::__construct([string $listen , array $context]) 初始化一个Worker容器实例,可以设置容器的一些属性和回调接口,完成特定功能。 参数 $listen 如果有设置监听$listen参数,则会执行socket监听。 $listen的格式为 <协议>://<监听地址> <协议> 可以为以下格式: tcp: 例如 tcp://0.0.

  • 在.citydoor.imports.catalog.tools中打包;

  • 我有一个使用axios发送post请求的表单。问题在于,发送请求时使用的标题的内容类型为:multipart/form data。我的nodejsapi不喜欢这样,它给了我一个未定义的req。身体 我有其他使用相同技术的表单,它们可以工作,标题与预期的一样:Content-Type:application/json;字符集=UTF-8 张贴Content-Type: Multipart/form-

  • 问题内容: 我正在使用JavaScript / ES6中的新功能。我的代码中有一个。据我所知,这里没有错误!这是一个错误吗?任何解决方法? index.html 实体.js player.js 问题答案: 这是新类语法的事实。您的子类需要调用才能正确初始化该类,例如 带有父构造函数所需的任何参数。 要求,如果执行到达函数的末尾,则需要将值初始化为某种值。您可能需要在一个基类(这里是自动初始化的),