Requête HTTP de compression
Général De Cas D'Utilisation
Imaginez un client qui est charger de grandes quantités de JSON. Le Type de Contenu doit rester application/json
car qui décrit les données réelles. Accept-Encoding et d'Encodage de Transfert semblent être pour raconter le serveur comment il doit le format de la réponse. Il semble que réponses utiliser le Contenu de l'en-tête de Codage explicitement à cette fin, mais il n'est pas valide demande en-tête.
Est-il quelque chose que je suis absent? Quelqu'un a trouvé une solution élégante?
Spécifiques De Cas D'Utilisation
Mon cas d'utilisation, c'est que j'ai une application mobile qui génère de grandes quantités de JSON (et des données binaires dans certains cas, mais dans une moindre mesure) et de la compression de la demande enregistre une grand quantité de bande passante. J'utilise Tomcat comme mon conteneur de Servlet. Je suis à l'aide de Printemps pour MVC annotations sont principalement juste de faire abstraction de certains JEE choses en beaucoup plus propre, d'annotation basé sur l'interface. J'utilise aussi Jackson pour l'auto (dé)sérialisation.
J'ai aussi utiliser nginx, mais je ne suis pas sûr si c'est là que je veux la décompression. La nginx nœuds simplement équilibrer les demandes qui sont ensuite distribués par le centre de données. Il serait tout aussi agréable de garder comprimé jusqu'à ce qu'il en fait le nœud qui allait le traiter.
Merci d'avance,
Jean
EDIT:
La discussion entre moi et @DaSourcerer a été vraiment utile pour ceux qui sont curieux à propos de l'état des choses au moment de la rédaction de ce.
J'ai fini par mettre en place une solution de mon propre. Notez que cette option spécifie la branche "ohmage-3.0", mais il sera bientôt fusionné dans la branche master. Vous pouvez vérifier pour voir si j'ai fait toutes les mises à jour et correctifs.
On dirait qu'il a été renommé: github.com/ohmage/server/blob/master/src/org/ohmage/jee/filter/...
OriginalL'auteur jojenki | 2013-12-10
Vous devez vous connecter pour publier un commentaire.
N'est en réalité pas tout à fait vrai. Comme par La RFC 2616, sec 14.11,
Content-Encoding
est un entité en-tête qui signifie qu'il peut être appliqué sur les entités à la fois, des réponses http et les demandes. Par les pouvoirs de messages MIME multipart, même choisi pièces d'une demande (ou réponse) peut être comprimé.Cependant, de du serveur web de support de comprimé de demande d'organes est plutôt mince. Apache supporte à un degré via le
mod_deflate
module. Ce n'est pas tout à fait clair pour moi si nginx peut gérer comprimé demandes."c'est complètement différent de tout simplement commencer à parler de cette façon, dans l'espoir que le serveur va comprendre." Eh bien, il y a le
Expect: 100-continue
. Mais c'est une autre histoire ...Ouais! Cela prend tout son sens. Je l'aime. Le manque de soutien de toujours m'attriste, mais je peux le faire sur mon propre. Merci!
Hm, par ce post (voir la première réponse), certains serveurs web semblent avoir délibérément choisi de ne pas mettre en œuvre ce pour des raisons de sécurité. Aurait du sens, tbh.
Merci pour le heads up! Fondé sur les articles de 7 et 3.7.2, il semble que les parties d'un multipart demande sont considérés comme des leurs propres entités; par conséquent, ils devraient obtenir leurs propres en-têtes. Donc, je me sens comme je devrais être autorisé à avoir un
Content-Encoding
(avec laContent-Type
) sur chaque partie. Cependant, la plupart des bibliothèques que je suis en train d'utilisation semblent faire de cette très difficile, si pas impossible. 🙁OriginalL'auteur DaSourcerer
Parce que le code d'origine n'est plus disponible. Dans le cas où quelqu'un viendrait-il ici besoin.
J'utilise "Content-Encoding: gzip" pour identifier le filtre de décompression ou pas.
Voici les codes.
Simple ServletInputStream classe wrapper
De décompression de flux de code
OriginalL'auteur Happier
Ajouter à votre en-tête lorsque vous envoyez:
Code Client :
@JulianReschke souligné qu'il peut être un cas de:
de façon prolongée code serveur sera:
Je suppose que nginx est utilisé comme un équilibreur de charge ou de proxy, vous devez configurer tomcat pour faire de la décompression.
Ajouter les attributs suivants pour le Connecteur server.xml sur Tomcat,
Accepter gziped demandes dans tomcat est une autre histoire. Vous aurez à mettre un filtre devant vos servlets pour activer la demande de décompression. Vous pouvez en savoir plus à propos que ici.
J'ai mis à jour la réponse.
Intéressant. C'est un autre cas de quelqu'un GZIP communique sur le chemin (pas dans), mais il m'a donné une idée. Je vais utiliser un Filtre personnalisé qui permettra de poursuivre la chaîne avec une coutume ServletRequest (pas de réponse) de la classe. Je veux garder cette désactivée jusqu'à ce que j'ai mis en œuvre la solution, mais je vais être sûr de vérifier une fois j'ai.
Ce code ne parviennent pas à gérer correctement les versions plus complexes de Codage de Contenu, tels que "gzip gzip".
pouvez-vous m'aider à améliorer la réponse?
OriginalL'auteur user987339