在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);
}
});
参考文献:
我可以告诉你我是如何使用它的
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