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

Apigee Edge belgelerini görüntülüyorsunuz.
. Git: Apigee X belgeleri.
bilgi

HTTP üstbilgileri, istemci uygulamalarına ve arka uç hizmetlerine izin veren ad-değer çiftleridir. istek ve yanıtlar hakkında ek bilgi iletin. Bazı basit örnekler:

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

HTTP Üstbilgileri bağlı olarak bir veya daha fazla değere sahip olabilir başlık alanı tanımları. Birden çok değerli başlıkta virgülle ayrılmış değerler bulunur. Aşağıda, birden çok değer içeren başlıklara birkaç örnek 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
ziyaret edin.

Apigee Edge, geliştiricilerin akış değişkenleri veya koşullu akışlardan herhangi birinde yer almaması gerekir. Aşağıda, kullanılabilecek değişkenlerin listesi verilmiştir için şu adımları izleyin:

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ığının değerinin nasıl okunacağını ve bir değişkende nasıl depolanacağını gösteren örnek bir Atama İletisi 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şme yanlıştır ve belirli HTTP üstbilgilerinin birden fazla değeri varsa sorunlara neden olabilir.

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

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

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

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, Accept üstbilgisindeki yalnızca ilk değeri döndürür. (ör. text/html).

2. Örnek: AtamaMessage veya RaiseFault politikasında birden çok değerli Access-Control-Allow-Headers üstbilgisini okuyun

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

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

AttributionMessage veya PromoteFault politikasının Access-Control-Allow-Headers üstbilgisini ayarlayan kodun bir bölümü aşağıda verilmiştir:

<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 istek başlığı Access-Control-Allow-Headers, bu örnekte content-type.

Etki

  1. Yukarıdaki her iki örnekte de, birden çok değerli başlıklardan yalnızca 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 kullanılırsa bir işlev veya mantığı yerine getirmek, 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şlenir ve bu nedenle yanlış sonuçlar verebilir.
  3. İstemci uygulaması, Edge yanıtındaki belirli üstbilgi değerlerine bağımlıysa hatalı işlemler yapabilir ve yanlış sonuçlar 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ındaki belirli bir başlıktan tüm değerleri almak için işlemi tekrarlayın.

    Örnek: Birden çok değerli başlığı 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 koda sahip 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 string.split(";") değerini kullanın bunları değerlere ayırmanızı sağlar.

  2. request.header.header_name.values akış değişkeninde substring() işlevini kullanın özelliğini kullanabilirsiniz.

    Örnek: Birden çok değere sahip bir üstbilgiyi okumak için örnek RaiseFault veyaAssignmentMessage 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