วิธีส่งพารามิเตอร์ตัวสอบถามหรือเส้นทางไปยัง AWS Lambda จาก Amazon API Gateway


348

เช่นถ้าเราต้องการใช้

GET /user?name=bob

หรือ

GET /user/bob

คุณจะส่งตัวอย่างทั้งสองนี้เป็นพารามิเตอร์ไปยังฟังก์ชัน Lambda ได้อย่างไร

ฉันเห็นบางอย่างเกี่ยวกับการตั้งค่า "แมปจาก" ในเอกสารประกอบ แต่ฉันไม่พบการตั้งค่านั้นในคอนโซล API เกตเวย์

  • method.request.path.parameter-nameสำหรับพารามิเตอร์พา ธ ที่มีชื่อparameter-nameตามที่กำหนดไว้ในหน้าคำขอวิธีการ
  • method.request.querystring.parameter-nameสำหรับพารามิเตอร์สตริงแบบสอบถามที่มีชื่อparameter-nameตามที่กำหนดไว้ในหน้าคำขอวิธีการ

ฉันไม่เห็นตัวเลือกเหล่านี้แม้ว่าฉันจะกำหนดสตริงข้อความค้นหา

คำตอบ:


299

ตั้งแต่เดือนกันยายน 2017 คุณไม่จำเป็นต้องกำหนดค่าการแมปเพื่อเข้าถึงเนื้อหาคำขออีกต่อไป

สิ่งที่คุณต้องทำคือตรวจสอบ "ใช้การรวม Lambda Proxy" ภายใต้คำขอการรวมระบบภายใต้ทรัพยากร

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นคุณจะสามารถเข้าถึงพารามิเตอร์ข้อความค้นหาพารามิเตอร์เส้นทางและส่วนหัวได้

event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']

23
นี่เป็นเคล็ดลับที่ยอดเยี่ยม แต่โปรดทราบว่าการเปิดใช้งานการรวมพร็อกซีของ Lambda อาจทำให้เกิดข้อผิดพลาด ต่อไปนี้เป็นวิธีแก้ไข: stackoverflow.com/questions/43708017/…
AaronBaker

6
มีวิธีการทำเช่นนี้ใน java ในขณะที่รักษา deserialization โปร่งใสที่ใช้RequestHandlerให้?
รองเท้า

2
การตั้งค่านี้อยู่ที่ไหน
red888

2
@MattWestlake คุณสร้างทรัพยากรที่เรียกว่าผู้ใช้และภายใต้มันเป็นทรัพยากรที่เรียกว่า {name} ใน API Gateway
Jonathan

3
ฉันแค่อยากจะพูดถึงว่าหลังจากการเปลี่ยนแปลงนี้ฉันก็ต้องไปที่เกตเวย์ API ของ Amazon -> การกระทำ -> ปรับใช้ API และนำไปใช้งานกับสภาพแวดล้อมจริง
victorvartan

221

ขั้นตอนในการทำงานนี้คือ:

ภายในคอนโซลของ API เกตเวย์ ...

  1. ไปที่ Resources -> Integration Request
  2. คลิกที่ไอคอนเครื่องหมายบวกหรือแก้ไขถัดจากดรอปดาวน์เทมเพลต (แปลกที่ฉันรู้เนื่องจากฟิลด์เทมเพลตเปิดอยู่แล้วและปุ่มที่นี่ดูเป็นสีเทา)
  3. พิมพ์อย่างชัดเจนapplication/jsonในฟิลด์ประเภทเนื้อหาแม้ว่าจะแสดงค่าเริ่มต้น (ถ้าคุณไม่ทำเช่นนี้มันจะไม่บันทึกและจะไม่ให้ข้อความผิดพลาด)
  4. วางสิ่งนี้ในการแม็พอินพุต { "name": "$input.params('name')" }

  5. คลิกที่ช่องทำเครื่องหมายถัดจากรายการแบบเลื่อนลงของแม่แบบ (ฉันสมมติว่านี่คือสิ่งที่บันทึกไว้ในที่สุด)


9
คุณเคยได้รับสิ่งนี้เพื่อส่งผ่านพารามิเตอร์ URL ใน URL เช่น / user / bob ซึ่งเป็นเส้นทางที่ / user / {ชื่อผู้ใช้} หรือไม่ ฉันได้ลองวิธีเรียงสับเปลี่ยนทุกประเภท แต่ก็ไม่สามารถใช้งานได้
ลูคัส

5
ไม่มีใครรู้ว่ามีเอกสารอย่างเป็นทางการใด ๆ จะดีเพียงแค่ผ่านพารามิเตอร์การสืบค้นทั้งหมดหรือจัดการค่าตัวเลือกเพิ่มเติมอย่างสง่างามกว่าสตริงที่ว่างเปล่า
AxelTheGerman

6
หนึ่งเคล็ดลับสำหรับนักพัฒนา iOS: API เกตเวย์จะไม่ส่งข้อมูลแบบสอบถามจนกว่าคุณจะกำหนดตัวแปรแต่ละรายการเป็นสตริงข้อความค้นหา (ภายใต้ 'คำขอวิธีการ') และปรับใช้ API จนกว่าการปรับใช้จะทำงานได้จากการทดสอบคอนโซล แต่ตัดออกจากคำสั่งของแอป
AlexeyVMP

3
@axel มีการบันทึกไว้ที่นี่: docs.aws.amazon.com/apigateway/latest/developerguide/…
russau

6
ลูคัสฉันได้มันมาทำงานโดยใช้รูปแบบ / user / {ชื่อผู้ใช้} เพียงจำไว้ว่าพา ธ ทรัพยากร GET ของคุณเป็น / user / {ชื่อผู้ใช้} ในขั้นตอนที่ 4 การจับคู่อินพุตดูเหมือนว่า {"ชื่อ": "$ input.params ('ชื่อผู้ใช้')"}
เจอราร์ด

134

ฉันใช้เทมเพลตการแมปนี้เพื่อจัดเตรียมพารามิเตอร์ส่วนหัว, ส่วนหัว, วิธีการและเส้นทาง URL ให้กับเหตุการณ์แลมบ์ดา ฉันเขียนโพสต์บล็อกเพื่ออธิบายแม่แบบในรายละเอียดเพิ่มเติม: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api- ประตู/

นี่คือเทมเพลตการทำแผนที่ที่คุณสามารถใช้:

{
  "method": "$context.httpMethod",
  "body" : $input.json('$'),
  "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
  }  
}

! ที่น่าตื่นตาตื่นใจ ฉันกำลังดิ้นรนกับการส่งสิ่งต่าง ๆ ไปยังผู้จัดการของฉัน คำตอบที่ดีที่สุดที่นี่
Venkat D.

ฉันทำสิ่งนี้ แต่ฉันยังไม่ได้รับอะไรเลย มันแสดงไม่ได้กำหนด เราควรจะส่งพารามิเตอร์ใน URL อย่างไร และเราจำเป็นต้องระบุชื่อตัวแปรใน url เช่นในสถานการณ์ GET url ปกติหรือไม่? โปรดช่วยฉันด้วยสิ่งนี้
Parthapratim Neog

8
ไม่เป็นไรฉันจะได้ผลลัพธ์ ปัญหาคือฉันเพิ่มการแมปและบันทึกไว้และไม่ได้deployapi อีกครั้ง เมื่อฉันปรับใช้ API ด้วยการทำแผนที่ใหม่มันก็ใช้ได้ดี ขอบคุณมาก
Parthapratim Neog

@ shashu10 ดูคำตอบของฉัน
matsev

1
ฉันไม่สามารถเริ่มบอกคุณได้ว่าบล็อกของคุณมีประโยชน์เพียงใด ฉันพบโพสต์ "eturn-html-from-aws-api-gateway" ก่อนแล้วจึงติดตามเพราะเป็นสิ่งที่ฉันต้องการ ตอนนี้ฉันต้องผ่านพารามิเตอร์บางอย่างในฟังก์ชั่นและแก้ไข html ตามนั้น - และอีกครั้งคุณเป็นคนเดียวที่มีคำแนะนำจริง! คำแนะนำอื่น ๆ ทั้งหมดที่ฉันพบดูเหมือนจะพลาดประเด็น
user3685427

41

ทุกวันนี้เทมเพลตดร็อปดาวน์จะรวมอยู่ใน API เกตเวย์คอนโซลบน AWS

สำหรับ API ของคุณคลิกที่ชื่อทรัพยากร ... จากนั้นรับ

ขยาย "เทมเพลตการแมปเนื้อหา"

พิมพ์ใน

แอพลิเคชัน / JSON

สำหรับ Content-Type (ต้องพิมพ์อย่างชัดเจน) และคลิกที่เครื่องหมาย

หน้าต่างใหม่จะเปิดขึ้นพร้อมคำว่า "สร้างเทมเพลต" และดร็อปดาวน์ (ดูภาพ)

เลือก

ขอวิธีการส่งผ่าน

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นคลิกบันทึก

ในการเข้าถึงตัวแปรใด ๆ ให้ใช้ไวยากรณ์ต่อไปนี้ (นี่คือ Python) เช่น URL:

https://yourURL.execute-api.us-west-2.amazonaws.com/prod/confirmReg?token=12345&uid=5

คุณสามารถรับตัวแปรได้ดังนี้:

from __future__ import print_function

import boto3
import json

print('Loading function')


def lambda_handler(event, context):
    print(event['params']['querystring']['token'])
    print(event['params']['querystring']['uid'])

ดังนั้นจึงไม่จำเป็นต้องตั้งชื่อหรือแมปตัวแปรแต่ละตัวที่คุณต้องการอย่างชัดเจน


! ที่ดีเยี่ยม ฟังก์ชันการทำงานอยู่ที่นั่นในบริการ แต่พลาดไป!
hnvasa

25

ในการส่งพารามิเตอร์ไปยังฟังก์ชั่นแลมบ์ดาคุณต้องสร้างการแมประหว่างคำขอ API เกตเวย์และฟังก์ชั่นแลมบ์ดาของคุณ การแมปเสร็จในส่วนIntegration Request-> Mapping templatesของทรัพยากร API เกตเวย์ที่เลือก

สร้างการแมปประเภทapplication/jsonจากนั้นทางด้านขวาคุณจะแก้ไข (คลิกที่ดินสอ) เทมเพลต

เทมเพลตการทำแผนที่เป็นเทมเพลต Velocity ที่คุณสามารถใช้ ifs, loops และตัวแปรการพิมพ์แน่นอน แม่แบบมีตัวแปรเหล่านี้ฉีดที่คุณสามารถเข้าถึงพารามิเตอร์สตริงการสืบค้นหัวคำขอ ฯลฯ เป็นรายบุคคล ด้วยรหัสต่อไปนี้คุณสามารถสร้างการสืบค้นทั้งหมดอีกครั้ง:

{
    "querystring" : "#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0)&#end$util.urlEncode($key)=$util.urlEncode($input.params().querystring.get($key))#end",
    "body" : $input.json('$')
}

หมายเหตุ: คลิกที่สัญลักษณ์ตรวจสอบเพื่อบันทึกแม่แบบ คุณสามารถทดสอบการเปลี่ยนแปลงของคุณด้วยปุ่ม "ทดสอบ" ในทรัพยากรของคุณ แต่เพื่อทดสอบพารามิเตอร์การสอบถามในคอนโซล AWS คุณจะต้องกำหนดชื่อพารามิเตอร์ในMethod Requestส่วนของทรัพยากรของคุณ

หมายเหตุ: ตรวจสอบคู่มือผู้ใช้ Velocityสำหรับข้อมูลเพิ่มเติมเกี่ยวกับภาษาเทมเพลต Velocity

จากนั้นในแลมบ์ดาเทมเพลตของคุณคุณสามารถทำสิ่งต่อไปนี้เพื่อรับการวิเคราะห์คำ:

var query = require('querystring').parse(event.querystring)
// access parameters with query['foo'] or query.foo

9
นี่คือทางออกที่ดีที่สุด โปรดอย่าลืมทำเช่นActions>Deploy APIนั้น (ฉันเสียเวลาของฉันลืมสิ่งนี้ ... ) แลมบ์ดาที่เกี่ยวข้องจะทำการเปลี่ยนแปลงทันทีหลังจากการปรับใช้ Stages > #stage (like: prod) > Deployment Historyคุณสามารถตรวจสอบใน
loretoparisi

24

คำตอบที่ได้รับการยอมรับใช้ได้ดีสำหรับฉัน แต่การเพิ่มคำตอบของ gimenete ฉันต้องการเทมเพลตทั่วไปที่ฉันสามารถใช้เพื่อส่งผ่านการสืบค้น / พา ธ / ส่วนหัวทั้งหมด (เช่นเดียวกับสตริง) ฉันโพสต์ไว้ที่นี่ในกรณีที่มีคนพบว่ามีประโยชน์:

#set($keys = [])
#foreach($key in $input.params().querystring.keySet())
  #set($success = $keys.add($key))
#end

#foreach($key in $input.params().headers.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

#foreach($key in $input.params().path.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

{
#foreach($key in $keys)
  "$key": "$util.escapeJavaScript($input.params($key))"#if($foreach.hasNext),#end
#end
}

1
Fab ฉันต้องการที่จะใช้ฟังก์ชั่นเดียวกันสำหรับคำขอ POST (กับ JSON body) และ GET ด้วยสตริงการสืบค้น ทำงานในฝัน ขอบคุณ!
Matt Fletcher

@benv นี่คือเทมเพลตแบบเต็มหรือไม่
nxmohamad

17

เป็นส่วนหนึ่งของการพยายามตอบคำถามของฉันเองที่นี่ฉันพบเคล็ดลับนี้

ในเทมเพลตการทำแผนที่ API Gateway ให้ใช้ข้อมูลต่อไปนี้เพื่อให้สตริงการสืบค้นที่สมบูรณ์ตามที่ส่งโดยไคลเอนต์ HTTP:

{
    "querystring": "$input.params().querystring"
}

ข้อได้เปรียบคือคุณไม่จำเป็นต้อง จำกัด ตัวเองให้เป็นชุดของคีย์ที่แมปที่กำหนดไว้ล่วงหน้าในสตริงการสืบค้นของคุณ ตอนนี้คุณสามารถยอมรับคู่คีย์ - ค่าใด ๆ ในสตริงเคียวรีหากนี่คือวิธีที่คุณต้องการจัดการ

หมายเหตุ: ตามนี้เท่านั้นที่$input.params(x)ถูกระบุว่าเป็นตัวแปรทำให้พร้อมสำหรับแม่แบบ VTL เป็นไปได้ว่าภายในอาจมีการเปลี่ยนแปลงและquerystringอาจไม่สามารถใช้งานได้อีกต่อไป


1
สิ่งนี้ยังคงใช้งานได้ในเดือนพฤษภาคม 2017 แต่จะส่งคืนวัตถุ JS ที่ API Gateway สร้างให้คุณแทนที่จะเป็นสตริงข้อความค้นหาที่แท้จริง สิ่งนี้น่ารำคาญสำหรับฉันเพราะฉันพยายามแยกสตริงข้อความค้นหาเพื่อเปลี่ยนพารามิเตอร์ซ้ำเป็นอาร์เรย์
Tom Saleeba

11

ตอนนี้คุณควรจะสามารถใช้ประเภทการรวมพร็อกซีใหม่สำหรับแลมบ์ดาเพื่อรับคำขอแบบเต็มโดยอัตโนมัติในรูปแบบมาตรฐานแทนที่จะกำหนดค่าการแมป

ดู: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on- พร็อกซี่ทรัพยากร


1
ฉันไม่แน่ใจว่าทำไม แต่ปกติแล้วการรวมพร็อกซีไม่ได้ผลสำหรับฉัน ฉันต้องลบมันออกจาก API ล่าสุดที่ฉันสร้างขึ้น
Gustavo Straube

เหมือนกัน ^ ยิ่งกว่านั้นฉันมีปัญหา CORS กับ API เกตเวย์ ติดตามเอกสาร AWS ฉันไม่สามารถทำงาน CORS ได้ อย่างไรก็ตามฉันพบบทความขนาดกลางเก่าตั้งแต่กลางปี ​​2015 ซึ่งมีวิธีการตั้งค่า CORS ด้วยตนเองและใช้งานได้
Stephen Tetreault


5

คำตอบมากมายที่นี่ยอดเยี่ยม แต่ฉันต้องการบางสิ่งที่ง่ายกว่าเล็กน้อย ฉันต้องการบางสิ่งที่จะทำงานกับตัวอย่าง "Hello World" ได้ฟรี ซึ่งหมายความว่าฉันต้องการให้ง่ายสร้างคำขอร่างกายที่ตรงกับสตริงแบบสอบถาม:

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

ฉันคิดว่าคำตอบยอดนิยมสร้างสิ่งที่มีประโยชน์มากขึ้นเมื่อสร้างของจริง แต่สำหรับการเรียกใช้ Hello World อย่างรวดเร็วโดยใช้เทมเพลตจาก AWS สิ่งนี้ใช้งานได้ดี


4

ตัวอย่างการแม็พพารามิเตอร์ต่อไปนี้ส่งผ่านพารามิเตอร์ทั้งหมดรวมถึงพา ธ การสอบถามและส่วนหัวจนถึงจุดสิ้นสุดการรวมผ่านทาง JSON payload

#set($allParams = $input.params())
{
  "params" : {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type" : {
      #foreach($paramName in $params.keySet())
      "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
      #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}

เทมเพลตการแม็พนี้จะแสดงผลพารามิเตอร์การร้องขอทั้งหมดในเพย์โหลดตามที่ระบุไว้ดังนี้:

{
  "parameters" : {
     "path" : {    
       "path_name" : "path_value", 
       ...
     }
     "header" : {  
       "header_name" : "header_value",
       ...
     }
     'querystring" : {
       "querystring_name" : "querystring_value",
       ...
     }
   }
}

คัดลอกมาจากคู่มือผู้พัฒนาเกตเวย์ API ของ Amazon


2

สตริงแบบสอบถามตรงไปข้างหน้าเพื่อแจงในจาวาสคริปต์ในแลมบ์ดา

สำหรับ GET / user? name = bob

 var name = event.params.querystring.name;

นี่ไม่ได้แก้คำถามผู้ใช้ / บ๊อบ GET


its event.queryStringParameters.name
Neo

ฉันต้องทำevent.queryStringParameters.name
Anders Kitson

2

ในฐานะที่เป็นคำตอบของ @ Jonathan หลังจากทำเครื่องหมายใช้การรวม Lambda ProxyในIntegration Requestในซอร์สโค้ดของคุณคุณควรใช้รูปแบบด้านล่างเพื่อผ่านข้อผิดพลาดBad Pass 502

NodeJS 8.10:

exports.handler = async (event, context, callback) => {
  // TODO: You could get path, parameter, headers, body value from this
  const { path, queryStringParameters, headers, body } = event;

  const response = {
    "statusCode": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "body": JSON.stringify({
      path, 
      query: queryStringParameters,
      headers,
      body: JSON.parse(body)
    }),
    "isBase64Encoded": false
  };

  return response;
};

อย่าลืมปรับใช้ทรัพยากรของคุณที่ API Gateway ก่อนที่จะเรียกใช้ API ของคุณอีกครั้ง JSON เพียงแค่ส่งคืนชุดของเนื้อหาที่ถูกต้อง ดังนั้นคุณสามารถรับพา ธ พารามิเตอร์ส่วนหัวค่าเนื้อความจากเหตุการณ์

const {เส้นทาง, queryStringParameters, ส่วนหัว, ร่างกาย} = เหตุการณ์;


1

ฟังก์ชัน Lambda ต้องการอินพุต JSON ดังนั้นจึงจำเป็นต้องแยกสตริงการสืบค้น วิธีแก้ไขคือเปลี่ยนสตริงแบบสอบถามเป็น JSON โดยใช้เทมเพลตการทำแผนที่
ฉันใช้มันสำหรับ C # .NET Core ดังนั้นอินพุตที่คาดหวังควรเป็น JSON ด้วยพารามิเตอร์ "queryStringParameters"
ทำตาม 4 ขั้นตอนด้านล่างเพื่อบรรลุเป้าหมายดังกล่าว:

  1. เปิดเทมเพลตการแมปของทรัพยากร API Gateway ของคุณและเพิ่มapplication/jsoncontent-tyap ใหม่:

เทมเพลตการแมปเกตเวย์ของ API

  1. คัดลอกแม่แบบด้านล่างซึ่งแยกวิเคราะห์สตริงแบบสอบถามลงใน JSON และวางลงในเทมเพลตการทำแผนที่:

    {
    "queryStringParameters": {#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0),#end"$key":"$input.params().querystring.get($key)"#end}
    }
    
  2. ใน API Gateway ให้เรียกใช้ฟังก์ชัน Lambda ของคุณและเพิ่มสตริงการสืบค้นต่อไปนี้ (ตัวอย่าง): param1=111&param2=222&param3=333

  3. เทมเพลตการแมปควรสร้างเอาต์พุต JSON ด้านล่างซึ่งเป็นอินพุตสำหรับฟังก์ชันแลมบ์ดาของคุณ

    {
    "queryStringParameters": {"param3":"333","param1":"111","param2":"222"}
    }
    
  4. คุณทำเสร็จแล้ว จากจุดนี้ตรรกะของฟังก์ชันแลมบ์ดาของคุณสามารถใช้พารามิเตอร์สตริงแบบสอบถาม
    โชคดี!


0

คุณสามารถใช้ Lambda เป็น"Lambda Proxy Integration"อ้างอิง [ https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda html # api-gateway-proxy-integration-lambda-function-python]ตัวเลือกที่มีอยู่ใน lambda นี้คือ

สำหรับ Nodejs Lambda 'event.headers', 'event.pathParameters', 'event.body', 'event.stageVariables' และ 'event.requestContext'

สำหรับเหตุการณ์ Python Lambda ['headers'] ['parametername'] เป็นต้น



-1

หลังจากอ่านคำตอบเหล่านี้หลายข้อฉันใช้การรวมกันของคำตอบหลายข้อในเดือน ส.ค. 2018 เพื่อเรียกค้นพารามิเตอร์ params ผ่าน lambda สำหรับ python 3.6

ก่อนอื่นฉันไปที่เกตเวย์ API -> API ของฉัน -> ทรัพยากร (ด้านซ้าย) -> คำขอการรวมระบบ application/jsonลงที่ด้านล่างให้เลือกทำแผนที่แม่แบบแล้วสำหรับประเภทเนื้อหาใส่

จากนั้นเลือกเทมเพลตคำขอ Passthrough ที่ Amazon จัดเตรียมและเลือกบันทึกและปรับใช้ API ของคุณ

จากนั้นในแลมบ์ดาevent['params']เป็นวิธีที่คุณเข้าถึงพารามิเตอร์ทั้งหมดของคุณ สำหรับสตริงการสืบค้น:event['params']['querystring']

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.