我正在接受this guide并试图从谷歌api获得一个acc令牌。我alredy得到了一个身份验证代码。所以我正在使用angularjs将httprequest发送到谷歌服务器。问题是我总是得到不好的请求答案。这是我的代码:
$http({
method: 'POST',
url: 'https://accounts.google.com/o/oauth2/token',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
params : {
code : '4/heMv6ozWwCxS5RyTzCgThAgxvRyk.oske-bNEGOUTOl05ti8ZT3YnwwH8iQI',
client_id : GoogleAppInfo.clientId,
redirect_uri : GoogleAppInfo.redirect_uri,
client_secret : GoogleAppInfo.client_secret,
grant_type : 'authorization_code'
},
data :'Demo' //just data to apply the heaser
}).
success(function(data, status, headers, config) {
alert('secsses');
}).
error(function(data, status, headers, config) {
alert('error');
});
我用PostMan chorme addon来测试我的参数,它正在研究邮递员。 那里的错误是因为此请求的authcode已过期,但它正在工作!
有人对这个问题很不满意吗? 非常感谢!!
答案 0 :(得分:1)
我认为如果你要比较由角度生成的结果请求和邮递员发送的请求,你会发现这里的差异。 (查看提琴手以实现此目的)。
对象将您传递的对象映射为' params'被映射到查询字符串参数,但谷歌期望请求正文中的这些数据。为此,请将此设置为“数据”。参数。但是默认情况下,angular会将其作为json发送,因此我们需要在发布之前对其进行转换。这就是transformRequest函数的目的。 (有关解释,请参阅this link)
请参阅下面的重写代码。
$http({
method: 'POST',
url: 'https://accounts.google.com/o/oauth2/token',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: {
code : '4/heMv6ozWwCxS5RyTzCgThAgxvRyk.oske bNEGOUTOl05ti8ZT3YnwwH8iQI',
client_id : GoogleAppInfo.clientId,
redirect_uri : GoogleAppInfo.redirect_uri,
client_secret : GoogleAppInfo.client_secret,
grant_type : 'authorization_code'
}
transformRequest: function(data) {
var buffer = [];
for ( var name in data ) {
if ( ! data.hasOwnProperty( name ) ) {
continue;
}
var value = data[ name ];
buffer.push(
encodeURIComponent( name ) +
"=" +
encodeURIComponent( ( value == null ) ? "" : value )
);
}
var source = buffer
.join( "&" )
.replace( /%20/g, "+" );
return source;
}
})