Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào
tài liệu Apigee X. thông tin
Trong chủ đề này, bạn sẽ tìm hiểu cách tạo một bản kết hợp bằng cách sử dụng thành phần chính sách. Thành phần chính sách là một mẫu proxy Apigee cho phép bạn kết hợp kết quả từ nhiều đích đến phụ trợ thành một phản hồi duy nhất bằng cách sử dụng các chính sách.
Để biết thông tin tổng quan chung về thành phần chính sách, hãy xem "Mẫu thành phần chính sách" trong các mẫu Sổ tay về proxy API.
Tải xuống và dùng thử mã mẫu
Giới thiệu về ví dụ sổ tay nấu ăn này
Ví dụ về sổ tay này minh hoạ một mẫu proxy API có tên là thành phần chính sách. Mẫu này cung cấp một cách (còn có những cách khác) để kết hợp dữ liệu từ nhiều nguồn phụ trợ. Nói chung, chủ đề này minh hoạ cách kết hợp và liên kết các chính sách với nhau để tạo ra kết quả mong muốn. Để biết thông tin tổng quan chung về mẫu này và các mẫu khác có liên quan, hãy xem các mẫu trong Sổ tay về proxy API.
Ví dụ được thảo luận ở đây sử dụng thành phần chính sách để kết hợp dữ liệu từ hai API công khai riêng biệt này:
- Google Geocoding API: API này chuyển đổi địa chỉ (chẳng hạn như "1600 Amphitheatre Parkway, Mountain View, CA") thành toạ độ địa lý (chẳng hạn như vĩ độ 37.423021 và kinh độ -122.083739).
- Google Elevation API API này cung cấp một giao diện đơn giản để truy vấn vị trí trên trái đất cho dữ liệu độ cao. Trong ví dụ này, toạ độ được trả về từ Geocoding API sẽ được dùng làm dữ liệu đầu vào cho API này.

Nhà phát triển ứng dụng sẽ gọi proxy API này bằng 2 tham số truy vấn, mã bưu chính và mã quốc gia:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
Phản hồi là một đối tượng JSON bao gồm vị trí được mã hoá địa lý (vĩ độ/kinh độ) cho tâm của khu vực mã bưu chính được cung cấp, kết hợp với độ cao tại vị trí được mã hoá địa lý đó.
{
"ElevationResponse":{
"status":"OK",
"result":{
"location":{
"lat":"39.7500713",
"lng":"-74.1357407"
},
"elevation":"0.5045232",
"resolution":"76.3516159"
}
}
}Trước khi bắt đầu
Nếu bạn muốn đọc thông tin tổng quan ngắn gọn về mẫu thành phần chính sách, hãy xem "Mẫu thành phần chính sách" trong các mẫu Sổ tay về proxy API.
Trước khi khám phá ví dụ về sổ tay này, bạn cũng nên làm quen với những 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 các proxy. Để biết thông tin tổng quan về chính sách, hãy xem phần Chính sách là gì?.
- Cấu trúc của một quy trình proxy API, như được giải thích trong phần Định cấu hình quy trình. Luồng cho phép bạn chỉ định trình tự mà các chính sách được thực thi bởi một 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 của proxy API.
- Cách tổ chức dự án proxy API trên hệ thống tệp của bạn, như được giải thích trong Tài liệu tham khảo về cấu hình proxy API. Chủ đề về sổ tay hướng dẫn này minh hoạ quá trình phát triển cục bộ (dựa trên hệ thống tệp) thay vì phát triển dựa trên đám mây, trong đó bạn có thể sử dụng giao diện người dùng quản lý để phát triển proxy API.
- Sử dụng tính năng xác thực khoá API. Đây là hình thức bảo mật dựa trên ứng dụng đơn giản nhất mà bạn có thể định cấu hình cho một API. Để biết thêm thông tin, hãy xem phần Khoá API. Bạn cũng có thể xem hướng dẫn Bảo mật API bằng cách yêu cầu khoá API.
- Có kiến thức cơ bản về XML. Trong ví dụ này, chúng ta sẽ tạo proxy API và các chính sách của proxy đó 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 thấy tất cả các tệp được đề cập trong chủ đề này trong thư mục mẫu mashup-policy-cookbook. Các phần sau đây sẽ thảo luận chi tiết về mã mẫu.
Thuận theo dòng chảy
Trước khi chuyển sang các chính sách, hãy xem quy trình chính của proxy API ví dụ của chúng ta. XML luồng (xuất hiện bên dưới) cho chúng ta biết nhiều thông tin về proxy này, các chính sách mà proxy sử dụng và vị trí gọi các chính sách đó.
Trong mẫu tải xuống, bạn có thể tìm thấy XML này trong tệp doc-samples/policy-mashup-cookbook/apiproxy/proxies/default.xml.
<ProxyEndpoint name="default"> <Flows> <Flow name="default"> <Request> <!-- Generate request message for the Google Geocoding API --> <Step><Name>GenerateGeocodingRequest</Name></Step> <!-- Call the Google Geocoding API --> <Step><Name>ExecuteGeocodingRequest</Name></Step> <!-- Parse the response and set variables --> <Step><Name>ParseGeocodingResponse</Name></Step> <!-- Generate request message for the Google Elevation API --> <Step><Name>AssignElevationParameters</Name></Step> </Request> <Response> <!-- Parse the response message from the Elevation API --> <Step><Name>ParseElevationResponse</Name></Step> <!-- Generate the final JSON-formatted response with JavaScript --> <Step><Name>GenerateResponse</Name></Step> </Response> </Flow> </Flows> <HTTPProxyConnection> <!-- Add a base path to the ProxyEndpoint for URI pattern matching--> <BasePath>/policy-mashup-cookbook</BasePath> <!-- Listen on both HTTP and HTTPS endpoints --> <VirtualHost>default</VirtualHost> <VirtualHost>secure</VirtualHost> </HTTPProxyConnection> <RouteRule name="default"> <!-- Connect ProxyEndpoint to named TargetEndpoint under /targets --> <TargetEndpoint>default</TargetEndpoint> </RouteRule> </ProxyEndpoint>
Sau đây là nội dung tóm tắt về các phần tử của quy trình.
- <Request> – Phần tử <Request> bao gồm một số phần tử <Step>. Mỗi bước gọi một trong các chính sách mà chúng ta sẽ tạo trong phần còn lại của chủ đề này. Các chính sách này liên quan đến việc tạo một thông báo yêu cầu, gửi thông báo đó và phân tích cú pháp phản hồi. Đến cuối chủ đề này, bạn sẽ hiểu được vai trò của từng chính sách này.
- <Response> – Phần tử <Response> cũng bao gồm <Steps>. Các bước này cũng gọi các chính sách chịu trách nhiệm xử lý phản hồi cuối cùng từ điểm cuối mục tiêu (Google Elevation API).
- <HttpProxyConnection> – Phần tử này chỉ định thông tin chi tiết về cách các ứng dụng sẽ kết nối với proxy API này, bao gồm cả <BasePath>, chỉ định cách gọi API này.
- <RouteRule> – Phần tử này chỉ định những việc sẽ xảy ra ngay sau khi các thông báo yêu cầu đến được xử lý. Trong trường hợp này, TargetEndpoint sẽ được gọi. Chúng ta sẽ thảo luận thêm về bước quan trọng này ở phần sau trong chủ đề này.
Tạo chính sách
Các phần sau đây thảo luận về từng chính sách tạo nên ví dụ về thành phần chính sách này.
Tạo chính sách AssignMessage đầu tiên
Chính sách AssignMessage đầu tiên (được liệt kê bên dưới) sẽ tạo một thông báo yêu cầu được gửi đến dịch vụ Địa lý mã hoá của Google.

Hãy bắt đầu với mã chính sách, sau đó chúng ta sẽ giải thích chi tiết hơn về các thành phần của mã này. Trong mẫu tải xuống, bạn có thể tìm thấy XML này trong tệp doc-samples/policy-mashup-cookbook/apiproxy/policies/GenerateGeocodingRequest.xml.
<AssignMessage name="GenerateGeocodingRequest"> <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo> <Set> <QueryParams> <QueryParam name="address">{request.queryparam.postalcode}</QueryParam> <QueryParam name="region">{request.queryparam.country}</QueryParam> <QueryParam name="sensor">false</QueryParam> </QueryParams> <Verb>GET</Verb> </Set> <!-- Set variables for use in the final response --> <AssignVariable> <Name>PostalCode</Name> <Ref>request.queryparam.postalcode</Ref> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> </AssignVariable> </AssignMessage>
Sau đây là nội dung mô tả ngắn gọn về các yếu tố trong chính sách này. Bạn có thể đọc thêm về chính sách này trong Chính sách về việc chỉ định tin nhắn.
- <AssignMessage name> – Đặt tên cho chính sách này. Tên này được dùng khi chính sách được tham chiếu trong một luồng.
- <AssignTo> – Tạo một biến được đặt tên là GeocodingRequest. Biến này đóng gói đối tượng yêu cầu mà chính sách ServiceCallout sẽ gửi đến phần phụ trợ.
- <QueryParams> – Đặt các tham số truy vấn mà lệnh gọi API phụ trợ cần. Trong trường hợp này, Geocoding API cần biết vị trí, được biểu thị bằng mã bưu chính và mã quốc gia. Người dùng ứng dụng cung cấp thông tin này và chúng tôi chỉ cần trích xuất thông tin đó tại đây. API yêu cầu tham số
sensorvà tham số này là true hoặc false, chúng ta chỉ cần mã hoá cứng tham số này thành false ở đây. - <Động từ> – Trong trường hợp này, chúng ta đang thực hiện một yêu cầu GET đơn giản đến API.
- <AssignVariable> – Các biến này lưu trữ những giá trị mà chúng ta đang truyền đến API. Trong ví dụ này, các biến sẽ được truy cập sau trong phản hồi được trả về cho ứng dụng.
Gửi yêu cầu bằng ServiceCallout
Bước tiếp theo trong trình tự tạo chính sách là tạo chính sách ServiceCallout. Chính sách ServiceCallout (được liệt kê bên dưới) sẽ gửi đối tượng yêu cầu mà chúng ta đã tạo trong chính sách AssignMessage trước đó đến dịch vụ Google Geocoding và lưu kết quả vào một biến có tên là GeocodingResponse.

Như trước đây, trước tiên, hãy xem xét mã. Sau đây là phần giải thích chi tiết. Bạn có thể đọc thêm về chính sách này trong Chính sách về chú thích dịch vụ. Trong mẫu tải xuống, bạn có thể tìm thấy XML này trong tệp doc-samples/policy-mashup-cookbook/apiproxy/policies/ExecuteGeocodingRequest.xml.
<ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="GeocodingRequest"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Sau đây là nội dung mô tả ngắn gọn về các yếu tố của chính sách này.
- <ServiceCallout> – Giống như chính sách trước, chính sách này cũng có tên.
- <Request variable> – Đây là biến được tạo trong chính sách AssignMessage. Nó đóng gói yêu cầu gửi đến API phụ trợ.
- <Response> – Phần tử này đặt tên cho một biến mà phản hồi được lưu trữ trong đó. Như bạn sẽ thấy, biến này sẽ được truy cập sau đó bằng chính sách ExtractVariables.
- <HTTPTargetConnection> – Chỉ định URL mục tiêu của API phụ trợ. Trong trường hợp này, chúng ta chỉ định rằng API sẽ trả về một phản hồi JSON.
Giờ đây, chúng ta có hai chính sách, một chính sách chỉ định thông tin yêu cầu cần thiết để sử dụng API phụ trợ (Geocoding API của Google) và chính sách thứ hai thực sự gửi yêu cầu đến API phụ trợ. Tiếp theo, chúng ta sẽ xử lý phản hồi.
Phân tích cú pháp phản hồi bằng ExtractVariables
Chính sách ExtractVariables cung cấp một cơ chế đơn giản để phân tích cú pháp nội dung từ thông báo phản hồi do chính sách ServiceCallout thu được. Bạn có thể dùng ExtractVariables để phân tích cú pháp JSON hoặc XML, hoặc dùng để trích xuất nội dung từ đường dẫn URI, tiêu đề HTTP, tham số truy vấn và tham số biểu mẫu.

Dưới đây là danh sách chính sách ExtractVariables. Bạn có thể đọc thêm về chính sách này trong chính sách Trích xuất biến. Trong mẫu tải xuống, bạn có thể tìm thấy XML này trong tệp doc-samples/policy-mashup-cookbook/apiproxy/policies/ParseGeocodingResponse.xml.
<ExtractVariables name="ParseGeocodingResponse"> <Source>GeocodingResponse</Source> <VariablePrefix>geocoderesponse</VariablePrefix> <JSONPayload> <Variable name="latitude"> <JSONPath>$.results[0].geometry.location.lat</JSONPath> </Variable> <Variable name="longitude"> <JSONPath>$.results[0].geometry.location.lng</JSONPath> </Variable> </JSONPayload> </ExtractVariables>
Các phần tử chính của chính sách ExtractVariable là:
- <ExtractVariables name> – Tên chính sách được dùng để tham chiếu đến chính sách khi chính sách đó được dùng trong một luồng.
- <Source> – Chỉ định biến phản hồi mà chúng ta đã tạo trong chính sách ServiceCallout. Đây là biến mà chính sách này trích xuất dữ liệu.
- <VariablePrefix> – Tiền tố biến chỉ định một không gian tên cho các biến khác được tạo trong chính sách này. Tiền tố có thể là bất kỳ tên nào, ngoại trừ những tên dành riêng do các biến được xác định trước của Edge xác định.
- <JSONPayload> – Phần tử này truy xuất dữ liệu phản hồi mà chúng ta quan tâm và đặt dữ liệu đó vào các biến được đặt tên. Trên thực tế, Geocoding API trả về nhiều thông tin hơn so với vĩ độ và kinh độ. Tuy nhiên, đây là những giá trị duy nhất chúng ta cần cho mẫu này. Bạn có thể xem bản kết xuất hoàn chỉnh của JSON do Geocoding API trả về trong tài liệu của API. Các giá trị của geometry.location.lat và geometry.location.lng chỉ là hai trong số nhiều trường trong đối tượng JSON được trả về.
Có thể bạn không thấy rõ, nhưng điều quan trọng là bạn phải thấy rằng ExtractVariables tạo ra 2 biến có tên bao gồm tiền tố biến (geocoderesponse) và tên biến thực tế được chỉ định trong chính sách. Các biến này được lưu trữ trong API proxy và sẽ có sẵn cho các chính sách khác trong luồng proxy, như bạn sẽ thấy. Các biến số là:
- geocoderesponse.latitude
- geocoderesponse.longitude
Hầu hết công việc đã hoàn tất. Chúng ta đã tạo một thành phần gồm 3 chính sách tạo thành một yêu cầu, gọi một API phụ trợ và phân tích cú pháp dữ liệu JSON được trả về. Trong các bước cuối cùng, chúng ta sẽ truyền dữ liệu từ phần này của quy trình vào một chính sách AssignMessage khác, gọi API phụ trợ thứ hai (Google Elevation API) và trả dữ liệu đã kết hợp cho nhà phát triển ứng dụng.
Tạo yêu cầu thứ hai bằng AssignMessage
Chính sách AssignMessage sau đây sử dụng các biến được trả về từ phần phụ trợ đầu tiên (Google Geocoding) mà chúng tôi đã lưu trữ và cắm chúng vào một yêu cầu dành cho API thứ hai (Google Elevation). Như đã lưu ý trước đó, các biến này là geocoderesponse.latitude và geocoderesponse.longitude.
Trong mẫu tải xuống, bạn có thể tìm thấy XML này trong tệp doc-samples/policy-mashup-cookbook/apiproxy/policies/AssignElevationParameters.xml.
<AssignMessage name="AssignElevationParameters">
<Remove>
<QueryParams>
<QueryParam name="country"/>
<QueryParam name="postalcode"/>
</QueryParams>
</Remove>
<Set>
<QueryParams>
<QueryParam name="locations">{geocoderesponse.latitude},{geocoderesponse.longitude}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
</Set>
</AssignMessage>Nếu kiểm tra Google Elevation API, bạn sẽ thấy API này có 2 tham số truy vấn.
Tham số đầu tiên có tên là locations và giá trị của tham số này là vĩ độ và kinh độ (các giá trị được phân tách bằng dấu phẩy). Tham số còn lại là sensor, đây là tham số bắt buộc và phải là true hoặc false. Điều quan trọng nhất cần lưu ý tại thời điểm này là thông báo yêu cầu mà chúng ta tạo ở đây không yêu cầu ServiceCallout. Tại thời điểm này, chúng ta không cần gọi API thứ hai từ ServiceCallout vì có thể gọi API phụ trợ từ TargetEndpoint của proxy. Nếu bạn nghĩ về điều đó, chúng tôi có tất cả dữ liệu cần thiết để gọi Google Elevations API. Thông báo yêu cầu được tạo trong bước này không yêu cầu ServiceCallout, vì yêu cầu được tạo cho quy trình yêu cầu chính, nên sẽ chỉ được ProxyEndpoint chuyển tiếp đến TargetEndpoint, theo RouteRule được định cấu hình cho proxy API này.
TargetEndpoint quản lý kết nối với API từ xa. (Nhớ lại rằng URL cho API độ cao được xác định trong HTTPConnection cho TargetEndpoint. Tài liệu về Elevation API nếu bạn muốn biết thêm. QueryParams mà chúng ta đã lưu trữ trước đó, country và postalcode, không còn cần thiết nữa, vì vậy, chúng ta sẽ xoá chúng ở đây.
Tạm dừng một chút: Quay lại quy trình
Đến đây, có thể bạn sẽ thắc mắc tại sao chúng tôi không tạo một chính sách ServiceCallout khác. Sau tất cả, chúng tôi đã tạo một thông báo khác. Làm cách nào để gửi thông báo đó đến đích đến là Google Elevation API? Câu trả lời nằm trong phần tử <RouteRule> của luồng. <RouteRule> chỉ định việc cần làm với mọi thông báo yêu cầu còn lại sau khi phần <Request> của quy trình đã thực thi. TargetEndpoint do <RouteRule> này chỉ định sẽ cho biết proxy API cần gửi thông báo đến http://maps.googleapis.com/maps/api/elevation/xml.
Nếu đã tải API proxy mẫu xuống, bạn có thể tìm thấy TargetProxy XML trong tệp doc-samples/policy-mashup-cookbook/apiproxy/targets/default.xml.
<TargetEndpoint name="default"> <HTTPTargetConnection> <!-- This is where we define the target. For this sample we just use a simple URL. --> <URL>http://maps.googleapis.com/maps/api/elevation/xml</URL> </HTTPTargetConnection> </TargetEndpoint>
Giờ đây, chúng ta chỉ cần xử lý phản hồi từ Google Elevation API là xong.
Chuyển đổi phản hồi từ XML sang JSON
Trong ví dụ này, phản hồi từ Google Elevation API được trả về dưới dạng XML. Để "ghi thêm điểm", hãy thêm một chính sách khác vào thành phần để chuyển đổi phản hồi từ XML sang JSON.
Ví dụ này sử dụng chính sách JavaScript có tên là GenerateResponse, với một tệp tài nguyên chứa mã JavaScript, để thực hiện quá trình chuyển đổi. Sau đây là định nghĩa chính sách GenerateResponse:
<Javascript name="GenerateResponse" timeout="10000"> <ResourceURL>jsc://GenerateResponse.js</ResourceURL> </Javascript>
Tệp tài nguyên GenerateResponse.js bao gồm JavaScript dùng để thực hiện quá trình chuyển đổi. Bạn có thể thấy mã đó trong tệp doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.
Apigee cũng cung cấp một chính sách có sẵn là XMLToJSON để chuyển đổi XML thành JSON. Bạn có thể chỉnh sửa ProxyEndpoint để sử dụng chính sách xmltojson như minh hoạ bên dưới.
<XMLToJSON name="xmltojson"> <Options> </Options> <OutputVariable>response</OutputVariable> <Source>response</Source> </XMLToJSON>
Kiểm thử ví dụ
Nếu chưa làm, hãy thử tải xuống, triển khai và chạy mẫu policy-mashup-cookbook. Bạn có thể tìm thấy mẫu này trong thư mục doc-samples trong kho lưu trữ mẫu Apigee Edge trên GitHub. Bạn chỉ cần làm theo hướng dẫn trong tệp README trong thư mục policy-mashup-cookbook. Hoặc làm theo hướng dẫn ngắn gọn tại đây: Sử dụng các proxy API mẫu.
Tóm lại, bạn có thể gọi API tổng hợp như sau. Thay thế {myorg} bằng tên tổ chức của bạn:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
Phản hồi bao gồm vị trí được mã hoá địa lý cho tâm của mã bưu chính do người dùng cuối ứng dụng cung cấp, kết hợp với độ cao tại vị trí được mã hoá địa lý đó. Dữ liệu được truy xuất từ 2 API phụ trợ, kết hợp với các chính sách được đính kèm vào proxy API và được trả về cho ứng dụng khách trong một phản hồi duy nhất.
{ "country":"us", "postalcode":"08008", "elevation":{ "meters":0.5045232, "feet":1.6552599030345978 }, "location":{ "latitude":39.75007129999999, "longitude":-74.1357407 } }
Tóm tắt
Chủ đề này trong sổ tay hướng dẫn giải thích cách sử dụng mẫu thành phần chính sách để tạo một bản kết hợp dữ liệu từ nhiều nguồn phụ trợ. Thành phần chính sách là một mẫu phổ biến được dùng trong quá trình phát triển proxy API để thêm chức năng sáng tạo vào API của bạn.