Antipattern: API Proxy'sinde birden çok değerli HTTP üstbilgilerine yanlış şekilde erişme

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

HTTP üst bilgileri, istemci uygulamalarının ve arka uç hizmetlerinin sırasıyla istekler ve yanıtlar hakkında ek bilgiler iletmesine olanak tanıyan ad değeri çiftleridir. Bazı basit örnekler:

  • Yetkilendirme isteği başlığı, kullanıcı kimlik bilgilerini sunucuya iletir:
    Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
  • Content-Type başlığı, gönderilen istek/yanıt içeriğinin türünü belirtir:
    Content-Type: application/json

HTTP üst bilgileri, üstbilgi alanı tanımlarına bağlı olarak bir veya daha fazla değere sahip olabilir. Birden çok değerli üstbilgi virgülle ayrılmış değerler içerir. Aşağıda, birden çok değer içeren birkaç başlık örneği verilmiştir:

  • 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, geliştiricilerin Edge politikaları veya koşullu akışlardaki akış değişkenlerini kullanarak başlıklara kolayca erişmesine olanak tanır. Edge'de belirli bir istek veya yanıt başlığına erişmek için kullanılabilecek değişkenlerin listesini burada bulabilirsiniz:

Akış değişkenleri:

  • 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 nesneleri:

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

Aşağıda, bir istek başlığı değerinin nasıl okunacağını ve bir değişkende nasıl depolanacağını gösteren örnek bir Atadi Politikası verilmiştir:

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

Antipattern

Edge politikalarındaki HTTP üstbilgilerinin değerlerine yalnızca ilk değeri döndürecek şekilde erişmek yanlıştır ve belirli HTTP üstbilgileri birden fazla değer içeriyorsa sorunlara neden olabilir.

Aşağıdaki bölümlerde üstbilgi erişimi örnekleri verilmiştir.

1. Örnek: JavaScript kodu kullanarak birden çok değerli Accept üstbilgisi okuma

Accept başlığının aşağıda gösterildiği gibi birden fazla değere sahip olduğunu unutmayın:

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

Accept üstbilgisindeki değeri okuyan JavaScript kodu şöyledir:

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

Yukarıdaki JavaScript kodu yalnızca Accept üstbilgisindeki text/html gibi ilk değeri döndürür.

2. Örnek: AtaMessage veya PromoteFault politikasında birden çok değerli Access-Control-Allow-Headers üstbilgisi okuma

Access-Control-Allow-Headers başlığının aşağıda gösterildiği gibi birden fazla değere sahip olduğunu unutmayın:

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

Access-Control-Allow-Headers üstbilgisini Atayarak veya YükseltFault politika ayarına sahip kodda bulunan bölümü burada bulabilirsiniz:

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

Yukarıdaki kod, Access-Control-Allow-Headers başlığını yalnızca Access-Control-Allow-Headers istek başlığındaki (bu örnekte content-type) ilk değerle ayarlar.

Etki

  1. Yukarıdaki her iki örnekte de yalnızca birden çok değerli başlıklardan ilk değerin döndürüldüğüne dikkat edin. Bu değerler daha sonra API Proxy akışındaki başka bir politika veya arka uç hizmeti tarafından bir işlev ya da mantık gerçekleştirmek amacıyla kullanılırsa beklenmedik bir sonuca veya sonuca yol açabilir.
  2. İstek başlığı değerlerine erişildiğinde ve hedef sunucuya iletildiğinde, API istekleri arka uç tarafından yanlış işlenebilir ve bu nedenle hatalı sonuçlar verebilir.
  3. İstemci uygulaması, Edge yanıtındaki belirli üstbilgi değerlerine bağımlıysa hatalı işlem yapıp yanlış sonuçlar da verebilir.

En İyi Uygulama

  1. Uygun yerleşik akış değişkenlerini kullanın: request.header.header_name.values.count, request.header.header_name.N, response.header.header_name.values.count, response.header.header_name.N.

    Ardından, JavaScript veya Java açıklama metni politikalarında belirli bir başlıktan tüm değerleri getirmek için yineleyin.

    Örnek: Birden çok değerli üstbilgiyi okumak için örnek JavaScript kodu

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

    Örneğin application/xml;q=0.9, */*;q=0.8, yukarıdaki kodla birlikte bir değer olarak görünür.

    Başlık değerlerinin sınırlayıcı olarak noktalı virgül kullanılarak bölünmesi gerekiyorsa bunları değerlere ayırmak için string.split(";") kullanın.

  2. Belirli bir üst bilginin tüm değerlerini okumak için PromoteFault veyaassignMessage politikasındaki request.header.header_name.values akış değişkeninde substring() işlevini kullanın.

    Örnek: Birden çok değere sahip bir üstbilgiyi okumak için örnek ForFault veyaassignMessage Politikası

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

Daha fazla bilgi