Maillot/JAX-RS : Retour Contenu de Longueur en-tête de réponse au lieu de l'encodage de transfert en bloc
Je suis en utilisant le Maillot de créer des API RESTful ressources, et ResponseBuilder
pour générer la réponse.
Exemple de code pour le repos de ressources:
public class infoResource{
@GET
@Path("service/{id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response getCompany(@PathParam("id")String id) {
//company is just a POJO.
Company company = getCompany(id);
return Response.status(200).entity(company).build();
}
}
Dans la réponse, il est de retour encodage de transfert en bloc dans les en-têtes de réponse. Quelle est la bonne façon dans le "Jersey monde" de l'avoir de retour de la Content-Length
en-tête de la place de la Transfer-Encoding: chunked
d'en-tête dans les en-têtes de réponse?
OriginalL'auteur richsinn | 2012-07-25
Vous devez vous connecter pour publier un commentaire.
Sélection
Content-Length
ouTransfer-Encoding
est juste ces Conteneurs choix. C'est vraiment une question de taille de la mémoire tampon.Une solution possible est de fournir un
SevletFilter
qui les tampons de tous ceux rassemblés octets et définitContent-Length
valeur d'en-tête.Voir cette page.
voici un exemple de filtre pour cette solution, toujours à l'aide d'un
ByteArrayOutputStream
, mais facile à déposer et d'essayer... pour info....OriginalL'auteur Jin Kwon
En vous classe qui étend la classe ResourceConfig vous pouvez définir la taille de la mémoire tampon. Les réponses au-dessus de cette taille seront coupés, ci-dessous aura Content-Length.
OriginalL'auteur MGH
Par exemple, si votre inputstream est lu à partir d'un système de fichiers local, juste
ajouter:
Vérifier le code complet pour une explication plus claire:
Côté client est un Apache HttpClient code.
OriginalL'auteur Octavian Ionel
Une réponse à une question très semblable sur StackOverflow peut être trouvés ici
J'ai copié ici pour s'assurer qu'il n'est pas converti en commentaire:
Un superbe exemple de filtre pour le faire, qui peut être utilisé de façon autonome à partir du projet, est cette ContentLengthFilter.java de la Carrot2 projet sur github.
Note qui utilise une enveloppe réponse avec un flux d'octets pour résoudre le problème, donc cela garantit également que
Transfer-Encoding: Chunked
ne veut pas se définir par un autre Filtre/code de la chaîne de filtrage, et de remplacer votreContent-Length
- tête quand il est réglé. Vous pouvez le vérifier en testant cette avec de gros fichiers, qu'ils avaient normalement être découpées dans la réponse.Je vais copier le contenu du fichier, ici aussi, afin de ne pas devenir un lien brisé:
OriginalL'auteur Brad Parks