如何禁用分块编码并为泽西 1 使用缓冲?



我在应用程序中执行对第三方服务的调用时遇到 HTTP 响应状态为 411 长度需要。

问题似乎与chuncked encoding有关,将其切换到buffered就可以解决问题。 这里有一个针对泽西岛2的解决方案: 泽西岛 Http 客户端在 POST 请求中回复 411

但是,由于一些遗留问题,我们在应用程序中使用了 Jersey1,并且无法在不久的将来执行迁移。

我试图隔离问题。这是最小的代码:

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;

/**
* Main
*/
public class Main {
public static void main(String[] args) {
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
clientConfig.getProperties().put(ClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE, null);
Client client = Client.create(clientConfig);
String postURL = "https://api.napster.com/v2.2/me/library/tracks?id=tra.169783383,tra.30621111";
WebResource webResourcePost = client.resource(postURL);
webResourcePost.header("Content-Length", 0);
ClientResponse response = webResourcePost.type("application/json").post(ClientResponse.class);
System.out.println(response.getStatus());
}
}

这是build.gradle:

apply plugin: 'application'
apply plugin: 'java'
repositories {
mavenCentral()
mavenLocal()
}
mainClassName = "Main"
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
compile group: 'com.sun.jersey.contribs', name: 'jersey-apache-client', version: '1.19.4'
compile group: 'com.sun.jersey', name: 'jersey-json', version: '1.19.4'
}

我尝试的是添加将切换到缓冲调用的配置:

clientConfig.getProperties().put(ClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE, null);

我引用属性的文档PROPERTY_CHUNKED_ENCODING_SIZE

如果该属性不存在,则不会使用分块编码。值 <= 0 声明分块编码将与默认区块大小一起使用。值> 0 声明分块编码将与值一起使用作为声明的区块大小。

即使我设置了此属性,我仍然会收到 HTTP 响应状态"需要 411 长度"。

稍后编辑:我的呼叫不会离开本地计算机。当它这样做时,我应该会收到一个 401 未经授权,因为我需要添加一个带有身份验证密钥的标头。然而,这不是这个问题的重点,但是如果有人认为最好添加有关如何获得此信息的详细信息,请发表评论,我将描述更多。

开始于

您不必设置标志ClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE,请查看此处或上面的报价。

默认情况下,泽西客户端会将Content-Type设置为application/json(本质上(,因此您应该传递空白 json 对象以使用 http 请求正确传入Content-length

因此,要使其正常工作,您应该在不设置Content-Length标头的情况下post空白json对象。

这是工作代码,您将在其中获得HTTP 401

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.LoggingFilter;
import com.sun.jersey.api.json.JSONConfiguration;
/**
* Main
*/
public class Main {
public static void main(String[] args) {
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
//clientConfig.getProperties().put(ClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE, null);
Client client = Client.create(clientConfig);
client.addFilter(new LoggingFilter(System.out));
String postURL = "https://api.napster.com/v2.2/me/library/tracks?id=tra.169783383,tra.30621111";
WebResource webResourcePost = client.resource(postURL);
//webResourcePost.header("Content-Length", 0);
ClientResponse response = webResourcePost.type("application/json").post(ClientResponse.class, "{}");
System.out.println(response.getStatus());
}
}

最新更新