使用JavaScript使用Amazon dynamoDB
我一直试图使用jQuery和Ajax调用通过JavaScript与AmazonDynamodb交互,但都失败了。经过两天的研究,我开始意识到这可能是不可能的。我看到他们有可用于Java、PHP和.Net的SDK,但还没有用于JavaScript的SDK Amazon在此链接中解释了如何向dynamo发送命令: 我已经能够通过PHPSDK和node.js实现这一点(https://github.com/xiepeng/dynamoDB),但常规的javascript ajax调用或xmlHttpRequest调用不会带来好运 我已经能够获得一个有效的aws签名、秘密id和会话令牌,所以我已经将它们硬编码到了头文件中 这是我的密码:使用JavaScript使用Amazon dynamoDB,javascript,jquery,amazon-dynamodb,Javascript,Jquery,Amazon Dynamodb,我一直试图使用jQuery和Ajax调用通过JavaScript与AmazonDynamodb交互,但都失败了。经过两天的研究,我开始意识到这可能是不可能的。我看到他们有可用于Java、PHP和.Net的SDK,但还没有用于JavaScript的SDK Amazon在此链接中解释了如何向dynamo发送命令: 我已经能够通过PHPSDK和node.js实现这一点(https://github.com/xiepeng/dynamoDB),但常规的javascript ajax调用或xmlHttp
$.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错误,方法显示为“选项”(与POST或get相反)不太熟悉AWS Dynamo,但非常熟悉HTTP和XMLHttpRequest,并且
主机
不是可以通过xhr设置的头。XHR从被请求的url中提取主机信息。不确定$.ajax
是否会忽略您是否尝试设置该标题,但我会尝试不设置该标题
另外,您如何计算内容长度?那里的字符串是103个字符,但不一定是103个字节(取决于编码、字符集等),这就是计算内容长度的方式。我也会在没有头球的情况下尝试
让我们知道进展如何
更新:
我认为是“同源策略”的受害者,自微软为所有人做出这一决定以来,该策略一直是Ajax的一部分。:-)您必须编写某种驻留在您的域上的服务器端代理,并向/从该代理发出Ajax请求
你熟悉PHP吗?看起来AWS在PHP中有一个DynamoDB库。您正在尝试使用AJAX进行跨域请求。除非您的应用程序和服务都为此进行了设置,否则这并不一定有效。AWS目前不允许通过CORS协议进行请求。您看到的选项标题是JavaScript向AWS发出飞行前CORS请求,该请求被拒绝。您需要使用服务器端代理(使用AWS提供的SDK之一)来进行实际的服务调用。您的JavaScript可以通过AJAX与您的代理对话,因为它将托管在同一个域上。让我来搞定。。。您想直接从UI调用DB而不进行任何服务器端验证吗?嗨,Benqus,谢谢您的回答。是的,我尝试在没有任何服务器端验证或服务器脚本(php、.net、ruby等)的情况下访问dynamodb。我想用javascript做任何事情。我真的不想让你失去动力,但这对我来说似乎很不安全。。。我不知道,也许我太谨慎了,但你不应该这么做……谢谢daniel0mullins,你是对的,“主机”可能不是我可以设置的属性,103是一个硬编码值。基本上,我所做的就是通过他们的PHPSDK调用amazon的api并查看标题。我在javascript调用中复制并粘贴(试图模拟)标题内容,但显然失败得很惨。这就是103的来源。我正试图直接从javascript生成一个httpRequest,用正确的头正确地点击dynamoDB api。再次感谢daniel。是的……我想我要求助于服务器端逻辑,我认为这是唯一的方法。我可能会用PHPSDK来做这件事,因为我在测试javascript的时候让它工作了,PHP会工作得很好,sdk很好,因为它可以为您处理请求签名。