使用来自.NET服务的jQuery获取JSON数据:与ajax设置混淆

GSe*_*erg 6 jquery web-services .net-3.5

我刚刚花了六个小时试图把这个直接放在我脑海里,但我还没有成功.

我的本地机器上有一个HelloWorld .NET 3.5 Web服务.根据需要进行设置.
该服务返回一个List自定义结构.

我正在尝试使用jQuery 1.4.4来使用它.

当我尝试执行文档所说的内容时,我总是从服务中获取XML响应,该响应要么导致parseerrorjQuery ,要么作为哑字符串传递给success函数.也就是说,然而我结合dataTypeaccepts(其中,根据该文件,控制如何接收数据的处理),我得到一个XML回来.

但是,当我从文档中做一些逻辑上没有的事情时,我成功地获取了我的对象数组.也就是说,当我忽略dataTypeaccepts,并设置contentType: "application/json; charset=utf-8"相反,它工作正常.但是contentType,根据文档,控制发送到服务器的数据,而不是接收.


在代码中:

$.ajax(
  {
  type: "GET",
  url: "http://localhost:52624/Service1.asmx/HelloWorld",
  dataType: "json",
  //accepts can be anything, or it can be missing, doesn't matter, only depends on dataType
  success: function(data, textStatus, jqXHR) {...},
  error: function(jqXHR, textStatus, errorThrown) {...}
  }
)
Run Code Online (Sandbox Code Playgroud)

结果:错误处理程序调用,textStatus = parseerror.


$.ajax(
  {
  type: "GET",
  url: "http://localhost:52624/Service1.asmx/HelloWorld",
  dataType: "application/json",
  //accepts can be anything, or it can be missing, doesn't matter, only depends on dataType
  success: function(data, textStatus, jqXHR) {...},
  error: function(jqXHR, textStatus, errorThrown) {...}
  }
)
Run Code Online (Sandbox Code Playgroud)

结果:Web服务返回XML,它作为传递给成功处理程序string.


$.ajax(
  {
  type: "GET",
  url: "http://localhost:52624/Service1.asmx/HelloWorld",
  accepts: "json",  // or "application/json"
  success: function(data, textStatus, jqXHR) {...},
  error: function(jqXHR, textStatus, errorThrown) {...}
  }
)
Run Code Online (Sandbox Code Playgroud)

结果:Web服务返回XML,它被解析并作为传递IXMLDOMDocument2.


$.ajax(
  {
  type: "GET",
  url: "http://localhost:52624/Service1.asmx/HelloWorld",
  contentType: "application/json; charset=utf-8",
  success: function(data, textStatus, jqXHR) {...},
  error: function(jqXHR, textStatus, errorThrown) {...}
  }
)
Run Code Online (Sandbox Code Playgroud)

结果:Web服务返回JSON,它被jQuery部分解析(数字和字符串被解析为对象的属性,但是日期保持为形式"/Date(1303003305724)/").


问题:

  1. 我完全理解jQuery规范吗?为什么据说控制发送数据的参数实际上控制了接收数据?
  2. 我在做什么明显错误?
  3. 获取由jQuery解析日期的最后一步是什么?

GSe*_*erg 2

看来我要亲自回答这个问题了。
\n我并不是说以下内容是绝对真理。相反,这是我发现有效的方法。

\n\n
\n\n

首先,我找到了三篇文章,解释得很多:

\n\n\n\n

简而言之,.NET Web 服务的问题在于您必须以特殊方式调用它们:

\n\n
    \n
  • 使用 POST 请求(但见下文),以及
  • \n
  • 提供Content-Typeapplication/json; charset=utf-8
  • \n
\n\n

这是设计使然,也是出于安全原因。
\n后者可能无法避免,您必须提供该内容类型。由于内容类型确实规定了请求中参数的编码方式,因此您必须以 JSON 形式对参数进行编码。

\n\n

这就是 jQuery 发挥作用的地方。jQuery 会无缘无故地忽略contentType你的参数并将其编码为application/x-www-form-urlencoded. 此时,Web 服务将不喜欢您说“这里是 JSON”并提供表单编码的内容。

\n\n

在这些文章中,作者建议您使用 jQuery 将 JSON 数据括在另一对引号中,以便将其解释为字符串并且不会被 jQuery 弄乱:

\n\n
$.ajax({\n  type: "POST",\n  url: "ServiceName.asmx/WebMethodName",\n  data: "{\'fname\':\'dave\',\'lname\':\'ward\'}",\n  contentType: "application/json; charset=utf-8",\n  dataType: "json",\n  success: function(msg) {...}\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

这确实有效。

\n\n

另外,如果你没有任何数据,你仍然必须提供一个空的 JSON 对象,{}因为如果你不这样做,jQuery 将不会设置Content-Length,并且没有Content-LengthWeb 服务将再次不喜欢你(更多安全原因)。

\n\n
\n\n

然而。
\n自 FW 3.5 起,可以GET与支持 JSON 的 .NET 服务一起使用。此时您可能想知道 JSON 编码的参数如何与 GET 请求保持一致。就是这样。

\n\n

如果您的 Web 服务没有任何参数,则调用很简单:

\n\n
$.ajax(\n  {\n    type: "GET",\n    url: "ServiceName.asmx/WebMethodName",\n    contentType: "application/json; charset=utf-8",\n    dataType: "json",\n    success: function(data, textStatus, jqXHR) {...}\n  }\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

而且如果有参数的话,那么调用也简单。您所要做的就是在应该包含它们的参数周围提供额外的引号!这是因为您希望这些引号显示为表单编码请求的一部分。这样,表单编码的请求将看起来有点像 json 编码的请求:

\n\n
$.ajax(\n  {\n    type: "GET",\n    url: "ServiceName.asmx/WebMethodName",\n    contentType: "application/json; charset=utf-8",\n    data: {DatePlaced:\'"2011-05-13"\'},\n    dataType: "json",\n    success: function(data, textStatus, jqXHR) {...}\n  }\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

此请求将产生类似于以下内容的请求:

\n\n
\n

GET /ServiceName.asmx/WebMethodName?DatePlaced="2011-05-13" HTTP/1.1
\n 内容类型:application/json;字符集=utf-8

\n
\n\n

请注意类似 JSON 的 GET 请求所需的引号,但如果您打算请求 XML,则会导致错误。

\n