2013-05-09 8 views
7

मैं किसी उपकरण शोकहारा वेब सेवाओं का उपयोग करता है है और मैं अपने अनुरोध/प्रतिक्रिया कार्यक्षमता का इस्तेमाल किया है जिससे मैं इसे एक कमांड HTTP GET के माध्यम से भेज सकते हैं और यह उचित XML के साथ प्रतिक्रिया करता है।मैं इंडी साथ पुश नोटिफिकेशन कैसे प्राप्त होगा?

मैं अब डिवाइस के मवाद सूचनाओं का उपयोग करने की आवश्यकता है। मैं ऊपर जिससे मैं प्रासंगिक HTTP URL और जिसमें प्रतिक्रिया जगह धारा के साथ TIdHTTP.Get प्रक्रिया की आपूर्ति के रूप में ही दृष्टिकोण की कोशिश की है, लेकिन यह काम करने के लिए प्रतीत नहीं होता। Get करने के लिए कॉल वापस नहीं आती है। यह मुझे समझ में आता है कि पुश नोटिफिकेशन के साथ आप डिवाइस और प्रोग्राम के बीच संचार की HTTP स्ट्रीम खोल रहे हैं और यह कनेक्शन बंद होने तक स्ट्रीमिंग के लिए खुला रहेगा।

मेरी समस्या हालांकि मुझे नहीं पता कि अगर Get विधि वापस नहीं आती है तो मुझे स्ट्रीम से एक्सएमएल कैसे प्राप्त किया जाए। यह के रूप में यदि कार्यक्रम लटका दिया गया है। मैंने डिवाइस के साथ जीईटी के माध्यम से संचार और थ्रेड में स्ट्रीम के पढ़ने के माध्यम से संचार करने की कोशिश की है ताकि यह अपने आप जारी रख सके और फिर मेरा मुख्य एप्लीकेशन परिणामस्वरूप एक्सएमएल की जांच कर सके लेकिन यह भी काम नहीं करता है।

मुझे आश्चर्य है कि क्या मैं इसे जटिल बना रहा हूं और यदि कोई आसान समाधान है। जब मैं बस एक अनुरोध भेजता हूं और प्रतिक्रिया प्राप्त करता हूं, तो यह ठीक काम करता है; यह केवल पुश स्ट्रीमिंग है कि मैं काम नहीं कर सकता।

यदि मैं इंटरनेट एक्सप्लोरर में यूआरएल का उपयोग करता हूं तो मैं एक्सएमएल को वापस देख सकता हूं और साथ ही साथ "व्यस्त" लोगो लगातार चल रहा है यह इंगित करता है कि स्ट्रीम खुली है।

मैंने अपने ब्राउज़र फ़ायरफ़ॉक्स मोज़िला 20.0.1 के माध्यम से आदेश चलाया है और देखा है कि पुश अनुरोध और प्रतिक्रिया के लिए वायरसहार्क कैप्चर करता है।

GET /elite/notifications/stream?resume=2013-05-06T00:00:00Z HTTP/1.1 
Host: 192.168.10.10 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

अनुरोध मैं निम्नानुसार है डेल्फी में क्या करना कोशिश कर रहा हूँ:

if fEventStream = nil then 
    fEventStream := TStringStream.Create(''); 
try 
    TapItem.fHTTP.Get(TapItem.I2IReaderIP+'/elite/notifications/stream?resume=2013-05-01T00:00:00Z',fEventStream); 
    TapItem.fEventXML := fEventStream.ReadString(fEventStream.Size); 
except 
    on e:exception do begin 
    ShowMessage(e.message) 
    end; 
end; 

मैं भी TidTCPConnection

साथ
fTCPConn.IOHandler.Writeln(TapItem.I2IReaderIP+I2I_PUSH_EVENT+'2013-05-01T00:00:00Z'); 
    While not Terminated do begin 
    XMLString := XMLString + fTCPConn.IOHandler.Readln; 
    end; 

में किसी भी सहायता की कोशिश की है HTTP हिस्सा नीचे दिखाया गया है इस मामले की सराहना की जाएगी।

समाधान


मेरे मामले बस कॉल की शुरुआत करने के लिए मिलता कीवर्ड जोड़ने में काम किया। मैं मान लिया टीसीपी कनेक्शन घटक क्या कार्रवाई के ज्ञान की आवश्यकता (यानी GET डाल आदि) यह तुम क्या करना चाहते हैं, यह नहीं कर सकते मेरे मन पढ़ने है, भावना

fTCPConn.IOHandler.Writeln('GET ' + TapItem.I2IReaderIP+I2I_PUSH_EVENT+'2013-05-01T00:00:00Z'); 
While not Terminated do begin 
    XMLString := XMLString + fTCPConn.IOHandler.Readln; 
end; 
+0

संकेत: स्टैक ओवरफ्लो पर, आप अपना समाधान एक उत्तर के रूप में जोड़ सकते हैं (और इसे स्वीकार कर सकते हैं) – mjn

उत्तर

3

TIdHTTP का समर्थन नहीं करता सर्वर साइड इस समय धक्का बनाता है (और फिर भी, कई तरीकों से सर्वर-साइड पुश लागू किए जा सकते हैं - कौन सी आपकी आरईएसटी सेवा का उपयोग कर रहा है?)। आपको TIdTCPClient पर स्विच करना होगा, HTTP अनुरोध मैन्युअल रूप से प्रारूपित और भेजना होगा, और तब पहुंचने के लिए आवश्यक धक्का प्रतिक्रियाओं को पढ़ने और पार्स करने के लिए टाइमर या थ्रेड का उपयोग करना होगा।

+0

मुझे नहीं लगता कि आप मुझे यह कैसे करना है इसका एक सरल उदाहरण प्रदान कर सकते हैं? मैंने अपने कोड को अभी इसके बजाय TidTCPClient का उपयोग करने के लिए अपडेट किया है और कुछ झुकाव के बाद प्रतिक्रिया का कुछ रूप मिला है लेकिन यह HTML है। दस्तावेज़ शीर्षलेख जानकारी की तरह दिखता है। कोई एक्सएमएल वापस नहीं किया जा रहा है। इसे कैसे करें इस पर अच्छे उदाहरण मिलें। thnx – MarkZA

+1

मेरा सुझाव है कि आप एक पैकेट स्निफर का उपयोग करें, जैसे कि वायरशर्क या फिडलर, यह देखने के लिए कि आईई यूआरएल का अनुरोध कैसे कर रहा है, फिर इंडी में उन अनुरोध मानों को डुप्लिकेट करें। विशेष रूप से 'उपयोगकर्ता-एजेंट' विशेष रूप से, क्योंकि कुछ सर्वर विभिन्न प्रकार के ग्राहकों के लिए अलग-अलग सामग्री भेजते हैं, और जब सर्वर की बात आती है, तो वेबसर्वर विभिन्न प्रकार के वेबब्रोसर के लिए विभिन्न प्रकार के धक्का का उपयोग करने की संभावना है क्योंकि कोई मानकीकरण नहीं है धक्का देने के लिए प्रारूप कि हर कोई अभी तक सहमत है। यदि आप एक स्निफर द्वारा कैप्चर किए गए पुश के उदाहरण के साथ अपना प्रश्न अपडेट करते हैं, तो मैं आपको यह दिखा सकता हूं कि इसे 'TIdTCPClient' के साथ दोहराना कैसे है। –

+0

हाय। पूरी तरह से सुनिश्चित नहीं है कि आप क्या देख रहे हैं। मैंने अपने ब्राउज़र के माध्यम से आदेश चलाया है और देखा है कि पुश अनुरोध के लिए वायरसहार्क कैप्चर करता है। HTTP भाग नीचे दिखाया गया है: प्राप्त/अभिजात वर्ग/नोटिफिकेशन/स्ट्रीम? फिर से शुरू करें = 2013-05-06T00: 00: 00Z HTTP/1.1 होस्ट: 1 9 2.168.10.10 उपयोगकर्ता-एजेंट: मोज़िला/5.0 (विंडोज एनटी 6.1; WOW64; आरवी: 20.0) गेको/20100101 फ़ायरफ़ॉक्स/20.0 स्वीकार करें: टेक्स्ट/एचटीएमएल, एप्लिकेशन/एक्सएचटीएमएल + एक्सएमएल, एप्लीकेशन/एक्सएमएल; क्यू = 0.9, */*; क्यू = 0.8 स्वीकार करें भाषा: एन-यूएस, एन; क्यू = 0.5 स्वीकार्य-एन्कोडिंग: gzip, डिफ्लेट करें कनेक्शन: जीवित रहें – MarkZA

0

इंडी 10 के ट्रंक में HTTP क्लाइंट (TIdHTTP)।6 अब भी "सर्वर पुश" का समर्थन करता है, सर्वर multipart/... प्रतिक्रिया भेजता है:

New TIdHTTP hoNoReadMultipartMIME flag

एक नया hoNoReadMultipartMIME झंडा TIdHTTP.HTTPOptions संपत्ति में जोड़ा गया है। इस ध्वज का उद्देश्य निर्दिष्ट करना है कि क्या TIdHTTP को "मल्टीपार्ट/..." प्रतिक्रियाओं जैसे "मल्टीपार्ट/एक्स-मिश्रित-प्रतिस्थापन" या "मल्टीपार्ट/बार्टेन्जेस" लक्ष्य टीस्ट्रीम में शरीर सामग्री को पढ़ना चाहिए या तुरंत से बाहर निकलने के लिए और कॉलर को मैन्युअल रूप से सामग्री को पढ़ने दें।

सर्वर पुश को लागू करने के कई अलग-अलग तरीके हैं, इसलिए यह उत्तर किसी दिए गए सर्वर के लिए कम या ज्यादा सहायक हो सकता है।

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