【问题标题】:Publish data from browser app without writing my own server从浏览器应用程序发布数据而无需编写我自己的服务器
【发布时间】:2012-11-02 09:36:05
【问题描述】:

我需要用户能够从单页浏览器应用程序 (SPA) 向我发布数据,但我不能将服务器端代码放在主机上。

有没有我可以使用的网络服务?我查看了Amazon SQS(简单队列服务),但我无法从浏览器due to cross origin policy 中调用他们的REST API。

我现在更喜欢易于开发而不是健壮性,因此即使只是收到一封电子邮件也可以。我不确定该网站是否会流行起来。如果是这样,那么我将开发一个服务器端组件并移动主机。

【问题讨论】:

  • 我不知道AWS和SQS之间的关系,但是亚马逊announced in August那个AWSnow supports CORS,这意味着你至少可以用一些AWS服务做跨域Ajax请求。
  • @apsillers,感谢您提供的信息,但我看不到任何表明它适用于 SQS 的信息。我会继续寻找,如果我找到它会告诉你的。
  • 您说您无权访问主机上的代码。是因为主机不属于您还是您只是不想编写服务器代码?如果是后一种情况,您可能应该对 nodejs/express 感兴趣。我使用这两个非常简单的 jsonp 实现。如果您愿意,我可以为您提供代码示例。
  • 为@op1ekun 的提议干杯,我很感激。我之前用 Node/express 做过一些工作,是的,它非常好用而且很简单。我真的只是想知道是否可以在不需要自定义服务器代码的情况下从 SPA 获取通用数据给站点管理员。
  • 这似乎得到了很好的支持。在这里阅读docs.aws.amazon.com/AWSSimpleQueueService/latest/…

标签: javascript web-services single-page-application


【解决方案1】:

不仅有 Web 服务,而且现在有强大的系统提供了一种方法,可以在您的应用程序上实现服务器端的某些逻辑。它们被称为 BaaS 或 Backend as a Service 提供程序,通常为您的前端应用程序提供一些主干。

虽然它们有多种用途,但我将列出我认为最常见的:

  • 对于移动应用程序 - 您可以使用标准平台为您的应用程序存储逻辑和数据,而不必为您编写代码的每个设备学习 API。

  • 用于原型设计 - 如果您想创建一个流畅的应用程序,但又不想为数据编写所有后端逻辑 - 更少处理所有操作和系统管理这代表 - 通过 BaaS 提供商,您只需要良好的前端技能即可编写您可以想象的最简单的 CRUD 应用程序。一些 BaaS 甚至允许您绑定一些 Reduce algorithms 以调用您的表演到他们的 API。

  • Web 应用程序 - 当 PaaS (Platform as a Service) 来到镇上为后端开发人员减轻工作以避免系统管理和操作的麻烦时,它只是后端也会发生同样的情况。有很多clones 展示了这种策略的真正威力。

所有这些都令人惊叹,但我还没有提及其中任何一个。我将列出我最了解并在项目中实际使用过的那些。可能有很多,但据我所知,这一条已经满足了我的大部分新闻,无论是前面提到的任何一条。

Parse.com

Parse 最突出的功能针对移动设备;然而,如今 Parse 包含数量惊人的 API,可让您将其用作 Javascript、Android 甚至 Windows 8 应用程序的全功能后端服务(今年几个月前,Windows 8 SDK 为 introduced)。

解析代码在 Javascript 中的外观如何?

解析通过类和对象工作(不是很漂亮吗?),因此您首先创建一个特定的类(可以通过 Javascript、REST 甚至数据浏览器管理器完成),然后将对象添加到特定的类。

首先,在javascript中添加Parse作为脚本标签:

<script type="text/javascript" src="http://www.parsecdn.com/js/parse-1.1.15.min.js"></script>

然后,通过给定的 Application ID 和 Javascript Key,初始化 Parse。

Parse.initialize("APPLICATION_ID", "JAVASCRIPT_KEY");

从那里开始,一切都是对象操作

var Person = Parse.Object.extend("Person"); //Person is a class  *cof* uppercase *cof* 
var personObject = new Person();
  personObject.save({name: "John"}, {
  success: function(object) {
    console.log("The object with the data "+ JSON.stringify(object) + " was saved successfully.");
  },
  error: function(model, error) {
    console.log("There was an error! The following model and error object were provided by the Server");
    console.log(model);
    console.log(error);
  }
});

身份验证和安全性如何?

Parse 有一个基于用户的身份验证系统,它几乎允许您存储可以操作数据的用户群。如果将数据与用户信息进行映射,则可以确保只有给定用户才能操作特定数据。此外,在 Parse 应用程序的设置中,您可以指定不允许任何客户端创建类,以确保执行不必要的调用。

你真的在网络应用程序中使用过吗?

是的,它是我选择的中等保真度工具prototype

Firebase.com

Firebase 的主要功能是能够轻松地为您的应用程序提供实时功能。您不需要MeteorJS 服务器即可将推送通知引入您的软件。如果您了解 Javascript,那么您就已经为您的用户带来了实时魔法。

Firebase 在 Javascript 中的外观如何?

Firebase 以 REST 方式工作,我认为他们在构建 Glory of REST 方面做得非常出色。作为一个很好的示例,请查看 Firebase 中的以下资源结构:

https://SampleChat.firebaseIO-demo.com/users/fred/name/first

你不需要成为火箭科学家就知道你正在检索用户“Fred”的名字,至少有一个 - 通常应该有一个 UUID 而不是一个名字,但是嘿,它是举个例子,让我休息一下-。

为了开始使用 Firebase,就像 Parse 一样,添加他们的 CDN Javascript

<script type='text/javascript' src='https://cdn.firebase.com/v0/firebase.js'></script>

现在,创建一个允许您使用 Firebase API 的引用对象

var myRootRef = new Firebase('https://myprojectname.firebaseIO-demo.com/');

从那里,您可以创建一堆整洁的应用程序。

var USERS_LOCATION = 'https://SampleChat.firebaseIO-demo.com/users';
var userId = "Fred"; // Username

var usersRef = new Firebase(USERS_LOCATION);
  usersRef.child(userId).once('value', function(snapshot) {
    var exists = (snapshot.val() !== null);
    if (exists) {
        console.log("Username "+userId+" is part of our database");
    } else {
        console.log("We have no register of the username "+userId);
    }
  });

身份验证和安全性如何?

你很幸运! Firebase released their Security API 大约两周前!我还没有探索它,但我确信它填补了大部分空白,让随机的人可以将您的参考用于他们自己的目的。

你真的在网络应用程序中使用过吗?

Eeehm...好吧,不。我在Chrome Extension 中使用过它!它仍在进行中,但它将成为 Chrome 扩展程序中的实时聊天。那不是很酷吗?美好的。我觉得很酷。无论如何,您可以在他们的examples page 中浏览更多精彩的 Firebase 示例。


这些服务有什么魔力?如果您阅读了您的Dependency InjectionMock Object Testing,在某个时候,您可以通过 REST Web 服务提供者完全替换所有这些服务。

由于这些服务是为在任何应用程序中使用而创建的,因此它们已准备好 CORS。如前所述,我已经成功地从多个域中使用了它们,没有任何问题(我什至尝试在 Chrome 扩展程序中使用 Firebase,我相信我很快就会成功)。

Parse 和 Firebase 都有数据浏览器管理器,这意味着您可以通过简单的网络浏览器查看正在处理的数据。作为最后的免责声明,除了James Taplin(Firebase 联合创始人)令人惊叹的面孔让我能够获得 Firebase 的一些 Beta 访问权限之外,我与任何这些服务都没有任何关系。

【讨论】:

  • 这是一个很好的答案。非常感谢。我将在新的一年(现在只有几天了)重新审视这个问题,我会告诉你我的进展情况。
  • 很高兴它有帮助,同时享受假期:)
【解决方案2】:

您实际上可以从浏览器使用 SQS,即使没有 CORS,只要您只需要浏览器发送消息,而不需要接收它们。 警告:这是一个会让我的 CS 教授哭泣的组合。

当您通过 javascript 执行 GET 请求时,浏览器将始终执行该请求,但是,您只能访问来自同一来源(协议、主机、端口)的响应。这是你的车票,因为消息可以通过 GET 发布到 SQS 队列,而且谁真正关心响应呢?

假设您使用的是 jquery,您的队列是 https://sqs.us-east-1.amazonaws.com/71717171/myqueue,并且允许任何人发布消息,以下将向队列发布正文为“HITHERE”的消息:

$.ajax({
  url: 'https://sqs.us-east-1.amazonaws.com/71717171/myqueue' +
       '?Action=SendMessage' +
       '&Version=2012-11-05' +
       '&MessageBody=HITHERE'
})

控制台中会出现错误提示请求失败,但消息仍会显示在队列中。

【讨论】:

    【解决方案3】:

    你考虑过JSONP吗?这是从 javascript 调用跨域脚本而不会遇到同源策略的一种方法。不过,您将必须在某处设置一些脚本来向您发送数据。 Javascript 无法胜任这项任务。

    【讨论】:

    • 问题在于 Amazon SQS 似乎不支持 JSONP 工作所需的回调参数。
    【解决方案4】:

    根据您要发送的数据类型以及您要处理的数据,解决此问题的一种方法是使用 Ajax 将数据发布到 Google 电子表格。不过完成起来有点棘手。Here 是关于它的另一个 stackoverflow 问题。

    如果演示文稿不是那么重要,您可以嵌入一个 Google Spreadsheet Form

    【讨论】:

    • 感谢您的回答。这听起来可能会奏效,尽管我有几天没有机会对其进行测试。我的数据的一部分也是一个大(几 MB)图像,可以是二进制或 base64 PNG 编码。不确定 Google 电子表格是否允许大量数据。
    • 为了完整起见,这里是电子表格 API 的链接:developers.google.com/google-apps/spreadsheets
    • 似乎此选项需要在网页中提供身份验证详细信息才能调用服务器。这将允许任何人完全访问数据存储,这不是一个选项。我需要未经身份验证的写入和经过身份验证的读取。
    【解决方案5】:

    mailto:youremail@goeshere.com 呢?嘻嘻

    同时,您可以打开一些免费托管服务,例如 AltervistaHeroku 或其他类似的东西 .. 这样您就可以连接到他们的服务器,如果我记得这些免费服务允许 servers p2p,所以 you can create a sort of personal web services and push ajax requests as well ,显然他们的服务器对于免费帐户来说很慢,但我认为如果您没有那么多用户流量就足够了,否则您应该打开一些更好的 VPS 或托管或云解决方案。

    【讨论】:

    • Mailto 链接不能提供最佳体验,我可能需要发送很长的 base64 编码图像数据电子邮件正文。
    • 我现在正在努力避免需要考虑托管。该网站在其他方面非常简单,所以看起来有点矫枉过正。如果不存在这样的服务,它可能会成为一个不错的产品。
    • @DrewNoakes 是的,没错,pusher[dot]com 看起来你可以试试
    【解决方案6】:

    也许 CouchDB 可以提供您所追求的。 IrisCouch 提供免费的 CouchDB 实例。将其锁定,以便用户无法查看文档并具有合理的验证功能,并且您拥有一个简单的 RESTful 位置来存储您的数据。

    【讨论】:

    • 是否可以从浏览器中将数据发送到他们的免费数据库实例?你试过这个吗?
    • 是的,它是一个完整的 CouchDB。使用普通的 CouchDB API 或更新函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2021-03-30
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多