Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. info
ScriptExecutionFailed
Kod błędu
steps.javascript.ScriptExecutionFailed
Treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of javascript_policy_name failed with error: error_type: error_description. (javascript_source_file_name)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Rodzaje błędów i możliwe przyczyny
Zasady JavaScript mogą zgłaszać wiele różnych typów błędów ScriptExecutionFailed. W tabeli poniżej znajdziesz niektóre z najczęstszych błędów:
| Rodzaj błędu | Przyczyna |
| Błąd zakresu | Jeśli użyjesz liczby spoza zakresu prawidłowych wartości, zostanie zgłoszony błąd RangeError. |
| Błąd odwołania | Błąd ReferenceError jest zgłaszany, gdy używasz (odwołujesz się do) zmiennej, która nie została zadeklarowana. |
| Błąd składni | Jeśli spróbujesz ocenić kod z błędem składniowym, zostanie zgłoszony błąd SyntaxError. |
| Błąd typu | Jeśli użyjesz operacji, która wykracza poza zakres oczekiwanych typów, zostanie zgłoszony błąd TypeError. |
| Błąd URI | Jeśli w funkcji URI użyjesz niedozwolonych znaków, zostanie zgłoszony błąd URIError. |
Błąd zakresu
Typ błędu RangeError jest zgłaszany, gdy wykonujesz operację na wartości lub przekazujesz wartość do funkcji, która nie znajduje się w zbiorze ani zakresie dozwolonych wartości.
Ten błąd jest zgłaszany na przykład w tych okolicznościach:
- Jeśli w przypadku niektórych interfejsów Date API użyjesz nieprawidłowej daty, np. 31 września 2018 r.
- Jeśli do metod numerycznych, takich jak
Number.toPrecision(),Number.tofixed()czyNumber.toExponential(), przekażesz nieprawidłową wartość. Jeśli na przykład wNumber.toPrecision()przekażesz dużą wartość, np. 400 lub 500, zobaczysz błąd zakresu. - Jeśli utworzysz tablicę o niedozwolonej długości.
Treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"RangeError: error_description. (javascript_source_file_name:line_number)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Uwaga: diagnoza i rozwiązanie błędów zakresu zależą od dokładnego komunikatu o błędzie zwracanego przez zasady JavaScript. Poniżej znajdziesz kilka przykładów.
Przykład 1. Nieprawidłowa data
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostyka
Określ zasady JavaScript, plik źródłowy, numer wiersza, w którym wystąpił błąd, oraz opis błędu. Wszystkie te informacje znajdziesz w elemencie
faultstringodpowiedzi na błąd. Na przykład w tymfaultstringnazwa zasady JavaScriptu toParseDate, plik źródłowy JavaScriptu toParseDate.js, numer wiersza, w którym wystąpił błąd, to2, a opis błędu toDate is invalid:"faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\""Sprawdź źródłowy plik JavaScript (zidentyfikowany w kroku 1 powyżej) i zobacz, czy w wierszu wskazanym w błędzie jest używana nieprawidłowa data lub czy zmienna użyta w tym wierszu zawiera nieprawidłową datę. Jeśli użyto nieprawidłowej daty, to ona jest przyczyną błędu.
Oto przykładowy plik źródłowy JavaScript, który powoduje ten błąd:
ParseDate.js
var date = new Date('2018-09-31T11:19:08.402Z'); date.toISOString();W tym przykładzie w wierszu 2 użyto zmiennej
date. Po sprawdzeniu pliku źródłowego widać, że zmiennadatema nieprawidłową datę:2018-09-31T11:19:08.402Z.. Ta data jest nieprawidłowa, ponieważ wrzesień nie ma 31 dni.Uwaga: w tym przykładzie użyto formatu ISO-8601:
YYYY-MM-DDTHH:mm:ss.sssZ
Rozdzielczość
Podczas korzystania z interfejsów API daty w kodzie JavaScriptu zawsze używaj prawidłowej daty.
Aby poprawić przykładowy kod JavaScriptu pokazany powyżej, możesz ustawić datę jako Sept 30 2018, jak pokazano poniżej:
var date = new Date('2018-09-30T11:19:08.402Z');
date.toISOString();
Przykład 2. Nieprawidłowa liczba przekazana do interfejsów API Precision
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostyka
Określ zasady JavaScript, plik źródłowy, numer wiersza, w którym wystąpił błąd, oraz opis błędu. Wszystkie te informacje znajdziesz w elemencie
faultstringodpowiedzi na błąd. Na przykład w tymfaultstringnazwa zasady JavaScriptu toSetNumberPrecision, plik źródłowy JavaScriptu toSetNumberPrecision.js, numer wiersza, w którym wystąpił błąd, to 2, a opis błędu toPrecision 400 out of range.."faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\""Sprawdź źródłowy plik JavaScript (zidentyfikowany w kroku 1 powyżej). Jeśli duża liczba wymieniona w opisie błędu jest używana w konkretnym numerze wiersza, to jest to przyczyną błędu.
Oto przykładowy plik źródłowy JavaScript, który powoduje ten błąd:
SetNumberPrecision.js
var number = 12.3456; var rounded_number = number.toPrecision(400); print("rounded_number = " + rounded_number);W tym przykładzie w wierszu 2 użyto dużej wartości 400. Nie możesz ustawić precyzji na tak dużą liczbę cyfr, więc pojawi się poniższy błąd:
"faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\""
Rozdzielczość
Sprawdź, czy liczba użyta w metodzie toPrecision() mieści się w zbiorze dozwolonych wartości.
Aby rozwiązać problem z przykładowym kodem JavaScript opisanym powyżej, ustaw liczbę cyfr znaczących na 2, co jest prawidłową wartością:
var number = 12.3456;
var rounded_number = number.toPrecision(2);
print("rounded_number = " + rounded_number);
Błąd odwołania
Typ błędu ReferenceError jest zgłaszany, gdy w kodzie JavaScript używana jest (odwoływana się do niej) lub przetwarzana niezdefiniowana zmienna.
Treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"ReferenceError: variable_name is not defined. (javascript_source_file_name:line_number)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostyka
Zidentyfikuj zasadę JavaScriptu, jej plik źródłowy i numer wiersza, w którym występuje odwołanie do niezdefiniowanej zmiennej. Wszystkie te informacje znajdziesz w elemencie
faultstringodpowiedzi na błąd. Na przykład w tymfaultstringnazwa zasady JavaScriptu toComputeTotalPrice, odpowiedni plik źródłowy toComputeTotalPrice.js, numer wiersza, w którym wystąpił błąd, to3, a nazwa niezdefiniowanej zmiennej toprice.."faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""Sprawdź numer wiersza w pliku źródłowym JavaScriptu i upewnij się, że odwołuje się on do niezdefiniowanej zmiennej zidentyfikowanej w kroku 1 powyżej. Na przykład ten kod JavaScriptu odwołuje się do niezdefiniowanej zmiennej
pricew wierszu 3, co odpowiada temu, co znajduje się w elemencie faultstring:ComputeTotalPrice.js
var item = context.getVariable("request.queryparam.item"); var quantity = context.getVariable("request.queryparam.quantity"); var totalprice = parseInt(quantity) * parseInt(price); context.setVariable("TotalPrice", totalprice);Sprawdź, czy w kodzie JavaScript jest zdefiniowana konkretna zmienna. Jeśli zmienna nie jest zdefiniowana, to jest to przyczyną błędu.
W przykładowym skrypcie powyżej użyto niezadeklarowanej/zdefiniowanej zmiennej
price, dlatego zobaczysz ten błąd:"faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
Rozdzielczość
Sprawdź, czy wszystkie zmienne, do których odwołuje się kod JavaScript, są prawidłowo zdefiniowane.
Aby rozwiązać problem z przykładowym kodem JavaScript pokazanym powyżej, zdefiniuj zmienną price przed jej użyciem. Na przykład:
var item = context.getVariable("request.queryparam.item");
var quantity = context.getVariable("request.queryparam.quantity");
var price = context.getVariable("request.queryparam.price");
var totalprice = parseInt(quantity) * parseInt(price);
context.setVariable("TotalPrice", totalprice);
Błąd składni
Typ błędu SyntaxError jest zgłaszany, gdy silnik JavaScript napotka tokeny lub kolejność tokenów, które nie są zgodne ze składnią języka, lub gdy do interfejsów API analizatora, takich jak analizator JSON/XML, zostanie przekazane wejście w nieprawidłowym formacie.
Na przykład jeśli nieprawidłowy lub źle sformatowany ładunek JSON zostanie przekazany jako dane wejściowe do interfejsu API JSON.parse używanego w zasadach JavaScript, pojawi się ten błąd.
Treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"SyntaxError: error_description. (javascript_source_file_name:line_number)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostyka
Określ zasadę JavaScript, jej plik źródłowy, numer wiersza, w którym wystąpił błąd, oraz opis błędu. Wszystkie te informacje znajdziesz w elemencie
faultstringodpowiedzi na błąd. Na przykład w tymfaultstringnazwa zasady JavaScriptu toParseJSONRequest, plik źródłowy JavaScriptu toParseJSONRequest.js, numer wiersza, w którym wystąpił błąd, to2, a opis błędu toUnexpected token:"faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""Sprawdź wiersz 2 w pliku źródłowym JavaScript (zidentyfikowanym w kroku 1 powyżej) i zobacz, jakie działanie jest wykonywane. Jeśli wykonywana jest funkcja
JSON.parse(), sprawdź przekazany do niej parametr wejściowy. Jeśli parametr wejściowy jest nieprawidłowy lub ma nieprawidłową strukturę JSON, to jest to przyczyną błędu.Oto przykładowy kod JavaScript, który powoduje ten błąd:
var input = context.getVariable("request.content"); var result = JSON.parse(input);W tym przykładzie ładunek żądania (
request.content) przekazywany do proxy interfejsu API jest używany jako dane wejściowe funkcjiJSON.parse().Oto przykładowe wywołanie interfejsu API, które pokazuje, jak przekazano żądanie:
curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '<city>Bangalore</city>'W powyższym żądaniu do serwera proxy interfejsu API przekazywany jest ten ładunek XML:
<city>Bangalore</city>InterfejsJSON.parseAPI oczekuje przekazania prawidłowego kodu JSON, ale ponieważ zamiast niego przekazywany jest ładunek XML, zwraca poniższy błąd:"Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
Rozdzielczość
Pamiętaj, aby przekazywać prawidłowe dane wejściowe do interfejsów API analizowania używanych w kodzie JavaScript.
Aby rozwiązać problem z przykładowymi zasadami omówiony powyżej, przekaż prawidłowe żądanie ładunku JSON w ten sposób:
curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '{"city" : "Bangalore"}'
Błąd typu
Typ błędu TypeError jest zgłaszany, gdy:
- Operand lub argument przekazany do funkcji jest niezgodny z typem oczekiwanym przez ten operator lub funkcję.
- Funkcja jest wywoływana na obiekcie o wartości null, niezdefiniowanym lub nieprawidłowym.
- Dostęp do właściwości jest uzyskiwany z obiektu o wartości null, niezdefiniowanego lub nieprawidłowego.
Na przykład zgłaszany jest błąd typu:
- Jeśli spróbujesz wywołać funkcję
toUpperCase()na numerze. Dzieje się tak, ponieważ funkcjatoUpperCase()może być wywoływana tylko w przypadku obiektów ciągów znaków. - Jeśli spróbujesz odczytać właściwość z obiektu o wartości null lub undefined.
Treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"TypeError: error_description. (javascript_source_file_name:line_number)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Przykład 1. Wywoływanie funkcji na niewłaściwym obiekcie
Jeśli spróbujesz wywołać funkcję na nieobsługiwanym obiekcie, pojawi się ten błąd.
Jeśli na przykład spróbujesz wywołać funkcję toUpperCase() na numerze, pojawi się błąd. Dzieje się tak, ponieważ funkcji toUpperCase() można używać tylko w przypadku obiektów typu string.
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of ConvertToUpperCase failed with error: Javascript runtime error: \"TypeError: Cannot find function toUpperCase in object 100. (ConvertToUpperCase.js:2)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostyka
Określ zasadę JavaScript, jej plik źródłowy, numer wiersza, w którym wystąpił błąd, oraz opis błędu. Wszystkie te informacje znajdziesz w elemencie
faultstringodpowiedzi na błąd. Na przykład w tymfaultstringnazwa zasady JavaScript toConvertToUpperCase, plik źródłowy toConvertToUpperCase.js, numer wiersza to2, a opis błędu to **Cannot find function toUpperCase in object 100."faultstring": "Execution of ConvertToUpperCase failed with error: Javascript runtime error: \"TypeError: Cannot find function toUpperCase in object 100. (ConvertToUpperCase.js:2)\""Opis błędu wskazuje, że wywołujesz funkcję
toUpperCase()na obiekcie, którego wartość liczbowa wynosi 100.Sprawdź źródłowy plik JavaScript i upewnij się, że w wierszu 2 (zidentyfikowanym w kroku 1 powyżej) wywołujesz funkcję
toUpperCase()na obiekcie, którego wartość liczbowa wynosi 100. Jeśli tak, to jest to przyczyna błędu.Oto przykładowy plik źródłowy JavaScript, który powoduje ten błąd:
ConvertToUpperCase.js
var number = 100; var result = number.toUpperCase();W pokazanym powyżej kodzie JavaScript zmienna
numberma wartość 100. Następnie na obiekcie liczbowym wywoływana jest funkcjatoUpperCase()(. FunkcjętoUpperCase()można wywołać tylko w przypadku obiektów ciągów znaków, dlatego otrzymasz błąd:"Execution of ConvertToUpperCase failed with error: Javascript runtime error: \"TypeError: Cannot find function toUpperCase in object 100. (ConvertToUpperCase.js:2)\""
Rozdzielczość
Zawsze używaj funkcji takich jak toUpperCase() w przypadku prawidłowych obiektów.
Aby poprawić powyższy przykład, możesz utworzyć zmienną tekstową, a następnie wywołać funkcję toUpperCase() na ciągu znaków:
var text = "Hello Apigee !";
var result = text.toUpperCase();
Przykład 2. Nie można odczytać właściwości z niezdefiniowanego obiektu
Jeśli spróbujesz uzyskać dostęp do właściwości z niezdefiniowanego obiektu lub ją odczytać, pojawi się ten błąd. Ten błąd może wystąpić np. podczas próby uzyskania dostępu do danych z obiektu w tablicy, ale obiekt jest niezdefiniowany. Szczegółowe wyjaśnienie znajdziesz poniżej.
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:7)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostyka
Określ zasady JavaScript, plik źródłowy, numer wiersza, w którym wystąpił błąd, oraz opis błędu. Wszystkie te informacje znajdziesz w elemencie
faultstringodpowiedzi na błąd. Na przykład w tym przypadkufaultstringnazwa zasady toParseJSONResponse, plik źródłowy toParseJSONResponse.js, numer wiersza to6, a opis błędu toCannot read property "length" from undefined."faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""Błąd wskazuje, że nie można odczytać właściwości length z niezdefiniowanego obiektu.
Sprawdź numer wiersza w źródłowym pliku JavaScript (określonym w kroku 1 powyżej) i upewnij się, że obiekt ma prawidłową wartość lub nie jest niezdefiniowany. Aby określić, jak zdefiniowano lub wyprowadzono konkretny obiekt, i ustalić, dlaczego jest on nieokreślony, może być konieczne przeczytanie i zrozumienie całego pliku źródłowego. Jeśli okaże się, że dany obiekt jest niezdefiniowany i próbujesz uzyskać dostęp do jego właściwości length, to jest to przyczyną błędu.
Aby lepiej zrozumieć ten problem, przeanalizujmy przykład:
Załóżmy, że z serwera backendu otrzymujesz tę odpowiedź JSON:
{ "cars": [ { "name":"Toyota", "count": 150 } { "name":"Honda", "count": 100 }, { "name":"Ford", "count": 75 } ] }Oto przykładowy plik źródłowy JavaScript, który analizuje tę odpowiedź JSON i powoduje wspomniany powyżej błąd:
ParseJSONResponse.js
// Get the JSON response var jsonData = context.getVariable("response.content"); print (jsonData); // Read the cars array for (var i = 0; i < jsonData.cars.length; i++) { print("name = " + jsonData.cars[i].name); print("count = " + jsonData.cars[i].count); }Po dokładnym przeanalizowaniu kodu JavaScript w wierszu 2 widać, że wartość
response.contentjest odczytywana lub zapisywana w zmiennejjsonDatajako zwykły ciąg znaków (w cudzysłowie).Ponieważ
jsonDatajest zwykłym ciągiem znaków, gdy spróbujesz uzyskać dostęp docarszjsonData, wartośćjsonData.carsbędzie niezdefiniowana.Następnie, gdy spróbujesz odczytać właściwość
lengthzjsonData.cars, która jest niezdefiniowana, pojawi się błąd:"faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""
Rozdzielczość
Zawsze odczytuj dane JSON jako obiekt JSON za pomocą odpowiednich interfejsów API JSON.
Aby poprawić opisany powyżej przykładowy kod JavaScript, możesz użyć funkcji JSON.parse() na obiekcie response.content, aby uzyskać go w postaci obiektu JSON. Następnie możesz uzyskać dostęp do tablicy cars i przejść przez nią.
// Get the JSON response
var data = context.getVariable("response.content");
var jsonData = JSON.parse(data);
print (jsonData);
// Read the cars array
for (var i = 0; i < jsonData.cars.length; i++)
{
print("name = " + jsonData.cars[i].name);
print("count = " + jsonData.cars[i].count);
}
Błąd URI
Typ błędu URIError jest zgłaszany, jeśli w funkcji URI użyjesz niedozwolonych znaków.
Jeśli na przykład przekażesz do funkcji decodeURI lub decodeURIComponent identyfikator URI zawierający symbol procentu, pojawi się ten błąd.
Treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"URIError: error_description. (javascript_source_file_name:line_number)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostyka
Określ zasadę JavaScript, jej plik źródłowy, numer wiersza, w którym wystąpił błąd, oraz opis błędu. Wszystkie te informacje znajdziesz w elemencie faultstring odpowiedzi na błąd. Na przykład w tym ciągu błędu nazwa zasady JavaScript to
URIDecode</code, plik źródłowy JavaScript toURIDecode.js, numer wiersza to2, a opis błędu toMalformed URI sequence:"faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""Opis błędu wskazuje, że w wierszu 2 pliku
URIDecode.jsużyto nieprawidłowej sekwencji URI.Sprawdź plik źródłowy JavaScript i upewnij się, że argument przekazywany do żadnej z funkcji URI nie zawiera niedozwolonych znaków. Jeśli tak, to jest to przyczyną błędu.
Oto przykładowy plik źródłowy JavaScriptu, który powoduje ten błąd:
URIDecode.js
var str = "75%-Completed"; var decoded_str = decodeURIComponent(str); context.setVariable("decoded_str", decoded_str);W przykładowym kodzie JavaScript pokazanym powyżej zmienna
strprzekazywana do funkcjidecodeURIComponent()zawiera symbol procentu, który jest uznawany za nieprawidłowy znak. Dlatego otrzymujesz błąd:"Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
Rozdzielczość
Sprawdź, czy wszystkie znaki użyte w funkcjach URI są prawidłowe i dozwolone.
Aby rozwiązać problem z opisanym powyżej przykładowym kodem JavaScript, zakoduj symbol procentu. Na przykład: %25
var str = "75%25-Completed";
var decoded_str = decodeURIComponent(str);
context.setVariable("decoded_str", decoded_str);