jax-ws change le type de contenu en Content-Type car le serveur est hyper sensible
J'ai pour vous connecter à un mal mises en œuvre de serveur qui ne connaît Content-Type
(capitale-T) et de ne pas Content-type
. Comment puis-je demander à mon JAX-WS client pour l'envoi de Content-Type
?
J'ai essayé:
Map<String, List<String>> headers = (Map<String, List<String>>)
((BindingProvider)port).getRequestContext().get(MessageContext.HTTP_REQUEST_HEADERS);
Mais headers
est null
. Ce que je fais mal?
source d'informationauteur Esben Skov Pedersen
Vous devez vous connecter pour publier un commentaire.
J'ai creusé cette question un peu plus et, malheureusement, je crains que la réponse est: vous ne pouvez pas. Permettez-moi de partager mes découvertes.
D'abord, le code que vous trouverez dans https://jax-ws.dev.java.net/guide/HTTP_headers.html ne pas vous donner accès aux en-têtes HTTP de l'avenir de la requête HTTP (qui n'a pas été créé à ce stade), il vous permet de définir supplémentaire en-têtes HTTP pour faire une demande de (qui sera ajouté à la requête HTTP tard).
Donc, ne vous attendez pas le code suivant pour ne pas retourner
null
si vous n'avez pasput
quoi que ce soit avant (et en fait, vous n'obtiendrez ce que vousput
):Ensuite, j'ai fait un petit test basé sur le code fourni dans le même lien:
Et c'est ce que je vois dans la requête HTTP lors de l'exécution du code de client:
Avez-vous remarqué la différence: seul le premier caractère de la
X-Client-Version
en-tête est maintenue supérieure tubé, le reste est descendue!Et en effet, si vous cochez la classe
c.s.x.w.t.Les en-têtes
qui est utilisé pour représenter la requête HTTP (et la réponse) des en-têtes, vous verrez qu'il "normalise" les clés lorsqu'ils sont ajoutés (dansnormalize(String)
):Ainsi, alors que le
c.s.x.w.t.h.c.HttpTransportPipe
classe (ma compréhension est que c'est là que la requête HTTP est créé, c'est aussi là où, auparavant, en-têtes ajoutés seront ajoutés à l'-têtes de requête HTTP) ajoute réellement"Content-Type"
clé dans unc.s.x.w.t.Les en-têtes
exemple, la clé sera modifié en raison de la mentionné précédemment détail d'implémentation.J'ai peut-être tort, mais je ne vois pas comment cela pourrait être changé sans modifier le code. Et l'étrange, c'est que je ne pense pas que cette "normalisation" des trucs sont vraiment conformes à la Rfc (n'a pas à vérifier ce Rfc dire sur les en-têtes cas). Je suis surpris. En fait, vous devriez soulever une question.
Donc, je vois trois options ici (car en attente d'un correctif peut ne pas être une option):
Vous pouvez modifier les en-têtes HTTP de la RequestContext. Si vous avez accès au port de l'objet, vous pouvez le convertir en un javax.xml.ws.BindingProvider, ce qui vous donnera accès à la RequestContext.
Vous pouvez également supprimer les refusés "Content-type" en-tête.
Cette page montre comment le faire en un peu plus de détails: https://jax-ws.dev.java.net/guide/HTTP_headers.html
Laissez-moi savoir si vous avez besoin de plus d'exemples de code, ou si vous collez votre code je peux vous montrer comment le modifier.