问题描述
我有一个基于Google Cloud Endpoints构建的API,并且在使用API的发现文档通过gapi.client加载端点时遇到了麻烦。 gapi.client库加载没有问题,但是我的API无法初始化,因为gapi.client尝试加载https://[PROJECT_ID].appspot.com/static/proxy.html
而不是https://[PROJECT_ID].appspot.com/_ah/api/static/proxy.html
。
我已经用https://apis.google.com/js/api.js
和https://apis.google.com/js/client.js
测试了以下代码,并且都产生了相同的结果。如果有人能解释这两个文件之间的区别,也将不胜感激。
以下是用于加载API的JavaScript(加载https://apis.google.com/js/api.js
后执行):
gapi.load('client',function() {
// executes.
console.log("client ready");
gapi.client.init({
discoveryDocs: ["url-path-to-discovery-doc-see-below"]
}).then(function(response) {
// never executed
console.log("load response",response);
if (listeners != null && 0 < listeners.length) {
for (let obj in listeners) {
const callback = obj.callback;
if (typeof callback == 'function') {
callback.call(obj.context);
}
}
}
}).catch(function(response) {
// never executed
console.log("init Failed",response);
});
});
then
和catch
回调永远不会执行,并且脚本会在尝试访问https://[PROJECT_ID].appspot.com/static/proxy.html?inconsequential-query-string
时引发404错误。
在浏览器中访问https://[PROJECT_ID].appspot.com/_ah/api/static/proxy.html
会按预期加载。
这是我的发现文档(使用endpoints-framework-maven-plugin
生成),[PROJECT_ID]
的实例已替换为实际的Google Cloud Project ID:
{
"auth": {
"oauth2": {
"scopes": {
"https://www.googleapis.com/auth/userinfo.email": {
"description": "View your email address"
}
}
}
},"basePath": "/_ah/api/myapi/v1/","baseUrl": "https://[PROJECT_ID].appspot.com/_ah/api/myapi/v1/","batchPath": "batch","description": "This is an API","discoveryVersion": "v1","icons": {
"x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png","x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
},"id": "auth:v1","kind": "discovery#restDescription","name": "myapi","parameters": {
"alt": {
"default": "json","description": "Data format for the response.","enum": [
"json"
],"enumDescriptions": [
"Responses with Content-Type of application/json"
],"location": "query","type": "string"
},"fields": {
"description": "Selector specifying which fields to include in a partial response.","key": {
"description": "API key. Your API key identifies your project and provides you with API access,quota,and reports. required unless you provide an OAuth 2.0 token.","oauth_token": {
"description": "OAuth 2.0 token for the current user.","prettyPrint": {
"default": "true","description": "Returns response with indentations and line breaks.","type": "boolean"
},"quotaUser": {
"description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user,but should not exceed 40 characters. Overrides userIp if both are provided.","userIp": {
"description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.","type": "string"
}
},"protocol": "rest","resources": {
"test": {
"methods": {
"get": {
"description": "Test endpoint GET method.","httpMethod": "GET","id": "myapi.test.get","parameterOrder": [
"message"
],"parameters": {
"message": {
"location": "query","required": true,"type": "string"
}
},"path": "test.get","response": {
"$ref": "Response"
},"scopes": [
"https://www.googleapis.com/auth/userinfo.email"
]
},"post": {
"description": "Test endpoint POST method.","httpMethod": "POST","id": "myapi.test.post","path": "test.post","scopes": [
"https://www.googleapis.com/auth/userinfo.email"
]
}
}
}
},"rootUrl": "https://[PROJECT_ID].appspot.com/_ah/api/","schemas": {
"Response": {
"id": "Response","properties": {
"message": {
"description": "","type": "string"
},"status": {
"description": "","type": "string"
}
},"type": "object"
}
},"servicePath": "myapi/v1/","title": "My Endpoints","version": "v1"
}
其他思想和笔记:
似乎需要在某个地方设置API“ root”(/ _ ah / api),但是我发现的所有文档似乎都显示了对设置root的支持。
API是用Java内置的,并利用了来自[Maven:com.google.endpoints:endpoints-framework:2.2.1]的Google Api批注。 @Api批注确实允许root
和backendRoot
字段,但两个字段均已弃用。
使用gapi.client.load加载时,API会按预期加载,但是根据documentation,不赞成使用此加载功能。
gapi.client.load('myapi','v1',function() {
console.log("myapi ready");
gapi.client.myapi.test.post({
message: "Hello,API!"
}).execute(function(response) {
// expected response from API.
console.log(response);
});
},'https://[PROJECT_ID].appspot.com/_ah/api');
非常感谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)