正如标题所示,我试图使用Angular的$ http对象编写一个AJAX调用。我想发送一个在请求正文中提交JSON的帖子请求,但也有一个附加到URL的查询字符串。在阅读了$ http的文档后,在SO上搜索答案,并尝试了几种不同的配置,我仍然不清楚如何正确传递参数。目前,我的API响应空JSON或错误请求(400)。
代码
function inviteStaff (json) {
authToken = service.getAuthToken();
return $http({
method: 'POST',
url: baseUrl + '/invitations' + '?authToken=' + authToken,
data: JSON.stringify(json),
headers: {
'Content-type': 'application/json'
}
});
}
消费功能
self.invite = function ($form) {
self.showLoader = true;
InvitesService.inviteStaff($scope.inviteModel).then(function () {
$form.$setPristine();
$scope.inviteModel.timestamp = new Date();
$scope.invites.unshift($scope.inviteModel);
$scope.inviteModel = self.createNewInvite();
self.showLoader = false;
},
function () {
self.showLoader = false;
});
};
请求记录
data: "authToken=********&t=*****" // this is weird because it adds another "t" parameter to this query string here
headers: Object
Accept: "application/json"
Accept-Language: "en"
Content-type: "application/json"
authToken: "*********" // just the token here
__proto__: Object
method: "POST"
params: Object
timeout: Object
transformRequest: Array[1]
transformResponse: Array[1]
url: "http://****.****.com:****/doctors/invitations?authToken=*****"
__proto__: Object
Param JSON对象
{
accountType: "LEAD_DOCTOR",
firstName: "kraken",
lastName: "lastName",
email: "kraken@mail.com"
}
任何人都可以对这应该如何运作有所了解吗?我是否将json对象传递给数据或参数?我是否需要在数据字段上使用JSON.stringify?在某些情况下,我还看到人们将空字符串传递给数据。
我也一直在通过Charles Proxy运行它。我可以非常接近我想要的,但由于某种原因,JSON在JSON Text过滤器下显示为查询字符串,而不是JSON过滤器。
任何想法都会有所帮助。我将重构和升级它以使用$ resource工具,但我们正处于紧迫的截止日期,我只是想让它现在正常工作。如果您需要更多信息,请告诉我。
更新 我们使用swagger来记录我们的API,您实际上可以在他们的UI中点击端点。它生成以下CURL命令。我认为这可能有助于发现问题。
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{
\"firstName\": \"string\",
\"lastName\": \"string\",
\"email\": \"blah@mail.com\",
\"accountType\": \"CLIENT\"
}" "http://*****.****.com:****/doctors/invitations?authToken=***obfuscatedAuthToken***"
答案 0 :(得分:2)
我建议你利用标题字段:
function inviteStaff (json) {
authToken = service.getAuthToken();
return $http({
method: 'POST',
url: baseUrl + '/invitations',
data: JSON.stringify(json),
headers: {
'Content-type': 'application/json',
'authToken': authToken
}
});
}
然后在服务器端,询问当前请求authToken的标头值。
在网址中传递令牌有一些安全问题,供您阅读:https URL with token parameter : how secure is it?
答案 1 :(得分:0)
事实证明我们在代码库中的其他地方有一个HTTP Interceptor函数正在改变内容类型!在有条件的情况下包裹,现在好了。感谢所有帮助我的人确保我的代码写得正确!