在jQuery.ajax中键入'application / json'

当我有这个代码

$.ajax({
    type: 'POST',
    //contentType: "application/json",
    url: 'http://localhost:16329/Hello',
    data: { name: 'norm' },
    dataType: 'json'
});

在提琴手我可以看到下面的原始请求

POST http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:14693/WebSite1/index.html
Content-Length: 9
Origin: http://localhost:14693
Pragma: no-cache
Cache-Control: no-cache

name=norm

但我想要的是将application / x-www-form-urlencoded中的 content-type设置为application / json 。 但是这个代码

$.ajax({
    type: "POST",
    contentType: "application/json",
    url: 'http://localhost:16329/Hello',
    data: { name: 'norm' },
    dataType: "json"
});

生成奇怪的请求(我可以在提琴手中看到)

OPTIONS http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: http://localhost:14693
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache

这是为什么? 什么是OPTIONS当它应该在那里? 我的内容类型设置为application / json的位置在哪里? 由于某种原因,请求参数已经消失。

更新1

在服务器端,我有非常简单的RESTful服务。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class RestfulService : IRestfulService
{
    [WebInvoke(
        Method = "POST",
        UriTemplate = "Hello",
        ResponseFormat = WebMessageFormat.Json)]
    public string HelloWorld(string name)
    {
        return "hello, " + name;
    }
}

但由于某些原因,我不能用参数调用这个方法。

更新2

对不起,没有回复这么久。

我已经将这些标题添加到我的服务器响应中

 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: Content-Type
 Access-Control-Allow-Methods: POST, GET, OPTIONS

它没有帮助,我有方法不允许服务器错误。

这是我的提琴手所说的

在这里输入图像描述

所以,现在我可以确定我的服务器接受POST,GET,OPTIONS(如果响应头像我期望的那样工作)。 但为什么“方法不允许”?

在服务器的WebView响应中(您可以在上图中看到Raw响应)看起来像这样

在这里输入图像描述


看起来,从url选项中删除http://可确保发送正确的HTTP POST标头。

我不认为你需要完全限定主机的名称,只需使用如下的相对URL即可。

   $.ajax({
      type: "POST",
      contentType: "application/json",
      url: '/Hello',
      data: { name: 'norm' },
      dataType: "json"
   });

我的一个例子是:

        $.ajax({
            type: "POST",
            url: siteRoot + "api/SpaceGame/AddPlayer",
            async: false,
            data: JSON.stringify({ Name: playersShip.name, Credits: playersShip.credits }),
            contentType: "application/json",
            complete: function (data) {
            console.log(data);
            wait = false;
        }
    });

可能相关:jQuery $ .ajax(),$ .post在Firefox中将“OPTIONS”作为REQUEST_METHOD发送

编辑:经过一些更多的研究后,我发现OPTIONS标题用于发现是否允许来自发起域的请求。 使用fiddler,我将以下内容添加到来自服务器的响应头文件中。

 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: Content-Type
 Access-Control-Allow-Methods: POST, GET, OPTIONS

一旦浏览器收到这个响应,它就会发送正确的POST请求和json数据。 似乎默认的表单urlencoded内容类型被认为是安全的,因此不会进行额外的跨域检查。

看起来您需要将前面提到的标题添加到服务器对OPTIONS请求的响应中。 您当然应该将它们配置为允许来自特定域的请求,而不是全部。

我用下面的jQuery来测试这个。

$.ajax({
   type: "POST",
   url: "http://myDomain.com/path/AddPlayer",
   data: JSON.stringify({
      Name: "Test",
       Credits: 0
   }),
   //contentType: "application/json",
   dataType: 'json',
   complete: function(data) {
       $("content").html(data);
  }
});​

参考文献:

  • http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
  • http://enable-cors.org/
  • https://developer.mozilla.org/en/http_access_control

  • 我可以告诉你我是如何使用它的

      function GetDenierValue() {
            var denierid = $("#productDenierid").val() == '' ? 0 : $("#productDenierid").val();
            var param = { 'productDenierid': denierid };
            $.ajax({
                url: "/Admin/ProductComposition/GetDenierValue",
                dataType: "json",
                contentType: "application/json;charset=utf-8",
                type: "POST",
                data: JSON.stringify(param),
                success: function (msg) {
                    if (msg != null) {
                        return msg.URL;
                    }
                }
            });
        }
    

    所以你需要做的就是增加:

    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    }
    

    作为您的发布请求的一个字段,它将起作用。

    链接地址: http://www.djcxy.com/p/8065.html

    上一篇: type to 'application/json' in jQuery.ajax

    下一篇: javascript and text/javascript content types