Antipattern: एपीआई प्रॉक्सी में, एक से ज़्यादा वैल्यू वाले एचटीटीपी हेडर को गलत तरीके से ऐक्सेस करें

आपको Apigee Edge दस्तावेज़ दिख रहा है.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस पेज पर जाएं Apigee X दस्तावेज़.
जानकारी

एचटीटीपी हेडर, नाम की वैल्यू वाले जोड़े होते हैं. इनकी मदद से, क्लाइंट ऐप्लिकेशन और बैकएंड सेवाओं को इस्तेमाल करने की अनुमति मिलती है का इस्तेमाल करें. यहां कुछ आसान उदाहरण दिए गए हैं:

  • अनुमति देने के अनुरोध का हेडर, सर्वर को उपयोगकर्ता के क्रेडेंशियल भेजता है:
    Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
  • Content-Type हेडर से पता चलता है कि अनुरोध/जवाब के तौर पर किस तरह का कॉन्टेंट भेजा जा रहा है:
    Content-Type: application/json

एचटीटीपी हेडर में एक या एक से ज़्यादा वैल्यू हो सकती हैं. ये वैल्यू, हेडर फ़ील्ड की परिभाषाएं. एक से ज़्यादा वैल्यू वाले हेडर में, कॉमा लगाकर अलग की गई वैल्यू होंगी. यहां ऐसे हेडर के कुछ उदाहरण दिए गए हैं जिनमें एक से ज़्यादा वैल्यू होती हैं:

  • Cache-Control: no-cache, no-store, must-revalidate
  • Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
  • X-Forwarded-For: 10.125.5.30, 10.125.9.125

Apigee Edge की मदद से डेवलपर, हेडर को आसानी से ऐक्सेस कर सकते हैं फ़्लो वैरिएबल Edge की नीतियों या कंडीशनल फ़्लो में लागू किया जा सकता है. यहां इस्तेमाल किए जा सकने वाले वैरिएबल की सूची दी गई है Edge में किसी खास अनुरोध या रिस्पॉन्स हेडर को ऐक्सेस करने के लिए:

फ़्लो वैरिएबल:

  • message.header.header-name
  • request.header.header-name
  • response.header.header-name
  • message.header.header-name.N
  • request.header.header-name.N
  • response.header.header-name.N

JavaScript ऑब्जेक्ट:

  • context.proxyRequest.headers.header-name
  • context.targetRequest.headers.header-name
  • context.proxyResponse.headers.header-name
  • context.targetResponse.headers.header-name

यहां Assignments का एक नमूना दिया गया है, जिसमें अनुरोध के हेडर की वैल्यू को पढ़ने और उसे किसी वैरिएबल में स्टोर करने का तरीका बताया गया है:

<AssignMessage continueOnError="false" enabled="true" name="assign-message-default">
  <AssignVariable>
    <Name>reqUserAgent</Name>
    <Ref>request.header.User-Agent</Ref>
  </AssignVariable>
</AssignMessage>

एंटीपैटर्न

Edge नीतियों में एचटीटीपी हेडर की वैल्यू को इस तरह ऐक्सेस करना कि सिर्फ़ पहली वैल्यू दिखे गलत है और किसी खास एचटीटीपी हेडर के एक से ज़्यादा मान होने पर समस्याएं हो सकती हैं.

नीचे दिए गए सेक्शन में, हेडर के ऐक्सेस के उदाहरण दिए गए हैं.

उदाहरण 1: JavaScript कोड का इस्तेमाल करके, कई वैल्यू वाला 'स्वीकार करें' हेडर पढ़ें

Accept हेडर में कई वैल्यू होती हैं, जैसा कि यहां दिखाया गया है:

Accept: text/html, application/xhtml+xml, application/xml

यह JavaScript कोड दिया गया है, जो Accept हेडर से मिली वैल्यू को पढ़ता है:

// Read the values from Accept header
var acceptHeaderValues = context.getVariable("request.header.Accept");

ऊपर दिया गया JavaScript कोड Accept हेडर से सिर्फ़ पहली वैल्यू दिखाता है. जैसे कि text/html.

उदाहरण 2: assignMessage या RaiseFault नीति में एक से ज़्यादा वैल्यू वाले Access-Control-Allow-Headers हेडर को पढ़ें

Access-Control-Allow-Headers हेडर में कई वैल्यू होती हैं, जैसा कि यहां दिखाया गया है:

Access-Control-Allow-Headers: content-type, authorization

Access-Control-Allow-Headers हेडर को सेट करने के लिए, Tasks या RaiseFault नीति से जुड़े कोड का वह हिस्सा यहां दिया गया है:

<Set>
  <Headers>
    <Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header>
  </Headers>
</Set>

ऊपर दिया गया कोड हेडर Access-Control-Allow-Headers को अनुरोध हेडर Access-Control-Allow-Headers, इस उदाहरण में content-type.

असर

  1. ऊपर दिए गए दोनों उदाहरणों में, ध्यान दें कि एक से ज़्यादा वैल्यू वाले हेडर की सिर्फ़ पहली वैल्यू दिखाई जाती है. अगर एपीआई प्रॉक्सी फ़्लो या बैकएंड सेवा में, किसी अन्य नीति के तहत इन वैल्यू का बाद में इस्तेमाल किया जाता है इस्तेमाल करना चाहते हैं, तो इससे कोई अनचाहा नतीजा या नतीजा मिल सकता है.
  2. जब अनुरोध हेडर वैल्यू को ऐक्सेस और टारगेट सर्वर पर पास किया जाता है, तब एपीआई अनुरोध ये बैकएंड की ओर से गलत तरीके से प्रोसेस किया जाता है और इस वजह से वे गलत नतीजे दिखा सकते हैं.
  3. अगर क्लाइंट ऐप्लिकेशन, Edge रिस्पॉन्स से मिलने वाली खास हेडर वैल्यू पर निर्भर करता है, तो गलत तरीके से प्रोसेस कर सकती है और गलत नतीजे दिखा सकती है.

सबसे सही तरीका

  1. सही बिल्ट-इन फ़्लो वैरिएबल का इस्तेमाल करें: request.header.header_name.values.count, request.header.header_name.N, response.header.header_name.values.count, response.header.header_name.N.

    इसके बाद, JavaScript या Java की कॉलआउट नीतियों में किसी खास हेडर से सभी वैल्यू फ़ेच करने के लिए, यह प्रक्रिया दोहराएं.

    उदाहरण: कई वैल्यू वाले हेडर को पढ़ने के लिए JavaScript कोड का सैंपल

    for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++)
    {
      print(context.getVariable('request.header.Accept.' + i));
    }
    

    उदाहरण के लिए, application/xml;q=0.9, */*;q=0.8 ऊपर दिए गए कोड के साथ एक वैल्यू के तौर पर दिखेगा.

    अगर सेमीकॉलन को डेलिमिटर के तौर पर इस्तेमाल करके हेडर वैल्यू को बांटना ज़रूरी है, तो string.split(";") का इस्तेमाल करें ताकि इन वैल्यू को अलग-अलग वैल्यू में बांटा जा सके.

  2. फ़्लो वैरिएबल request.header.header_name.values पर substring() फ़ंक्शन का इस्तेमाल करें का इस्तेमाल करें.

    उदाहरण के लिए: एक से ज़्यादा वैल्यू वाले हेडर को पढ़ने के लिए, RaiseFault याassignMessage नीति का सैंपल

    <Set>
      <Headers>
       <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header>
      </Headers>
    </Set>
    

इसके बारे में और पढ़ें