2015-08-06 20 views
10

Tôi đang cố gắng xem cách truy cập giá trị tiêu đề và nội dung yêu cầu từ trong mã lambda. Nếu phần thân yêu cầu ở định dạng JSON, nó tự động được phân tích cú pháp và có sẵn trong đối tượng sự kiện.Truy cập yêu cầu HTTP (tiêu đề, chuỗi truy vấn, cookie, nội dung) đối tượng trong lambda với http end

Làm cách nào để truy cập chuỗi truy vấn đầy đủ, yêu cầu nội dung, yêu cầu tiêu đề (cookie) cho bất kỳ loại yêu cầu "Loại nội dung" nào bên trong Lambda?


Việc sửa đổi dưới đây là thông tin tôi đã thu thập được để giúp giải quyết câu hỏi đó có thể hoặc không có thể có liên quan. Hãy bỏ qua chúng nếu bạn muốn.


EDIT:

Tôi đã trải qua những câu hỏi đang tồn tại trên SE herehere. Theo điều này thread, sử dụng $input.json('$') nên thực hiện thủ thuật. Tôi đoán câu trả lời từ các liên kết ở trên đã lỗi thời như cổng API theo mặc định có vẻ như nhận ra JSON trong yêu cầu và nếu như vậy làm cho nó có sẵn trong đối tượng event mà không có bất kỳ mẫu ánh xạ nào được định cấu hình.

Đặt ánh xạ theo đề xuất không hoạt động đối với tôi. Nó không chứa thông tin tiêu đề yêu cầu.

Dưới đây là ảnh chụp màn hình về cách cấu hình.

enter image description here


enter image description here

Các "tiêu đề" lợi nhuận chủ chốt một giá trị trống. Sử dụng các lỗi $input.params('$') hoặc "$input.params('$')".


EDIT 2

Cố định tiêu đề trong Phương pháp yêu cầu. Vẫn không nhận được giá trị User-Agent bên trong lambda.

enter image description here


EDIT 3

tôi đã sử dụng các bản đồ mẫu sau vào API Gateway

{ 
    "request": $input.json('$'), 
    "headers": "$input.params()" 
} 

và mã dưới đây vào lambda

context.succeed("event.key32:"+JSON.stringify(event, null, 2)); 

Và phản hồi được tạo bởi cổng API hiển thị số này enter image description here

Nhìn vào giá trị "tiêu đề" trong phản hồi, có vẻ như tất cả các tiêu đề nhận được từ máy khách HTTP đều bị chặn? Đây là toàn văn từ JSON trả về bởi $ input.params().tiêu đề

header={CloudFront-Forwarded-Proto=https, CloudFront-Is-Desktop-Viewer=true, CloudFront-Is-Mobile-Viewer=false, CloudFront-Is-SmartTV-Viewer=false, CloudFront-Is-Tablet-Viewer=false, Content-Type=application/json, Via=1.1 5d53b9570d94ce920abbd471.cloudfront.net (CloudFront), 1.1 95eea7baa7ec95c9a41eca9e3ab7.cloudfront.net (CloudFront), X-Amz-Cf-Id=GBqmObLRy6Iem9bJbVPrrW1K3YoWRDyAaMpv-UkshfCsHAA==, X-Forwarded-For=172.35.96.199, 51.139.183.101, X-Forwarded-Port=443, X-Forwarded-Proto=https}} 

Nó không có chuỗi User-Agent trong tiêu đề, mặc dù như ảnh chụp màn hình hiển thị ở trên, nó được gửi bởi máy khách REST. Điều thú vị là toàn bộ chuỗi truy vấn được tạo sẵn. Không chắc chắn nếu đây là một cách dự định để truy cập nó.

+0

Bạn có thể đơn giản hóa các câu hỏi? Nó thực sự cồng kềnh ngay bây giờ. – kixorz

+1

@napalm, tôi đã nêu bật phần câu hỏi. Vui lòng bỏ qua các chỉnh sửa. Để tóm tắt câu hỏi: Làm thế nào tôi có thể truy cập chuỗi truy vấn đầy đủ, yêu cầu nội dung, yêu cầu tiêu đề (cookie) cho bất kỳ loại yêu cầu "Content-Type" nào bên trong Lambda? – user3526

Trả lời

4

Các tiêu đề yêu cầu có thể được truy cập bằng $input.params('header-name')

Đáng ngạc nhiên, header User-Agent có thể không được truy cập với mã trên. Bạn cần phải nhảy qua the sau hoop để lấy nó:

$context.identity.userAgent

Yêu cầu cơ thể/tải trọng nên có thể truy cập bằng cách sử dụng đoạn mã sau. Nhiều tài liệu tham khảo here, herehere:

{ 
    "reqbody": "$input.path('$')" 
} 

Nó không phải là chưa rõ ràng nếu cơ thể yêu cầu được dự kiến ​​sẽ được trong JSON. Cần lưu ý rằng yêu cầu được coi là UTF-8 theo this bài đăng.


Hiện nay có vẻ là hai bugs:

  1. Các "User-Agent" tiêu đề là mất tích/bị tước đi sau Amazon API.
  2. Khi các giá trị tiêu đề chứa một dấu nháy kép ("), hàm lambda chẳng thi hành ngay. (Tôi không thấy một mục log trong các bản ghi cloudwatch cho các yêu cầu như vậy). Thay vào đó, cơ thể phản ứng http chứa sau:

    { 
        "Type": "User", 
        "message": "Could not parse request body into json." 
    } 
    

Một yêu cầu ví dụ mà thất bại trong Amazon API enter image description here

tôi tin rằng điều này sẽ cần phải được sửa chữa để có thể thực hiện các cơ chế ETag cho ca ching.

Tài liệu tham khảo:

Một ETag dự kiến ​​sẽ được kèm theo trong dấu ngoặc kép. Trình duyệt dự kiến ​​sẽ gửi giá trị chính xác này trở lại thông qua tiêu đề If-None-Match và đây là nơi mà API Amazon bị hỏng.

Syntax for ETag?

HTTP: max length of etag

http://gsnedders.com/http-entity-tags-confusion

1

Bạn có để có được những thông tin cần thiết trong việc lập bản đồ mẫu và gửi chúng trở lại chức năng Lambda của bạn, đây là một trong những mẫu tôi sử dụng để gửi thông tin đến các chức năng Lambda:

{ 
    "params" : "$input.params()", 
    "content-type-value" : "$input.params().header.get('Content-Type')", 
    "body" : "$input.json('$')", 
    "request-id": "$context.requestId", 
    "method": "$context.httpMethod", 
    "resource": "$context.resourcePath", 
    "id": "$input.params('id')" //This is a path parameter in my case 
} 

Bạn có thể làm tương tự, hoặc bạn có thể truy cập params.path.id (một lần nữa trong trường hợp của tôi). Đây là tài liệu link.

Chúc mừng,

1

Tôi đã cập nhật mẫu bản đồ tôi đã sử dụng trong câu trả lời cho một trong các câu hỏi được tham chiếu để chứa thuộc tính userAgent.

{ 
    "method": "$context.httpMethod", 
    "body": $input.json('$'), 
    "userAgent": "$context.identity.userAgent", 
    "headers": { 
    #foreach($param in $input.params().header.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "queryParams": { 
    #foreach($param in $input.params().querystring.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "pathParams": { 
    #foreach($param in $input.params().path.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end 

    #end 
    } 
} 

Một lời giải thích chi tiết về các mẫu có sẵn ở đây: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/

Các vấn đề liên quan