如何使用 AWS API Gateway Http 发布数据


How to post data using AWS API Gateway Http?

我正在使用 AWS API Gateway。我想将数据发布到驻留在服务器目录中的控制器。我创建了一个具有开发资源和 POST 方法的 API。我还添加了 OPTIONS 方法来添加标题。

我正在使用 ajax 将请求数据发送到控制器。数据始终为空。控制器在 CakePHP 中

我正在调用的函数是

function webservice() {
    if(empty($this->data['username'])){
        echo json_encode("Data is Empty");
    }
    else{
        $username = $this->data['username'];
        $password = $this->data['password'];
        $deviceType =  $this->data['deviceType'];
        $token =  $this->data['token'];
        $conditions=  array('username' => $username,
                            'password' => $password,
                            'token' => $token,
                            'deviceType' => $deviceType
                            );
               echo json_encode($conditions);
    }
   exit();
    }

Ajax 调用是 :

var username = "dummydata";
var password = "dummydata";
var deviceType = "dummydata"
var token = "dummydata";
alert(username + password + token);
    $.ajax(
    {
    type : "POST",
    url : "https://xxxxxxxxxx.execute-api.ap-southeast-1.amazonaws.com/dev/webserv",
    data: "{username : username, password: password, token: token, deviceType: deviceType}",
    success : function(result){
         alert((result));
    }
    });

如何使用 AWS API 网关在控制器中从 AJAX 接收已发布的数据?

首先,您需要提供到 API 网关的映射模板,以允许它将请求数据映射到您的 Lambda 函数调用。其次,请注意在映射模板上设置的"内容类型",并在 AJAX 调用中设置相同的内容类型,以便触发该模板的使用。

例如,如果在 API Gateway 中将内容类型设置为"application/json",则可以在 jQuery AJAX 调用上设置此属性:contentType: "application/json"

至于映射模板

,我发现最简单的方法是使用始终映射传入请求中所有内容的模板。我使用这个模板,取自这个答案:

{
  "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
  }  
}