2017-07-28 1 views
2

Je rencontre un état de réponse HTTP de 411 Longueur requise lors d'un appel à un service tiers dans mon application.Comment désactiver l'encodage en bloc et utiliser tamponné pour Jersey 1?

Le problème semble être lié à chuncked encoding, la commutation à buffered résoudrait le problème. Il y a une solution ici pour Jersey2: Jersey Http Client replying with 411 on POST request

Cependant en raison d'un héritage, nous utilisons Jersey1 dans notre application et nous ne pouvons pas effectuer une migration dans l'avenir proche.

J'ai essayé d'isoler le problème. Voici le code minimal:

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()); 
    } 

} 

est ici 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' 
} 

Ce que j'ai essayé est d'ajouter la configuration qui passer à un appel en mémoire tampon:

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

Je cite de la documentation de la propriété PROPERTY_CHUNKED_ENCODING_SIZE

Si la propriété est absente, le codage en segments ne sera pas utilisé. Une valeur < = 0 déclare que le codage en segments sera utilisé avec la taille de segment par défaut. Une valeur> 0 déclare que l'encodage en segments sera utilisé avec la valeur en tant que taille de segment déclarée.

Même si je définis cette propriété, l'état de réponse HTTP de 411 Longueur requise est toujours reçu.

Dernière modification: Mon appel ne quitte pas la machine locale. Quand il le fait, je suis censé recevoir un 401 non autorisé, car je devrai ajouter un en-tête avec une clé d'authentification. Pourtant, ce n'est pas l'objet de cette question, cependant si quelqu'un considère qu'il est préférable d'ajouter des détails sur la façon d'obtenir cela, s'il vous plaît laissez un commentaire et je vais décrire plus.

Répondre

1

Pour commencer

Vous ne devez pas définir le drapeau ClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE, s'il vous plaît vérifier here ou dans votre citation ci-dessus. Jersey Client par défaut définira le Content-Type comme application/json (par nature), donc vous devriez avoir passé l'objet json vide pour obtenir le Content-lenght correct transmis avec la demande http.

Ainsi, pour que cela fonctionne, vous devez post un objet vide json sans définir l'en-tête Content-Lenght.

est ici le code de travail, où vous obtiendrez 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()); 
    } 
} 
+0

Merci Rishikesh Darandale, c'est la solution – Flowryn