Javascript 我如何以类似于JSFIDLE的方式允许共享?
我正在开发一个小应用程序,希望用户能够与他人共享。整个应用程序使用AngularJS在客户端运行。没有访问服务器的权限(我已经需要了) 具体来说,有一个角度对象是共享配置的一部分。有没有一种方法可以将这个对象完全转换成一个字符串,或者允许我从这个字符串重新构建对象 换句话说,我的(数组)对象如下所示:Javascript 我如何以类似于JSFIDLE的方式允许共享?,javascript,angularjs,Javascript,Angularjs,我正在开发一个小应用程序,希望用户能够与他人共享。整个应用程序使用AngularJS在客户端运行。没有访问服务器的权限(我已经需要了) 具体来说,有一个角度对象是共享配置的一部分。有没有一种方法可以将这个对象完全转换成一个字符串,或者允许我从这个字符串重新构建对象 换句话说,我的(数组)对象如下所示: // Variable number of objects stored in the array. 3 shown here. var arrayObj = [ {prop1: "somet
// Variable number of objects stored in the array. 3 shown here.
var arrayObj = [
{prop1: "something", prop2: "other", prop3: "other"},
{prop1: "something", prop2: "other", prop3: "other"},
{prop1: "something", prop2: "other", prop3: "other"}
]
我可以把整个数组对象转换成字符串,比如jn2340932rnxmclxm3290rj23ionqopdfsd923h413
,这样我就可以把它放到URL中:
http://mysite.me/jn2340932rnxmclxm3290rj23ionqopdfsd923h413
然后在JavaScript中重新构建相同的对象?如何重建它?基于以下答案: (它提到了atob和btoa的浏览器限制) 一旦字符串化,您可以使用base64对json对象进行编码和解码 你可以这样做:
extractObject = function(str){
return JSON.parse(atob(str));
}
makeShareableString = function(obj){
return btoa(JSON.stringify(obj));
}
var test = {"this":"that","foo":"bar"};
makeShareableString(test);
// returns "eyJ0aGlzIjoidGhhdCIsImZvbyI6ImJhciJ9"
extractObject("eyJ0aGlzIjoidGhhdCIsImZvbyI6ImJhciJ9");
// returns {"this":"that","foo":"bar"}
值得一提的是,base64编码的字符串几乎总是比JSON.stringify的字符串长度大很多
我倾向于认为,JSFIDLE实现共享的方式是生成UUID(参见此答案),然后将数据存储在数据库中。这个UUID可能只是为了阻止scraper在url字符串中使用数据库行id的情况下简单地增加一个数字并敲打他们的系统。但是,如果我提供将其转换为字符串并将其编码为以64为基数的字符串,那么这将不是一个纯粹的js解决方案 然后
var arrayObj = [
{prop1: "something", prop2: "other", prop3: "other"},
{prop1: "something", prop2: "other", prop3: "other"},
{prop1: "something", prop2: "other", prop3: "other"}
]
var str = JSON.stringify(arrayObj);
var encodeString = Base64.encode(str)
一旦发送,您可以将其解码回使用
Base64.decode(str);
您当然可以将对象编码为字符串,但它将是一个相当长的字符串,因此是一个非常可笑的URL,而这绝对不是JSFIDLE所做的。您的三个项目的示例数组是典型的,还是对象可以大得多?@nnnnnn:对象可以大得多。我正在考虑使用一个UUID和一个数据库来完成这项工作,正如公认的答案中所建议的那样。有什么输入吗?是的,我会这么做。你可以使用bitly或tinyurl这样的服务将长url转换为短url,而无需维护自己的数据库。许多这样的提供者提供了一个API。把它看作是8KB的自由状态存储……说我愿意放弃纯JS并考虑使用数据库。然后我可以将base64字符串存储在数据库中,与上面的UUID关联?这样做的后果是什么?就个人而言,我不想麻烦base64编码您的数据如果您最终要将其存储在数据库中,您可以使用
JSON.stringify
将数据转换为可存储的字符串。根据我的假设,UUID实际上只是为了阻止机器人通过增加一个数字来敲打页面。你可以很容易地使用“名称”、“slug”、“id”(“id”只是假设你不必担心机器人),只要它是唯一的,就像数据库中的键一样,并在你的url中使用它。(1/2)…(续2/2)使用angular,我将对JSON字符串执行AJAXPOST
,将其发送到服务器正在运行的任何体系结构上,并让它创建UUID,存储两者,然后返回UUID。在将任何内容返回到客户端之前,服务器需要生成并确认UUID的唯一性。当客户端接收到成功的返回时,我将重定向/更新url地址,以将UUID包含在您期望的结构中。然后向用户显示一些成功消息,内容已成功保存:)