具有JSON参数和查询字符串

时间:2016-03-22 14:24:56

标签: javascript angularjs json ajax http

正如标题所示,我试图使用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***"

2 个答案:

答案 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函数正在改变内容类型!在有条件的情况下包裹,现在好了。感谢所有帮助我的人确保我的代码写得正确!