Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến
Tài liệu về Apigee X. thông tin
Tiêu đề HTTP là cặp giá trị tên cho phép ứng dụng khách và dịch vụ phụ trợ để truyền thông tin bổ sung tương ứng về yêu cầu và phản hồi. Một số ví dụ đơn giản là:
- Tiêu đề của yêu cầu uỷ quyền sẽ chuyển thông tin đăng nhập của người dùng đến máy chủ:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
- Tiêu đề
Content-Type
cho biết loại nội dung yêu cầu/phản hồi đang được gửi:Content-Type: application/json
Tiêu đề HTTP có thể có một hoặc nhiều giá trị, tuỳ thuộc vào định nghĩa trường tiêu đề. Một tiêu đề có nhiều giá trị sẽ có các giá trị được phân tách bằng dấu phẩy. Dưới đây là một vài ví dụ về tiêu đề chứa nhiều giá trị:
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
Apigee Edge giúp nhà phát triển dễ dàng truy cập vào tiêu đề bằng biến luồng trong bất kỳ chính sách Edge hoặc luồng có điều kiện nào. Sau đây là danh sách các biến có thể dùng để truy cập vào tiêu đề phản hồi hoặc yêu cầu cụ thể trong Edge:
Biến luồng:
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
Đối tượng JavaScript:
context.proxyRequest.headers.header-name
context.targetRequest.headers.header-name
context.proxyResponse.headers.header-name
context.targetResponse.headers.header-name
Dưới đây là ví dụ về chính sách AttributionMessage cho biết cách đọc giá trị của tiêu đề yêu cầu và lưu trữ giá trị đó vào một biến:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <AssignVariable> <Name>reqUserAgent</Name> <Ref>request.header.User-Agent</Ref> </AssignVariable> </AssignMessage>
Phản mẫu
Truy cập vào giá trị của tiêu đề HTTP trong các chính sách của Edge theo cách chỉ trả về giá trị đầu tiên không chính xác và có thể gây ra sự cố nếu(các) Tiêu đề HTTP cụ thể có nhiều giá trị.
Các phần sau đây trình bày các ví dụ về quyền truy cập vào tiêu đề.
Ví dụ 1: Đọc tiêu đề Chấp nhận có nhiều giá trị bằng mã JavaScript
Hãy cân nhắc rằng tiêu đề Accept
có nhiều giá trị như dưới đây:
Accept: text/html, application/xhtml+xml, application/xml
Dưới đây là mã JavaScript đọc giá trị từ tiêu đề Accept
:
// Read the values from Accept header var acceptHeaderValues = context.getVariable("request.header.Accept");
Mã JavaScript ở trên chỉ trả về giá trị đầu tiên từ tiêu đề Accept
,
chẳng hạn như text/html
.
Ví dụ 2: Đọc tiêu đề Access-Control-Allow-Headers có nhiều giá trị trong chính sách AllowedMessage hoặc RaiseFault
Hãy cân nhắc rằng tiêu đề Access-Control-Allow-Headers
có nhiều giá trị như dưới đây:
Access-Control-Allow-Headers: content-type, authorization
Dưới đây là một phần của mã trong việc đặt tiêu đề Access-Control-Allow-Headers
trong chính sách OnlyMessage hoặc RaiseFault:
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header> </Headers> </Set>
Mã ở trên đặt Tiêu đề Access-Control-Allow-Headers
chỉ với giá trị đầu tiên từ
tiêu đề của yêu cầu Access-Control-Allow-Headers
, trong ví dụ này là content-type
.
Tác động
- Trong cả hai ví dụ ở trên, lưu ý rằng chỉ giá trị đầu tiên từ các tiêu đề có nhiều giá trị mới được trả về. Nếu sau đó các giá trị này được một chính sách khác sử dụng trong luồng Proxy API hoặc dịch vụ phụ trợ thực hiện chức năng hoặc logic nào đó, thì điều đó có thể dẫn đến kết quả hoặc kết quả không mong muốn.
- Khi các giá trị tiêu đề của yêu cầu được truy cập và truyền vào máy chủ đích, các yêu cầu API có thể được chương trình phụ trợ xử lý không chính xác nên có thể trả về kết quả không chính xác.
- Nếu ứng dụng khách phụ thuộc vào các giá trị tiêu đề cụ thể từ phản hồi của Edge, thì ứng dụng cũng có thể xử lý không chính xác và đưa ra kết quả không chính xác.
Phương pháp hay nhất
Sử dụng các biến luồng tích hợp sẵn phù hợp:
request.header.header_name.values.count
,request.header.header_name.N
,response.header.header_name.values.count
response.header.header_name.N
.Sau đó, lặp lại để tìm nạp tất cả các giá trị từ một tiêu đề cụ thể trong chính sách chú thích JavaScript hoặc Java.
Ví dụ: Mã JavaScript mẫu để đọc tiêu đề nhiều giá trị
for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++) { print(context.getVariable('request.header.Accept.' + i)); }
Ví dụ:
application/xml;q=0.9, */*;q=0.8
sẽ xuất hiện dưới dạng một giá trị với mã ở trên.Nếu cần phân tách các giá trị tiêu đề bằng dấu chấm phẩy làm dấu phân tách, hãy dùng
string.split(";")
để tách chúng thành các giá trị.Dùng hàm
substring()
trên biến luồngrequest.header.header_name.values
trong chính sách RaiseFault hoặc AttributionMessage để đọc tất cả các giá trị của một tiêu đề cụ thể.Ví dụ: Lấy mẫu chính sách RaiseFault hoặc hoặc AssignmentsMessage để đọc một tiêu đề nhiều giá trị
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header> </Headers> </Set>