Javascript 从跨域AJAX请求返回字符串

Javascript 从跨域AJAX请求返回字符串,javascript,jquery,ajax,jsonp,Javascript,Jquery,Ajax,Jsonp,我正在寻找一种从跨域“AJAX”请求返回单个JSON/JSONP字符串的方法。我不希望请求字符串并让JQuery自动将其作为泛型对象返回,而是希望在转换发生之前获得字符串。这里的目标是自己解析它,这样我就可以直接将它转换为某种类型的新对象(例如Person对象) 所以,为了说明这一点,我不希望任何字符串到通用对象的转换在幕后进行,这必须使用不同的域才能工作 以下是我想做的一个非工作示例: $.ajax({ type: 'GET', url: 'http://www.someOth

我正在寻找一种从跨域“AJAX”请求返回单个JSON/JSONP字符串的方法。我不希望请求字符串并让JQuery自动将其作为泛型对象返回,而是希望在转换发生之前获得字符串。这里的目标是自己解析它,这样我就可以直接将它转换为某种类型的新对象(例如Person对象)

所以,为了说明这一点,我不希望任何字符串到通用对象的转换在幕后进行,这必须使用不同的域才能工作

以下是我想做的一个非工作示例:

$.ajax({
    type: 'GET',
    url: 'http://www.someOtherDomain.com/GetPerson',
    dataType: 'text',
    success: parseToPerson
});

function parseToPerson( textToParse ) {
    // I think I can do this part, I just want to get it working up to this point
}

如果JQuery不参与解决方案,我非常高兴,只要它能工作。不过,我更喜欢使用JQuery。据我所知,用于获取JSONP数据(动态创建脚本元素)的javascript技术可能会起作用,但我似乎无法让它对我起作用。我控制我请求数据的域,如果我将AJAX调用中的数据类型更改为“JSONP”,我就可以获得数据,所以我知道这是可行的。

不确定这将如何与JSONP协同工作,但也许这就是您想要的

$.ajax(url, {
  dataType: "person",
  converters: {
    "text person": function(textValue) {
      return parseToPerson(textValue);
    }
  }
});

如果您的数据是从另一个域检索的,您将需要使用JSONP(还有其他选项,但是如果您控制服务,JSONP是迄今为止最简单的)。jQuery调用如下所示:

$.ajax({
    // type: 'GET', --> this is the default, you don't need this line
    url: 'http://www.someOtherDomain.com/GetPerson',
    dataType: 'jsonp',
    success: parseToPerson
});
arbitrary_function_name("the string (or JSON data) that I want to return");
arbitrary_function_name({
    "name":"Bob Person", 
    "age":27, 
    "etc":"More data"
});
到您服务的实际请求将是
http://www.someOtherDomain.com/GetPerson?callback=arbitrary_function_name
。在服务端,您需要返回如下数据:

$.ajax({
    // type: 'GET', --> this is the default, you don't need this line
    url: 'http://www.someOtherDomain.com/GetPerson',
    dataType: 'jsonp',
    success: parseToPerson
});
arbitrary_function_name("the string (or JSON data) that I want to return");
arbitrary_function_name({
    "name":"Bob Person", 
    "age":27, 
    "etc":"More data"
});
因此,您需要检查querystring参数,获取
回调
参数的值,并将其作为调用具有该名称(您就是)的Javascript函数的方式进行回显,并通过服务传递您想要提供的值。然后,您的
success
函数将被调用,其中包含您的服务提供的数据

如果要将返回的数据反序列化为Javascript对象,最好返回JSON数据而不是字符串,因此服务返回的数据可能如下所示:

$.ajax({
    // type: 'GET', --> this is the default, you don't need this line
    url: 'http://www.someOtherDomain.com/GetPerson',
    dataType: 'jsonp',
    success: parseToPerson
});
arbitrary_function_name("the string (or JSON data) that I want to return");
arbitrary_function_name({
    "name":"Bob Person", 
    "age":27, 
    "etc":"More data"
});

这样,您就不必担心解析字符串了——它已经存在于一个Javascript对象中,可以很容易地用来初始化您的对象。

尝试了它,JQuery正在尝试使用XMLHttpRequest来获取数据。不幸的是,这不适用于来自另一个域的数据。谢谢你。还有其他想法吗?我设法让JSONP“请求”在不使用JQuery的情况下工作。该方法包括添加一个脚本标记,其中src指向发送回数据的url。除非我使用type=“application/x-javascript”,否则它不会对我起作用。这会立即运行它,因此在我做任何事情之前,数据会被创建为一个通用对象。那么,你是说我可以将服务中的数据序列化为JSON字符串,然后进一步以JSONP格式包装?我猜当它到达客户端时,它会给回调函数提供JSON字符串。这主意不错。我想我还可以选择发送一个非JSON字符串,这样我就可以在回调函数中使用eval来创建新的Person对象。我认为这将是一个更有效的解决方案,在速度和内存使用客户端。我想你已经找到了我的答案,我的朋友,谢谢你。@BDawg-当你使用JSONP时,你实际上是在运行你的服务返回的代码。因此,当您的服务发出
回调({“some”:“data})时,您不需要使用
eval
,则
success
函数实际上正在接收一个Javascript对象。因此,从理论上讲,您可以返回完整的Person对象,但是您最好通过返回数据并在客户端实例化Person来更好地分离关注点。@nrabinowitz-啊,这不是您的意思。不管怎样,我还是找到了答案。在本例中,JSONP代码将向回调函数而不是对象提供一个包含Javascript代码的字符串。因此,该服务将抛出类似的内容:
callback(“[newperson”(“John\”:“Doe\”)”)我不确定这是否被认为是一种不好的做法,但它确实回答了我关于这是如何可能的问题。@BDawg-好吧,如果你想这样做,你可以很容易地让服务代码做一些类似于
回调(新人(“John”,“Doe”))
-不需要序列化和反序列化字符串的额外步骤。但这使得服务与客户端代码紧密结合——让服务提供数据并让客户端代码创建对象要干净得多。@nrabinowitz-啊,说得好。这样我就不需要将它作为字符串发送到回调。您如何看待将其作为典型的JSON字符串发送,并使用正则表达式插入“newPerson”,对属性重新排序(以防万一),然后删除属性名?我认为,这样可以避免使用通用对象,避免服务和客户机过于紧密地耦合。它会更快和/或更轻的内存,还是只是一个不必要的步骤?