Apigee Edge belgelerini görüntülüyorsunuz.
Git:
Apigee X belgeleri. bilgi
Apigee Edge'deki JavaScript politikası, API proxy akışı bağlamında yürütülen özel kod eklemenize olanak tanır. Örneğin, JavaScript politikasındaki özel kod şu amaçlarla kullanılabilir:
- Akış değişkenlerini alma ve ayarlama
- Özel mantık yürütün ve hata işlemeyi gerçekleştirin
- İstek veya yanıtlardan veri ayıklama
- Arka uç hedef URL'sini dinamik olarak düzenle
- Bir istek veya yanıtta dinamik olarak başlık ekleme ya da kaldırma
- JSON yanıtını ayrıştırma
HTTP İstemcisi
JavaScript politikasının güçlü bir özelliği HTTP istemcisidir. HTTP istemcisi (veya httpClient
nesnesi), arka uca ya da harici hizmetlere bir veya daha fazla çağrı yapmak için kullanılabilir. HTTP istemcisi özellikle, birden fazla harici hizmete çağrı yapmanız ve yanıtları tek bir API'de birleştirmeniz gerektiğinde yararlıdır.
httpClient nesnesiyle arka uca çağrı yapan örnek JavaScript Kodu
var headers = {'X-SOME-HEADER' : 'some value' }; var myRequest = new Request("http://www.example.com","GET",headers); var exchange = httpClient.send(myRequest);
httpClient
nesnesi, HTTP istekleri yapmak için get
ve send
(yukarıdaki örnek kodda send
kullanılır) olmak üzere iki yöntem sağlar. Her iki yöntem de eşzamansızdır ve gerçek HTTP isteği tamamlanmadan önce bir exchange
nesnesi döndürür.
HTTP isteklerinin tamamlanması birkaç saniye ile birkaç dakika arasında sürebilir. Bir HTTP isteği yapıldıktan sonra, istekten gelen yanıtın işlenebilmesi için isteğin ne zaman tamamlandığını bilmek önemlidir. HTTP isteğinin tamamlanıp tamamlanmadığını belirlemenin en yaygın yollarından biri, exchange
nesnesinin waitForComplete()
yöntemini çağırmaktır.
waitForComplete()
waitForComplete()
yöntemi, HTTP isteği tamamlanana ve bir yanıt (başarı/başarısızlık) döndürülene kadar iş parçacığı duraklatır. Daha sonra, bir arka uçtan veya harici hizmetten gelen yanıt işlenebilir.
waitForComplete() içeren örnek JavaScript kodu
var headers = {'X-SOME-HEADER' : 'some value' }; var myRequest = new Request("http://www.example.com","GET",headers); var exchange = httpClient.send(myRequest); // Wait for the asynchronous GET request to finish exchange.waitForComplete(); // Get and Process the response if (exchange.isSuccess()) { var responseObj = exchange.getResponse().content.asJSON; return responseObj.access_token; } else if (exchange.isError()) { throw new Error(exchange.getError()); }
Antipattern
JavaScript kodunda HTTP isteği gönderdikten sonra waitForComplete()
kullanılması performansı etkiler.
Bir HTTP isteği gönderdikten sonra waitForComplete()
işlevini çağıran aşağıdaki JavaScript kodunu göz önünde bulundurun.
sample.js için kod
// Send the HTTP request var exchangeObj = httpClient.get("http://example.com"); // Wait until the request is completed exchangeObj.waitForComplete(); // Check if the request was successful if (exchangeObj.isSuccess()) { response = exchangeObj.getResponse(); context.setVariable('example.status', response1.status); } else { error = exchangeObj.getError(); context.setVariable('example.error', 'Woops: ' + error); }
Bu örnekte:
- JavaScript kodu, arka uç API'sine bir HTTP isteği gönderir.
- Ardından, istek tamamlanana kadar yürütmeyi duraklatmak için
waitForComplete()
öğesini çağırır.waitForComplete()
API, arka uç isteği işlemeyi tamamlayıp yanıt verene kadar JavaScript kodunu yürüten iş parçacığının engellenmesine neden olur.
Bir İleti İşleyicide herhangi bir zamanda eşzamanlı olarak JavaScript kodu yürütebilen iş parçacığı sayısının (%30) üst sınırı vardır. Bu sınıra ulaşıldıktan sonra, JavaScript kodunu yürütmek için kullanılabilecek iş parçacıkları olmayacaktır. Bu nedenle, JavaScript kodunda waitForComplete()
API'sini yürüten çok fazla eşzamanlı istek varsa, sonraki istekler 500 Dahili Sunucu Hatası ve "Zaman aşımına uğradı" ile başarısız olur. zaman aşımına uğramadan önce
hata mesajı döndürecektir.
Genel olarak bu durum, arka uçta isteklerin işlenmesi uzun sürerse veya trafik çok yüksekse ortaya çıkabilir.
Etki
- API istekleri 500 Dahili Sunucu Hatası ve "Zaman aşımı" hata mesajı ile başarısız olur JavaScript kodunda
waitForComplete()
yürüten eşzamanlı isteklerin sayısı önceden tanımlanmış sınırı aştığında. - JavaScript "Zaman aşımı" ile başarısız olduğundan sorunun nedenini teşhis etmek zor olabilir. hatasını alırsınız.
En İyi Uygulama
Ek bilgi kodunu basitleştirmek, performansı iyileştirmek ve JavaScript kodunda waitForComplete()
kullanmaktan kaçınmak için HTTP istemcisinde geri çağırma özelliklerini kullanın. Bu yöntem, HTTP isteği tamamlanana kadar JavaScript yürüten iş parçacığının engellenmemesini sağlar.
Geri çağırma kullanıldığında, iş parçacığı JavaScript kodundaki HTTP isteklerini gönderir ve havuza geri döner. İleti dizisi artık engellenmediğinden diğer istekleri işlemeye hazırdır. HTTP isteği tamamlandıktan ve geri çağırma yürütülmeye hazır hale geldikten sonra bir görev oluşturulur ve görev sırasına eklenir. Havuzdaki iş parçacıklarından biri, geri çağırmayı görevin önceliğine göre yürütür.
httpClient'ta Geri Çağırmaları kullanan örnek JavaScript kodu
function onComplete(response,error) { // Check if the HTTP request was successful if (response) { context.setVariable('example.status', response.status); } else { context.setVariable('example.error', 'Woops: ' + error); } } // Specify the callback Function as an argument httpClient.get("http://example.com", onComplete);