3

我一直在尝试使用 jQuery 和 Ajax 调用通过 JavaScript 与 Amazon DynamoDB 进行交互,但没有成功。经过两天的研究,我开始认为这可能是不可能的。我看到他们有适用于 Java、PHP 和 .Net 的 SDK,但还没有适用于 JavaScript 的 SDK。

亚马逊在此链接中解释了如何向发电机发送命令:

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/UsingJSON.html#JSONMajorExample

我已经能够使用 PHP sdk 和 node.js (https://github.com/xiepeng/dynamoDB) 做到这一点,但是使用常规的 javascript ajax 调用或 xmlHttpRequest 调用没有运气。

我已经能够获得有效的 aws 签名、秘密 ID 和会话令牌,因此我已将它们硬编码到标头中。

这是我的代码:

$.ajax({  
    beforeSend: function(xhr) {
                console.log("getting built");


                     xhr.setRequestHeader('host', 'dynamodb.us-east-1.amazonaws.com');
                 xhr.setRequestHeader('x-amz-date', 'Fri, 10 Feb 2012 20:44:00 GMT');
                 xhr.setRequestHeader('date', 'Fri, 10 Feb 2012 20:44:00 GMT');
                 xhr.setRequestHeader('x-amz-security-token', '**MYSECURITY TOKEN**');
                 xhr.setRequestHeader('x-amz-target', 'DynamoDB_20111205.PutItem');
                 xhr.setRequestHeader('content-type', 'application/x-amz-json-1.0');
                 xhr.setRequestHeader('content-length', 103);
                 xhr.setRequestHeader('x-amzn-authorization', 'AWS3 AWSAccessKeyId=**MY ACCESS KEY**,Algorithm=HmacSHA256,SignedHeaders=host;x-amz-date;x-amz-security-token;x-amz-target,Signature=**MY SIGNATIURE**=');


          },

    type: "POST",  
    url: "http://dynamodb.us-east-1.amazonaws.com",  
      dataType: "json",
    data: '{"TableName":"Sample","Item":{"RecordId":{"S":"white"},"Square":{"S":"teess"},"circle":{"S":"eeerer"}}}',
        error: function(XHR,textStatus,errorThrown) {
    //  alert ("XHR="+XHR+"\ntextStatus="+textStatus+"\nerrorThrown=" + errorThrown);
            console.log(XHR);
        console.log(textStatus);
          console.log(errorThrown);
        },

        success: function(data) { 
                console.log("success");
            }
        });

当我运行它时,我得到一个 404 Not found 错误,方法显示为“OPTIONS”(而不是 POST 或 GET)

4

2 回答 2

3

对 AWS Dynamo 不是很熟悉,但对 HTTP 和 XMLHttpRequest 很熟悉,Host不是可以通过 xhr 设置的标头。XHR 从请求的 url 中提取主机信息。不确定是否$.ajax会忽略您尝试设置该标题,但如果没有它,我会尝试。

另外,您如何计算内容长度?您的字符串有103字符,但不一定是 103 个字节(取决于编码、字符集等),这是如何Content-Length计算的。我也会在没有那个标题的情况下尝试它。

让我们知道怎么回事!

更新:

我认为自从微软为每个人做出决定以来,它已经成为 Ajax 的一部分的“同源策略”的受害者。:-) 您将不得不编写某种驻留在您的域中的服务器端代理,并向/从该代理发出 Ajax 请求。

你熟悉 PHP 吗?看起来 AWS 在 PHP 中有一个用于 DynamoDB 的库。

于 2012-02-11T06:32:56.887 回答
3

您正在尝试使用 AJAX 发出跨域请求。除非您的应用程序和服务都为其设置,否则这不一定有效。AWS 目前不允许通过 CORS 协议进行请求。您看到的 OPTIONS 标头是您的 JavaScript 向 AWS 发出飞行前 CORS 请求,但该请求被拒绝。您将需要使用服务器端代理(它使用 AWS 提供的开发工具包之一)来进行实际的服务调用。您的 JavaScript 可以通过 AJAX 与您的代理通信,因为它将托管在同一个域上。

于 2012-03-15T17:12:13.120 回答