Web Api、ajax 和内容类型

Posted

技术标签:

【中文标题】Web Api、ajax 和内容类型【英文标题】:Web Api, ajax and Content Type 【发布时间】:2018-08-16 22:16:51 【问题描述】:

我想更好地了解 Net 中的 WebApi 以及如何使用 ajax 调用它的正确方法。关于我的开发环境的信息很少:我正在使用 .net 4.0 和 Visual Studio 2010 和 Jquery。

型号:

public class TestForm

    public string FirstName  get; set; 

WebApi:

public class TestpController : ApiController

    [HttpPost]
    public HttpResponseMessage Post(TestForm form)
    
        string jose = "jose";
        return Request.CreateResponse(HttpStatusCode.OK, "yay");
    

客户端:

V1 (不起作用,返回错误 405)

$.ajax(
    url: "http://xxx/api/Testp",
    type: "POST",                   
    data: JSON.stringify( FirstName: "Jose" ),                
    dataType: 'json',
    contentType: "application/json; charset=utf-8",                                 
    success: function(data) 
        console.log("success");
    ,
    error: function (xhr, errorType, exception) 
        console.log("error");
    
);

V2 (有效)

$.ajax(
    url: "http://xxx/api/Testp",
    type: "POST",                   
    data:  FirstName: "Jose" ,                
    dataType: 'json',
    success: function(data) 
        console.log("success");
    ,
    error: function (xhr, errorType, exception) 
        console.log("error");
    
);

为什么我在添加contentType: "application/json; charset=utf-8" 并将数据更改为JSON.stringify( FirstName: "Jose" ) 时出现错误,但是当我删除内容类型并在数据选项中发送对象时它可以工作。

【问题讨论】:

【参考方案1】:

您遇到的问题似乎是 jQuery 预检。

如果您查看请求的标头,您会发现在 V1 中使用的 Http 方法实际上是 OPTIONS。这是因为 jQuery 只允许 Content-Type Header 的某些值。

@McBoman 在链接源中对此进行了很好的概述。您可能还想阅读跨域资源共享 (Cors),例如 this。

您需要添加一个函数来回答[HttpOptions],并明确告诉预检请求允许某个“自定义”标头,或者在跨域请求的情况下允许原始域。 您需要根据您的需要调整以下功能,获取预检提供的信息。

[HttpOptions]
public HttpResponseMessage Options() 

    var response = request.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("access-control-allow-origin", "*");
    response.Headers.Add("access-control-allow-headers", "content-type");
    return response;


希望对你有所帮助。

【讨论】:

【参考方案2】:

简短的答案在于这些警报的输出:

alert(JSON.stringify(FirstName :"Jose"));
alert(FirstName :"Jose");

第一个给你一个字符串,第二个给你一个对象。

你的方法:

public HttpResponseMessage Post(TestForm form)

接受一个对象而不是一个字符串。因此,当您发布字符串时,.NET Framework 无法找到可以处理字符串的方法,因此返回 405。

【讨论】:

以上是关于Web Api、ajax 和内容类型的主要内容,如果未能解决你的问题,请参考以下文章

带有 jsonp 内容类型的 jQuery.ajax 请求后的解析器错误

使用带有备用内容类型的 c# web api

Web API:无法序列化内容类型的响应正文

当内容类型为文本/纯文本时,.NET Core 1.0 Web Api 将请求正文处理为 JSON

Rest API 生成 PDF byte[] JSON 内容类型,使用 angularJS 在 Web 中查看

Web API对application/json内容类型的CORS支持