我想更好地了解一下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"})
时会出现错误,但当我删除内容类型并在数据选项中发送对象时它会起作用。
您遇到的问题似乎是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;
}
希望这对你有帮助。
简短的回答在于这些警报的输出:
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时,我可以看到内容类型和预期的一样。 任何帮助都是