2010-03-03 13 views
10

मुझे एक खराब कार्यान्वित सर्वर से कनेक्ट करना है जो केवल Content-Type (पूंजी-टी) को समझता है और Content-type नहीं। Content-Type भेजने के लिए मैं अपने जेएक्स-डब्ल्यूएस क्लाइंट से कैसे पूछ सकता हूं?जैक्स-डब्ल्यू सामग्री-प्रकार को सामग्री-प्रकार में बदलते हैं क्योंकि सर्वर अति संवेदनशील संवेदनशील है

मैं कोशिश की है:

Map<String, List<String>> headers = (Map<String, List<String>>) 
((BindingProvider)port).getRequestContext().get(MessageContext.HTTP_REQUEST_HEADERS); 

लेकिन headersnull है। मैं क्या गलत कर रहा हूं?

उत्तर

14

मुझे एक खराब कार्यान्वित सर्वर से कनेक्ट करना है जो केवल सामग्री-प्रकार (पूंजी-टी) को समझता है और सामग्री-प्रकार नहीं। सामग्री-प्रकार भेजने के लिए मैं अपने जैक्स-डब्ल्यू क्लाइंट से कैसे पूछ सकता हूं?

मैंने इस प्रश्न को थोड़ा और खोला है और, दुख की बात है, मुझे डर है कि जवाब है: आप नहीं कर सकते। मुझे अपने निष्कर्ष साझा करने दें।

पहले, कोड है कि आप https://jax-ws.dev.java.net/guide/HTTP_headers.htmlमें मिलेगा आप भविष्य HTTP अनुरोध के HTTP हेडर (कि इस बिंदु पर नहीं बनाया गया है) तक पहुंच ही नहीं करता है, तो यह आपको अतिरिक्त सेट कर सकते हैं अनुरोध करने के लिए HTTP शीर्षलेख (जिसे बाद में HTTP अनुरोध में जोड़ा जाएगा)।

तो, उम्मीद करते हैं न निम्न कोड नहीं लौटने के लिए null अगर आप से पहले कुछ भी नहीं put करना (और वास्तव में, आप केवल क्या आप put वहाँ में मिल जाएगा):

((BindingProvider)port).getRequestContext().get(MessageContext.HTTP_REQUEST_HEADERS); 

फिर, मैं एक ही लिंक पर प्रदान किए कोड के आधार पर एक छोटे से परीक्षण किया:

:

AddNumbersImplService service = new AddNumbersImplService(); 
AddNumbersImpl port = service.getAddNumbersImplPort(); 

((BindingProvider)port).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, 
    Collections.singletonMap("X-Client-Version",Collections.singletonList("1.0-RC"))); 

port.addNumbers(3, 5); 

और यही मैं HTTP अनुरोध में देखते हैं जब ग्राहक कोड चल रहा है

 
POST /q2372336/addnumbers HTTP/1.1 
Content-type: text/xml;charset="utf-8" 
X-client-version: 1.0-RC 
Soapaction: "" 
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
User-Agent: JAX-WS RI 2.1.6 in JDK 6 
Host: localhost:8080 
Connection: keep-alive 
Content-Length: 249 

क्या आप अंतर देखते हैं: केवल X-Client-Version शीर्षलेख का पहला चर ऊपरी cased रखा जाता है, बाकी कम हो जाता है!

और वास्तव में, यदि आप वर्ग c.s.x.w.t.Headers कि HTTP अनुरोध (और प्रतिक्रिया) हेडर प्रतिनिधित्व करने के लिए प्रयोग किया जाता है की जाँच करें, आप देखेंगे कि यह "को सामान्य" कुंजी जब वे जुड़ जाते हैं (normalize(String) में):

/* Normalize the key by converting to following form. 
* First char upper case, rest lower case. 
* key is presumed to be ASCII 
*/ 
private String normalize (String key) { 
    ... 
} 

तो, जबकि c.s.x.w.t.h.c.HttpTransportPipe वर्ग वास्तव में "Content-Type" एक c.s.x.w.t.Headers उदाहरण में कुंजी के रूप में कहते हैं (मेरी समझ है कि इस जहां HTTP अनुरोध बनाया जाता है, यह भी है, जहां पूर्व में जोड़े हेडर HTTP अनुरोध हेडर में जोड़ दिया जाएगा है), पहले उल्लिखित कार्यान्वयन विस्तार की वजह से कुंजी संशोधित की जाएगी।

मैं गलत हो सकता हूं लेकिन मुझे नहीं लगता कि कोड को पैच किए बिना इसे कैसे बदला जा सकता है। और अजीब बात यह है कि मुझे नहीं लगता कि यह "सामान्यीकृत" सामान वास्तव में आरएफसी का अनुपालन है (आरएफसी ने हेडर केस के बारे में क्या कहा है) की जांच नहीं की है। मैं आश्चर्यचकित हूँ। दरअसल, आपको raise an issue होना चाहिए।

तो मैं तीन विकल्प यहाँ देख (के बाद से एक के लिए प्रतीक्षा कर एक विकल्प नहीं हो सकता है):

  • कोड अपने आप पैच और (इस दृष्टिकोण के सभी कमियां के साथ) JAX-WS आरआई के पुनर्निर्माण।
  • अपने क्लाइंट के लिए CFX जैसे किसी अन्य JAX-WS कार्यान्वयन को आजमाएं।
  • फ्लाई पर शीर्षलेख को संशोधित करने के लिए अनुरोध किसी प्रकार की कस्टम प्रॉक्सी से गुज़रने दें।
+0

मैं कस्टम प्रॉक्सी का उपयोग किया है अभी के लिए ... नरक के रूप में बदसूरत और मेरे कोड से इस बदसूरत mofo को हटाना चाहते हैं। ओह अच्छा। C'est la –

+1

@EsbenP के माध्यम से यदि आप इसके लिए कोई मुद्दा उठाते हैं, तो कृपया लिंक के साथ प्रश्न अपडेट करें। मैं वास्तव में इस पर जेएक्स-डब्ल्यूएस आरआई डेवलपर्स से कुछ फीडबैक प्राप्त करना चाहता हूं। –

3

आप RequestContext से HTTP शीर्षलेख संशोधित कर सकते हैं। यदि आपके पास पोर्ट ऑब्जेक्ट तक पहुंच है तो आप इसे javax.xml.ws.BindingProvider पर डाल सकते हैं, जो आपको RequestContext तक पहुंच प्रदान करेगा।

आप अस्वीकार्य "सामग्री-प्रकार" शीर्षलेख को भी हटाना चाहते हैं।

यह पृष्ठ दिखाता है कि कैसे एक सा और अधिक विस्तार में यह करने के लिए: https://jax-ws.dev.java.net/guide/HTTP_headers.html

यदि आप और अधिक कोड नमूने की जरूरत है मुझे जानते हैं, या यदि आप अपने कोड के कुछ पेस्ट मैं तुम्हें दिखाता कैसे इसे संशोधित कर सकते हैं।

+0

मेरे संपादन देख .... –

+0

लिंक टूट गया है, यह भी मैं msg.getMimeHeaders की कोशिश की() तो removeHeader या addHeader भी removeAllHeaders कुछ भी नहीं काम करता है, वेक्टर पीठ हेडर अपरिवर्तनीय लगता –

संबंधित मुद्दे