我正在使用谷歌自定义搜索API来搜索angular.js项目中的图像。
这是我的代码:
var photosPublic = $resource('https://www.googleapis.com/customsearch/v1',
{ key: '..........ZDtw95C0V98ne4S39SPFi68', cx: '..........75325342:1ttvll7gahc' },
{ searchType:'image' });
return {
search: function(query) {
var q = $q.defer();
photosPublic.get({
q: query
}, function(resp) {
q.resolve(resp);
}, function(err) {
console.log(err);
q.reject(err);
})
return q.promise;
}
}
如果我直接在浏览器中输入url和所有凭据,它的工作原理非常好。但当我在我的项目中包含这个时,我收到以下回复:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
我做错了什么?
答案 0 :(得分:0)
我遇到了同样的问题,并想在这里分享我的解决方案,因为我在Google搜索中偶然发现了这里。
当您在请求库中设置一些默认授权标头,例如$resource
或axios
等时,就会出现问题。
当您在发送给Google自定义搜索api的请求中提供授权标头时,Google服务器试图使用此标头对您进行授权,甚至没有尝试使用给定的key
对您进行授权,并且cx
。
我对$ resource不太了解(也许其他人可以添加一些代码?),但是我有axios的解决方案:
import axios from 'axios'
export default {
url: 'https://www.googleapis.com/customsearch/v1',
http: axios.create(),
search(text) {
this.http.defaults.headers.common = {};
const key = process.env.GOOGLE_SEARCH_API_KEY
const cx = process.env.GOOGLE_SEARCH_SCOPE_ID
return this.http.get(this.url, {
params: {
q: text,
cx,
key
}
})
}
}
这将为搜索api创建一个自己的axios实例并重置标头。另外:您的全局axios实例不受影响(也许与后端通信需要您的Auth标头)。