如何以与JSFiddle类似的方式允许共享?

时间:2014-12-10 05:08:14

标签: javascript angularjs

我正在开发一个小应用程序,我想让用户能够与他人分享。但是,使用AngularJS,整个应用程序在客户端运行。无法访问服务器(我需要)。

具体来说,有一个角度对象是共享配置的组成部分。有没有办法可以将这个对象完全变成一个字符串或者什么东西,允许我从所述字符串重新构建对象?

换句话说,我的(数组)对象如下所示:

// 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中重新构建相同的对象?我该如何重建它?

2 个答案:

答案 0 :(得分:1)

基于以下SO答案: https://stackoverflow.com/a/3776796/648350(它提到了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'd字符串长度大得多。


我倾向于认为JSFiddle的共享方式是生成UUID(请参阅此答案https://stackoverflow.com/a/105074/648350),然后将数据存储在数据库中。这个UUID可能只是为了阻止刮刀简单地增加一个数字并锤击他们的系统,如果他们只是在url字符串中使用数据库行id。但如果我提供

,这不会是 js解决方案

答案 1 :(得分:1)

将其变为字符串并将其编码为base 64字符串 webtoolkit base 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);