2016-07-06 2 views
2

Lorsque j'envoie une requête POST via le client Jersey ReST, il utilise automatiquement En-tête de codage de transfert: [chunked].Comment envoyer une requête POST sans transfert Encoding: chunked de Jersey ReST Client 2.22.2

Existe-t-il un moyen de forcer l'utilisation de longueur de contenu: au lieu de l'encodage de transfert?

WebTarget webTarget = client.target(connection.getServerUrl()); 
    Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML); 
    Response response = builder.post(Entity.xml(requestBroker)); 

Après avoir ajouté la propriété Content-Length aussi le comportement est le même

WebTarget webTarget = client.target(connection.getServerUrl()); 
    Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML); 
    Entity entity = Entity.xml(requestBroker); 
    client.property("Content-Length", entity.toString().getBytes().length); 
    Response response = builder.post(Entity.xml(requestBroker)); 

Répondre

2

HTTP version 1.1 encodage de transfert partir chunked est par défaut pour POST, dans ces données sont envoyées sous forme de morceaux et par conséquent, les expéditeurs peuvent commencer transmettre du contenu généré dynamiquement avant de connaître la taille totale de ce contenu. La taille de chaque tronçon est envoyée juste avant le tronçon lui-même afin que le récepteur puisse savoir quand il a fini de recevoir des données pour ce tronçon. Le transfert de données est terminé par un dernier bloc de longueur zéro.

Est-il possible de forcer l'utilisation de la longueur de contenu: au lieu de codage de transfert

Définissez l'en-tête Content-Length avant d'envoyer votre requête POST. Mais cela fonctionnera uniquement dans http 1.0, et lorsque vous définissez la longueur du contenu, et si la taille des données post-requête est supérieure à la longueur du contenu, les données reçues seront tronquées.

Dans la version 1.1 du protocole HTTP, le mécanisme de transfert chunked est considéré comme toujours et de toute façon acceptable, même si ne figure pas dans le champ d'en-tête de demande TE (encodage de transfert), et lorsqu'il est utilisé avec d'autres mécanismes de transfert , doit toujours être appliqué en dernier aux données transférées et jamais plus d'une fois. Source Wikipedia - Chunked Transfer Encoding


Alors que dans la réponse, nous pouvons éviter Transfer-Encoding en réglant le BufferSize sur la réponse à l'aide response.setBufferSize(). Mais si notre taille de réponse dépasse le bufferSize, cela reviendrait à Transfer-Encoding: Chunked.


Different Transfer Mechanisms

Plus d'info:

Content-Length header versus chunked encoding

Remove Transfer-Encoding:chunked in the POST request?

avoiding chunked encoding of HTTP/1.1 response

Hope it helps!

+0

@Amarnath Même après l'ajout de l'en-tête Content-Length, vous avez choisi le codage de transfert en bloc. – Rohit

+0

@Amarnath - Merci pour les réponses, Le problème auquel je suis confronté est du côté de la demande. – Rohit

+0

@Rohit - Ajouté plus d'informations, j'espère que vous serez clarifié maintenant. –