如何禁用分块编码并为 Jersey 1 使用缓冲?
How to disable chunked encoding and use buffered for Jersey 1?
在我的应用程序中执行对第 3 方服务的调用时,我遇到了 411 Length Required 的 HTTP 响应状态。
问题似乎与chuncked encoding
有关,切换到buffered
即可解决问题。
Jersey2 有一个解决方案:
但是由于一些遗留问题,我们在我们的应用程序中使用 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
的文档
If the property is absent then chunked encoding will not be used. A value < = 0 declares that chunked encoding will be used with the default chunk size. A value > 0 declares that chunked encoding will be used with the value as the declared chunk size.
即使我设置了这个 属性 我仍然收到 411 Length Required 的 HTTP 响应状态。
稍后编辑: 我的电话没有离开本地机器。当它这样做时,我预计会收到 401 Unauthorized,因为我需要添加一个 header 和一个授权密钥。然而,这不是这个问题的重点,但是如果有人认为最好添加有关如何获得此信息的详细信息,请发表评论,我将进行更多描述。
从
开始
您不必设置标志 ClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE
,请检查 here 或在上面的引用中。
Jersey 客户端默认会将 Content-Type
设置为 application/json
(自然),因此您应该通过空白 json object 来获取 Content-length
正确通过 http 请求传入。
因此,要使其正常工作,您应该 post
空白 json
object 而无需设置 Content-Length
Header.
这是工作代码,您将在其中获得 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());
}
}
在我的应用程序中执行对第 3 方服务的调用时,我遇到了 411 Length Required 的 HTTP 响应状态。
问题似乎与chuncked encoding
有关,切换到buffered
即可解决问题。
Jersey2 有一个解决方案:
但是由于一些遗留问题,我们在我们的应用程序中使用 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
If the property is absent then chunked encoding will not be used. A value < = 0 declares that chunked encoding will be used with the default chunk size. A value > 0 declares that chunked encoding will be used with the value as the declared chunk size.
即使我设置了这个 属性 我仍然收到 411 Length Required 的 HTTP 响应状态。
稍后编辑: 我的电话没有离开本地机器。当它这样做时,我预计会收到 401 Unauthorized,因为我需要添加一个 header 和一个授权密钥。然而,这不是这个问题的重点,但是如果有人认为最好添加有关如何获得此信息的详细信息,请发表评论,我将进行更多描述。
从
开始您不必设置标志 ClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE
,请检查 here 或在上面的引用中。
Jersey 客户端默认会将 Content-Type
设置为 application/json
(自然),因此您应该通过空白 json object 来获取 Content-length
正确通过 http 请求传入。
因此,要使其正常工作,您应该 post
空白 json
object 而无需设置 Content-Length
Header.
这是工作代码,您将在其中获得 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());
}
}