当前位置: 首页 > 知识库问答 >
问题:

Web Api、ajax和内容类型

聂昱
2023-03-14

我想更好地了解一下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"})时会出现错误,但当我删除内容类型并在数据选项中发送对象时它会起作用。

共有2个答案

颛孙信厚
2023-03-14

您遇到的问题似乎是jQuery飞行前的问题。

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

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

您需要添加一个函数,该函数响应[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;

}

希望这对你有帮助。

富凯风
2023-03-14

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

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

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

你的方法是:

public HttpResponseMessage Post(TestForm form)

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

 类似资料:
  • 我想要得到一个漂亮而简单的带有设置状态代码的API,并获得swagger(swashbuckle)的文档 首先,我的控制器是这样的: 很好,Swagger显示了JSON格式的结果。问题是,我不能设置状态代码(比如,如果database-error我可以设置为err500或s.th.)。 null null 现在,状态代码设置正确,但swagger没有显示任何结果。 所以,我想这可能是个大摇大摆的问

  • POST请求中的内容类型和数据类型是什么?假设我有这个: 是我们发送的吗?那么我们在上面的例子中发送的是JSON,而我们收到的是纯文本?我真的不明白。

  • 我试图模仿我的浏览器行为在一个多部分/表单数据POST请求使用org.apache.http.entity.mime.MultipartEntityBuilder 我的浏览器只发送内容配置,但不发送内容类型或内容传输编码头。我尝试使用MultipartEntityBuilder。addPart()和addTextBody()但默认情况下都会添加这些标题: 我想要什么(我的chrome浏览器的功能)

  • 要允许您传播关于已生成消息的内容类型的信息,默认情况下,Spring Cloud Stream附加contentType标头到出站消息。对于不直接支持头文件的中间件,Spring Cloud Stream提供了自己的自动将邮件包裹在自己的信封中的机制。对于支持头文件的中间件,Spring Cloud Stream应用程序可以从非Spring Cloud Stream应用程序接收具有给定内容类型的消

  • 下面是我的Ajax请求: 如果我没有精确的内容类型,我就无法再看到Firebug的请求。相反,当我添加内容类型时,我可以看到POST请求(由于我的URL是false而出现错误),但在我的头中,内容类型默认是URL编码的表单。 我想要的是通过JSON数据发送表单的详细信息。谢谢你的帮助

  • 我正在使用axios@0.21.1我想验证响应头。我无法从GET响应验证标题“内容类型”和“内容编码”。 “内容类型”:无论我在请求中传递什么内容类型,响应中的内容类型始终是application/JSON。示例代码段: 当我检查回复时。我看到内容类型显示为“application/json”,而不是自定义类型。但当我在《邮递员》中点击相同的url时,我可以看到内容类型和预期的一样。 任何帮助都是