Lập trình proxy API với JavaScript

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về Apigee X.
thông tin

Trong chủ đề này, bạn sẽ tìm hiểu cách sử dụng JavaScript để tự động thêm tiêu đề HTTP vào thông báo phản hồi, cũng như cách phân tích cú pháp phản hồi JSON và trả về một tập hợp con các thuộc tính cho ứng dụng yêu cầu.

Tải xuống và dùng thử mã mẫu

Giới thiệu về ví dụ về sổ tay nấu ăn này

Ví dụ về sổ tay nấu ăn này minh hoạ một mẫu proxy API mà bạn triển khai hành vi API trong JavaScript. Các ví dụ về JavaScript được thiết kế để cho bạn biết cách làm việc với các biến và nội dung thông báo đơn giản. Một mẫu cho bạn thấy cách lấyđặt biến. Ví dụ thứ hai cho bạn thấy cách phân tích cú pháp JSON và tạo thông báo từ kết quả.

Hai mẫu JavaScript nằm trong proxy API:

  • setHeaders.js: JavaScript này nhận giá trị của một vài biến được đặt khi proxy API được gọi. JavaScript sẽ thêm các biến đó vào thông báo phản hồi để bạn có thể thấy giá trị của các biến đó cho mỗi yêu cầu mà bạn đưa ra.
  • minimize.js: JavaScript này cho bạn biết cách xử lý nội dung thông báo. Ý tưởng của mẫu này là một dịch vụ thường trả về nhiều dữ liệu hơn mức cần thiết. Vì vậy, JavaScript sẽ phân tích cú pháp thông báo phản hồi, trích xuất một vài thuộc tính thú vị, rồi sử dụng các thuộc tính đó để tạo nội dung của thông báo phản hồi.

Mã cho setHeader.js:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"));
context.setVariable("response.header.X-Apigee-ApiProxyName", context.getVariable("apiproxy.name"));
context.setVariable("response.header.X-Apigee-ProxyName", context.getVariable("proxy.name"));
context.setVariable("response.header.X-Apigee-ProxyBasePath", context.getVariable("proxy.basepath"));
context.setVariable("response.header.X-Apigee-ProxyPathSuffix", context.getVariable("proxy.pathsuffix"));
context.setVariable("response.header.X-Apigee-ProxyUrl", context.getVariable("proxy.url"));

Mã cho minimize.js:

// Parse the respose from the target.
var res = JSON.parse(context.proxyResponse.content);

// Pull out only the information we want to see in the response.
var minimizedResponse = { city: res.root.city,
                          state: res.root.state };
          
// Set the response variable. 
context.proxyResponse.content = JSON.stringify(minimizedResponse);

Bạn có thể truy cập các biến luồng trong JavaScript thông qua đối tượng ngữ cảnh. Đối tượng này thuộc mô hình đối tượng JavaScript Edge. Để biết thông tin chi tiết về mô hình đối tượng, hãy xem phần mô hình đối tượng JavaScript.

Trước khi bắt đầu

Trước khi tìm hiểu ví dụ về sổ tay nấu ăn này, bạn cũng nên làm quen với các khái niệm cơ bản sau:

  • Chính sách là gì và cách đính kèm chính sách vào proxy. Để tìm hiểu sâu hơn về chính sách, hãy xem phần Chính sách là gì?.
  • Cấu trúc của luồng proxy, như đã giải thích trong Định cấu hình luồng. Các luồng cho phép bạn chỉ định trình tự thực thi chính sách bằng proxy API. Trong ví dụ này, một số chính sách được tạo và thêm vào quy trình proxy API.
  • Cách sắp xếp dự án proxy API trên hệ thống tệp của bạn, như giải thích trong Tài liệu tham khảo về cấu hình proxy API.
  • Có kiến thức thực hành về XML, JSON và JavaScript. Trong ví dụ này, bạn sẽ xây dựng proxy API và các chính sách của proxy API đó bằng các tệp XML nằm trên hệ thống tệp.

Nếu đã tải mã mẫu xuống, bạn có thể tìm tất cả các tệp được thảo luận trong chủ đề này trong thư mục mẫu javascript-cookbook. Các phần sau đây sẽ thảo luận chi tiết về mã mẫu.

Tìm hiểu luồng proxy

Để JavaScript thực thi trong proxy API, bạn phải đính kèm JavaScript vào một luồng bằng cách sử dụng tệp đính kèm chính sách có tên "Bước". Một chính sách thuộc loại JavaScript (ghi chú viết hoa) chỉ chứa mục tham chiếu đến tên của tệp JavaScript. Bạn trỏ chính sách này đến một tệp JavaScript bằng phần tử ResourceURL.

Ví dụ: chính sách sau đây tham chiếu đến tệp JavaScript có tên là setHeader.js.

<Javascript name='setHeaders' timeLimit='200'>
    <ResourceURL>setHeaders.js</ResourceURL>
</Javascript>

Bạn có thể đính kèm chính sách này vào quy trình proxy API như cách bạn thực hiện với bất kỳ loại chính sách nào khác. Bằng cách đính kèm chính sách này vào quy trình proxy API, bạn cho biết vị trí sẽ thực thi JavaScript. Điều này cho phép bạn thực thi JavaScript tương tác với thông báo yêu cầu hoặc thông báo phản hồi dưới dạng các thông báo đó "luồng" qua proxy API. Trong ví dụ này, cả hai JavaScript đều thực thi trong luồng phản hồi, vì chính sách sẽ thực hiện 2 việc: đặt tiêu đề HTTP trên thông báo phản hồi và "giảm thiểu" thông báo phản hồi mà Apigee Edge trả về ứng dụng yêu cầu.

Nếu mở cấu hình luồng này trong giao diện người dùng quản lý, bạn sẽ thấy cấu hình luồng ở bên dưới.

Chọn Proxy Endpoints > default > PostFlow trong ngăn Trình điều hướng.

Cấu hình XML tương ứng cho ProxyEndpoint có tên là "default" sẽ xuất hiện bên dưới.

<ProxyEndpoint name="default">
  <PostFlow>
    <Response>
      <!-- Steps reference policies under /apiproxy/policies -->
      <!-- First, set a few HTTP headers with variables for this transaction. -->
      <Step><Name>setHeaders</Name></Step>
      <!-- Next, transform the response from XML to JSON for easier parsing with JavaScript -->
      <Step><Name>transform</Name></Step>
      <!-- Finally, use JavaScript to create minimized response with just city and state. -->
      <Step><Name>minimize</Name></Step>
    </Response>
  </PostFlow>
  <HTTPProxyConnection>
        <!-- BasePath defines the network address for this API proxy. See the script 'invoke.sh' to see how the complete URL for this API proxy is constructed.-->
    <BasePath>/javascript-cookbook</BasePath>
     <!-- Set VirtualHost to 'secure' to have this API proxy listen on HTTPS. -->
    <VirtualHost>default</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

Dưới đây là thông tin tóm tắt về các thành phần của luồng.

  • <Request> – Phần tử <Request> bao gồm một số phần tử <Step>. Mỗi bước sẽ gọi một trong những chính sách mà bạn tạo trong phần còn lại của chủ đề này. Các chính sách này sẽ đính kèm JavaScript vào luồng proxy API và vị trí của tệp đính kèm chính sách sẽ xác định thời điểm JavaScript thực thi.
  • <Response> – Phần tử <Response> cũng bao gồm <Steps>. Các bước này cũng gọi chính sách chịu trách nhiệm xử lý phản hồi cuối cùng từ mục tiêu (trong ví dụ này là mục tiêu dịch vụ mô phỏng của Apigee – vui lòng lưu ý chế độ cài đặt HTTPTargetConnection trong phần /apiproxy/targets/default.xml).
  • <HTTPProxyConnection> – Chỉ định đường dẫn máy chủ và URI xác định địa chỉ mạng mà ứng dụng gọi để sử dụng API này.
  • <RouteRule> – Phần tử này chỉ định cấu hình TargetEndpoint được ProxyEndpoint gọi.

Thêm mã JavaScript vào proxy

JavaScript (như tập lệnh Python, tệp JAR Java, tệp GCC, v.v.) được lưu trữ dưới dạng tài nguyên. Khi bạn mới bắt đầu làm việc với JavaScript, cách dễ nhất là lưu trữ các tệp JavaScript của bạn trong proxy API. Trong quá trình tiếp tục, bạn nên tạo JavaScript dưới dạng chung và có thể sử dụng lại, sau đó lưu trữ ở cấp môi trường hoặc tổ chức. Điều này giúp bạn không phải lưu trữ cùng các tệp JavaScript trong nhiều proxy API, điều này có thể nhanh chóng trở nên không thể quản lý được.

Để tìm hiểu về cách lưu trữ tài nguyên ở cấp tổ chức và cấp môi trường, hãy xem phần Tệp tài nguyên.

Dùng thử

Để biết hướng dẫn về cách triển khai và gọi proxy, hãy xem phần README sổ tay nấu ăn JavaScript.

Nhập và triển khai proxy API

Sau khi thực hiện thay đổi, bạn có thể Lưu proxy API vào công cụ trình tạo proxy API trong giao diện người dùng quản lý.

Hoặc bạn có thể chạy lệnh sau trong thư mục /api-platform-samples/doc-samples/javascript-cookbook.

$ sh deploy.sh

Kiểm thử JavaScript

Chạy lệnh sau trong thư mục /api-platform-samples/doc-samples/javascript-cookbook.

$ sh invoke.sh

Cờ curl -v được dùng trong tập lệnh shell để xem các tiêu đề HTTP trên thông báo phản hồi do JavaScript sửa đổi.

Bạn có thể trực tiếp gửi yêu cầu như sau:

$ curl -v http://{org_name}-test.apigee.net/javascript-cookbook 

Nếu JavaScript thực thi đúng cách, bạn sẽ thấy một phản hồi như sau:

< X-Apigee-Demo-Target: default
< X-Apigee-Demo-ApiProxyName: simple-javascript
< X-Apigee-Demo-ProxyName: default
< X-Apigee-Demo-ProxyBasePath: /javascript-cookbook
< X-Apigee-Demo-ProxyPathSuffix: /xml
< X-Apigee-Demo-ProxyUrl: http://rrt331ea.us-ea.4.apigee.com/javascript-cookbook/xml
 
{"city":"San Jose","state":"CA"}

Giờ đây, bạn có thể sửa đổi JavaScript để thử những điều mới, triển khai lại proxy API và xác minh kết quả bằng cách gửi cùng một yêu cầu. Luôn đảm bảo rằng bạn triển khai proxy API chứa JavaScript để các thay đổi có hiệu lực.

Lỗi tập lệnh

Bạn chắc chắn sẽ thấy lỗi khi viết JavaScript. Dưới đây là định dạng của các lỗi JavaScript mà bạn thấy do một proxy API báo cáo.

{  
   "fault":{  
      "faultstring":"Execution of rewriteTargetUrl failed with error: Javascript runtime error: \"TypeError: Cannot find function getVariable in object TARGET_REQ_FLOW. (rewriteTargetUrl_js#1). at line 1 \"",
      "detail":{  
         "errorcode":"steps.javascript.ScriptExecutionFailed"
      }
   }
}

Trường hợp sử dụng JavaScript

Trên Apigee Edge, thường có nhiều cách để triển khai chức năng cụ thể. Hãy sử dụng các chính sách có sẵn nếu có thể và tránh mã hoá tất cả logic của proxy API trong JavaScript. Mặc dù Apigee Edge tận dụng JavaScript đã biên dịch để cải thiện hiệu suất, nhưng rất khó để JavaScript hoạt động hiệu quả như các Chính sách. JavaScript có thể khó duy trì và gỡ lỗi hơn. Đặt trước JavaScript cho chức năng dành riêng cho các yêu cầu của bạn.

Nếu bạn lo ngại về hiệu suất đối với chức năng tuỳ chỉnh, hãy sử dụng Java nếu có thể.

Tóm tắt

Trong chủ đề sổ tay nấu ăn này, bạn đã tìm hiểu cách đưa JavaScript vào cấu hình proxy API để triển khai hành vi tuỳ chỉnh. Hành vi tuỳ chỉnh do các mẫu triển khai sẽ minh hoạ cách lấy và biến, cũng như cách phân tích cú pháp JSON và tạo thông báo phản hồi tuỳ chỉnh.