Angularjs 和 JQuery 中的不同 headers,同时发布到 Web Api
Different headers in Angularjs and JQuery, while POSTing to Web Api
我正在开发一个用于上传多张照片的小程序,使用服务器端的 Asp.Net Web Api 2 和客户端的 Angularjs。一路上的某个地方,我遇到了一段 JQuery 代码,它工作得很好,但是当我简单地使用 Angularjs 编写完全相同的东西时,从服务器端的角度来看,它的行为不同。以下是对所发生情况的完整描述:因此,以下代码显示了网络 api 片段:
public async Task<string> PostAsync()
{
List<string> str = new List<string>();
if (Request.Content.IsMimeMultipartContent())
{
// CASE 1...
}
else
{
// CASE 2...
}
return str;
}
如您所见,if 语句将给我带来麻烦的两种情况分开了。现在在客户端,如果我使用以下 JQuery 片段并访问网络 api 代码,它总是 [成功] 以案例 1 结束:
var data = new FormData();
for (i = 0; i < files.length; i++) {
data.append("file" + i, files[i]);
}
$.ajax({
type: "POST",
url: scope.serviceBase + "api/Property/PostAsync",
contentType: false,
processData: false,
data: data,
success: function (response) {
alert(response);
},
error: function () {
alert("Error while invoking the Web API");
}
});
但是如果我使用相同的 Angularjs 方式编写该代码,它总是以 CASE 2 结束,这基本上是一个失败:
var data = new FormData();
for (i = 0; i < files.length; i++) {
data.append("file" + i, files[i]);
}
http.post(scope.serviceBase + 'api/Property/PostAsync', data, { headers: {'Content-Type':'multipart/form-data'} }).success(function (response) {
alert(response);
})
.error(function (response) {
alert(response);
});
现在我在网络 api 端使用项目符号注意到,发送到服务器的 "content-type" 属性在 jquery 和 angular代码。 JQuery 自动添加 "content-type multipart/form-data boundary=blahblahblah..." header 而 angularJS 不会。
你能帮我理解那部分是什么以及为什么要添加它,还有我如何才能 Angularjs 发送正确的请求以便我的服务器端代码可以在案例 1 中结束?
AngularJS 默认会尝试将您的 FormData
object 转换为 JSON(参见 https://code.angularjs.org/1.4.4/docs/api/ng/service/$http#transforming-requests-and-responses). You can override this by supplying transformRequest: angular.identity
in the options parameter (see https://code.angularjs.org/1.4.4/docs/api/ng/function/angular.identity)。
我不确定为什么在这种情况下将 'Content-Type'
header 显式设置为 "multipart/form-data"
不起作用,但它看起来像是覆盖 Angular 的按照 https://code.angularjs.org/1.4.4/docs/api/ng/service/$http#setting-http-headers 中的建议,将 "application/json"
默认设置为 undefined
就可以了。
总而言之,请尝试以下操作:
$http.post(scope.serviceBase + 'api/Property/PostAsync', data,
{ transformRequest: angular.identity, headers: {'Content-Type':undefined} })
我正在开发一个用于上传多张照片的小程序,使用服务器端的 Asp.Net Web Api 2 和客户端的 Angularjs。一路上的某个地方,我遇到了一段 JQuery 代码,它工作得很好,但是当我简单地使用 Angularjs 编写完全相同的东西时,从服务器端的角度来看,它的行为不同。以下是对所发生情况的完整描述:因此,以下代码显示了网络 api 片段:
public async Task<string> PostAsync()
{
List<string> str = new List<string>();
if (Request.Content.IsMimeMultipartContent())
{
// CASE 1...
}
else
{
// CASE 2...
}
return str;
}
如您所见,if 语句将给我带来麻烦的两种情况分开了。现在在客户端,如果我使用以下 JQuery 片段并访问网络 api 代码,它总是 [成功] 以案例 1 结束:
var data = new FormData();
for (i = 0; i < files.length; i++) {
data.append("file" + i, files[i]);
}
$.ajax({
type: "POST",
url: scope.serviceBase + "api/Property/PostAsync",
contentType: false,
processData: false,
data: data,
success: function (response) {
alert(response);
},
error: function () {
alert("Error while invoking the Web API");
}
});
但是如果我使用相同的 Angularjs 方式编写该代码,它总是以 CASE 2 结束,这基本上是一个失败:
var data = new FormData();
for (i = 0; i < files.length; i++) {
data.append("file" + i, files[i]);
}
http.post(scope.serviceBase + 'api/Property/PostAsync', data, { headers: {'Content-Type':'multipart/form-data'} }).success(function (response) {
alert(response);
})
.error(function (response) {
alert(response);
});
现在我在网络 api 端使用项目符号注意到,发送到服务器的 "content-type" 属性在 jquery 和 angular代码。 JQuery 自动添加 "content-type multipart/form-data boundary=blahblahblah..." header 而 angularJS 不会。
你能帮我理解那部分是什么以及为什么要添加它,还有我如何才能 Angularjs 发送正确的请求以便我的服务器端代码可以在案例 1 中结束?
AngularJS 默认会尝试将您的 FormData
object 转换为 JSON(参见 https://code.angularjs.org/1.4.4/docs/api/ng/service/$http#transforming-requests-and-responses). You can override this by supplying transformRequest: angular.identity
in the options parameter (see https://code.angularjs.org/1.4.4/docs/api/ng/function/angular.identity)。
我不确定为什么在这种情况下将 'Content-Type'
header 显式设置为 "multipart/form-data"
不起作用,但它看起来像是覆盖 Angular 的按照 https://code.angularjs.org/1.4.4/docs/api/ng/service/$http#setting-http-headers 中的建议,将 "application/json"
默认设置为 undefined
就可以了。
总而言之,请尝试以下操作:
$http.post(scope.serviceBase + 'api/Property/PostAsync', data,
{ transformRequest: angular.identity, headers: {'Content-Type':undefined} })