首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jersey-client发送到jetty的压缩GZIP请求不适用于FormDataMultiPart

使用jersey-client发送到jetty的压缩GZIP请求不适用于FormDataMultiPart
EN

Stack Overflow用户
提问于 2021-03-14 15:47:32
回答 1查看 108关注 0票数 0

Jersey客户端代码和jetty.xml -

..。

代码语言:javascript
复制
public class App 
{
    public static void main( String[] args ) throws FileNotFoundException
    {   
        String token = "abc";
        String file = "C:\\importedcerts\\TestpkgRoll.log";
        String uri = "http://localhost:8008/api/arsys/v1/entry/myattach1";
        
        Client client = ClientBuilder.newBuilder()
        
        .register(EncodingFilter.class)
        .register(GZipEncoder.class)
        .property(ClientProperties.USE_ENCODING, "gzip")
        .register(MultiPartFeature.class).build();

        FormDataMultiPart formDataMultiPart = new FormDataMultiPart();
        // json data
        String json = "{ \"values\" : { ";
        json += "\"Submitter__c\" : \"Allen\", ";
        json += "\"Short Description__c\" : \"testing 123\""
                + ", ";
        json += "\"Attachment__c\" : \"testrollback.log\"";
        json += " } }";

        
        formDataMultiPart.field("entry", json,
                MediaType.APPLICATION_JSON_TYPE);
            StreamDataBodyPart streamDataBodyPart = new StreamDataBodyPart("attach-Attachment__c", new FileInputStream(new File(file)), "testrollback.log", MediaType.APPLICATION_OCTET_STREAM_TYPE);
            formDataMultiPart.bodyPart(streamDataBodyPart);

        Builder request = client.target(uri).request(MediaType.APPLICATION_JSON);
        request.header("Authorization", "AR-JWT " + token);
        request.header("Content-Encoding", "gzip");

        Response response = null;
        response = request.method("POST",
//                Entity.json(json));
                Entity.entity(formDataMultiPart, MediaType.MULTIPART_FORM_DATA_TYPE));
        System.out.println(response);

    }
}

<Call name="insertHandler">
    <Arg>
      <New id="GzipHandler" class="org.eclipse.jetty.server.handler.gzip.GzipHandler">
        <Set name="minGzipSize"><Property name="jetty.gzip.minGzipSize" deprecated="gzip.minGzipSize" default="0"/></Set>
        <Set name="checkGzExists"><Property name="jetty.gzip.checkGzExists" deprecated="gzip.checkGzExists" default="false"/></Set>
        <Set name="inflateBufferSize"><Property name="jetty.gzip.inflateBufferSize" default="1024"/></Set>

        <Set name="excludedAgentPatterns">
          <Array type="String">
            <Item><Property name="jetty.gzip.excludedUserAgent" deprecated="gzip.excludedUserAgent" default=".*MSIE.6\.0.*"/></Item>
          </Array>
        </Set>

        <Call name="addIncludedMimeTypes">
          <Arg><Array type="String">
            <Item>application/octet-stream</Item>
          </Array></Arg>
        </Call>
        
        <Call name="addExcludedMimeTypes">
          <Arg><Array type="String">
            <Item>application/json</Item>
          </Array></Arg>
        </Call>
      </New>
    </Arg>
  </Call>

..。

但是,上面的请求处理失败,并出现异常- org.jvnet.mimepull.MIMEParsingException:缺少起始边界

然而,在我的客户中,当我注释掉时,如下所示...

代码语言:javascript
复制
//        .register(EncodingFilter.class)
//        .register(GZipEncoder.class)
//        .property(ClientProperties.USE_ENCODING, "gzip")

//        request.header("Content-Encoding", "aplication/gzip, gzip");

..。我能够成功地处理请求,当上面的部分没有注释时会有什么问题,是在客户端代码中还是在服务器上的jetty.xml中?

EN

回答 1

Stack Overflow用户

发布于 2021-03-16 22:18:00

您需要在Jetty上启用GzipHandler,才能让它处理压缩内容(请求或响应)。

您粘贴的XML块(从jetty-home上的gzip模块)不应该通过编辑来启用GzipHandler,请使用${jetty.home}${jetty.base}的适当拆分,启用gzip模块,然后使用此拆分为您提供的适当属性对其进行配置。

默认情况下,请求body内容的自动解压缩处于关闭状态。

但是将GzipHandler.setInflateBufferSize(int)设置为正值,将会发生请求正文内容的解压缩(也称为膨胀)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66622205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档