我一直在使用App-Engine作为Android和iOS应用程序的后端。它本地开发服务器(通过http)和实际应用程序引擎(通过https)都没有问题。
然后我注意到,在重命名端点时,我不小心在端点的类名中复制了一个单词:RegionRegionIconsEndpoint
而不是简单地RegionIconsEndpoint
。这是1行修复。
public class RegionRegionIconsEndpoint {
@ApiMethod(name = "getRegionIcons", path="regionIcons", httpMethod = HttpMethod.POST)
public RegionInfoVersion.RegionIcons getRegionIcons(User user, @Named("id") String id)
throws OAuthRequestException {
...
}
}
成了
public class RegionIconsEndpoint {
@ApiMethod(name = "getRegionIcons", path="regionIcons", httpMethod = HttpMethod.POST)
public RegionInfoVersion.RegionIcons getRegionIcons(User user, @Named("id") String id)
throws OAuthRequestException {
...
}
}
我使用本地开发服务器生成了新的云端点库并继续开发。一切都好。
然而,当我将其部署到真正的App-Engine服务时,出现了一个问题。当我的应用程序启动时,会有一系列对其他端点的调用,如上所示;这些总是很好。然后调用此端点。典型的呼叫如下所示:
POST https://my-app.appspot.com/_ah/api/client/v1/regionIcons?id=foo
还提供授权,预期结果大部分时间都会回来......比如说80%。 AE日志看起来像这样:
2014-05-02 21:36:30.551 /_ah/spi/com.example.app.endpoints.RegionIconsEndpoint.getRegionIcons 200 48ms 0kb Google-HTTP-Java-Client/1.16.0-rc (gzip) module=default version=1
70.80.59.221 - - [02/May/2014:18:36:30 -0700] "POST /_ah/spi/com.example.app.endpoints.RegionIconsEndpoint.getRegionIcons HTTP/1.1" 200 149 - "Google-HTTP-Java-Client/1.16.0-rc (gzip)" "my-app.appspot.com" ms=49 cpu_ms=41 cpm_usd=0.000017 app_engine_release=1.9.4 instance=006c1b117c1b2d35341e0f407ae5785a825b65e5
剩下的时间,我得到404 Not Found
响应,AE日志有:
2014-05-02 21:36:30.852 /_ah/spi/BackendService.logMessages 204 16ms 0kb module=default version=1
10.1.0.41 - - [02/May/2014:18:36:30 -0700] "POST /_ah/spi/BackendService.logMessages HTTP/1.1" 204 0 - - "my-app.appspot.com" ms=16 cpu_ms=0 app_engine_release=1.9.4 instance=006c1b117c1b2d35341e0f407ae5785a825b65e5
E 2014-05-02 21:36:30.851
Request URL: https://my-app.appspot.com/_ah/api/client/v1/regionIcons?id=foo
Method: client.getRegionIcons
Error Code: 404
Reason: notFound
Message: service 'com.example.app.endpoints.RegionRegionIconsEndpoint' not found
2014-05-02 21:36:30.802 /_ah/spi/com.example.app.endpoints.RegionRegionIconsEndpoint.getRegionIcons 404 16ms 0kb Google-HTTP-Java-Client/1.16.0-rc (gzip) module=default version=1
70.80.59.221 - - [02/May/2014:18:36:30 -0700] "POST /_ah/spi/com.example.app.endpoints.RegionRegionIconsEndpoint.getRegionIcons HTTP/1.1" 404 166 - "Google-HTTP-Java-Client/1.16.0-rc (gzip)" "my-app.appspot.com" ms=16 cpu_ms=0 cpm_usd=0.000019 app_engine_release=1.9.4 instance=006c1b117c1b2d35341e0f407ae5785a825b65e5
您可以在Message
行看到,有时,AE仍在尝试使用带有重复字词的旧类名来处理呼叫!我已经完成了对整个代码库和生成的文件的搜索,我找不到字符串" RegionRegion"任何地方。我已经检查了web.xml
个文件十几次,它只有新的" RegionIconsEndpoint"班级名称。
想知道Google的服务器是否保留旧信息,我将我的应用程序的新版本部署为2-dot-my-app.appspot.com
。行为保持完全相同除之外,此版本的404失败请求没有AE日志消息。成功的请求日志与以前一样。
我的Android和iPad应用都遇到了这种情况。此外,我还在my-app.appspot.com上使用网络和Google的API资源管理器设法重现了它。在最后一种情况下,成功的请求显示了这一点:
200 OK
cache-control: no-cache, no-store, max-age=0, must-revalidate
content-encoding: gzip
content-length: 171
content-type: application/json; charset=UTF-8
date: Sat, 03 May 2014 03:07:05 GMT
etag: "G170GGjYGsLnxTffzUEJmTttHzU/LUWzmydK3mjH7IeRbEc_n9J6cDQ"
expires: Fri, 01 Jan 1990 00:00:00 GMT
pragma: no-cache
server: GSE
{
"iconsVid": "foo",
"iconsVersion": 3,
"kind": "client#resourcesItem",
"etag": "\"G170GGjYGsLnxTffzUEJmTttHzU/LUWzmydK3mjH7IeRbEc_n9J6cDQ\""
}
并且失败的请求显示:
404 Not Found
cache-control: private, max-age=0
content-encoding: gzip
content-length: 169
content-type: application/json; charset=UTF-8
date: Sat, 03 May 2014 03:08:34 GMT
expires: Sat, 03 May 2014 03:08:34 GMT
server: GSE
{
"error": {
"errors": [
{
"domain": "global",
"reason": "notFound",
"message": "service 'com.example.app.endpoints.RegionRegionIconsEndpoint' not found"
}
],
"code": 404,
"message": "service 'com.example.app.endpoints.RegionRegionIconsEndpoint' not found"
}
}
再次清楚地显示对旧类名的访问权限。尝试对我部署的v2版本(2-dot-my-app.appspot.com)执行相同操作时,情况有所不同。成功请求以这样结束:
200 OK
cache-control: no-cache, no-store, max-age=0, must-revalidate
content-encoding: gzip
content-length: 171
content-type: application/json; charset=UTF-8
date: Sat, 03 May 2014 03:12:08 GMT
etag: "EP5CWx59se1v4KdDnkfEx7cTkis/LUWzmydK3mjH7IeRbEc_n9J6cDQ"
expires: Fri, 01 Jan 1990 00:00:00 GMT
pragma: no-cache
server: GSE
{
"iconsVid": "foo",
"iconsVersion": 3,
"kind": "client#resourcesItem",
"etag": "\"EP5CWx59se1v4KdDnkfEx7cTkis/LUWzmydK3mjH7IeRbEc_n9J6cDQ\""
}
并且失败的请求以这样结束:
404 Not Found
cache-control: no-cache, no-store, max-age=0, must-revalidate
content-encoding: gzip
content-length: 29
content-type: text/html; charset=UTF-8
date: Sat, 03 May 2014 03:06:10 GMT
expires: Fri, 01 Jan 1990 00:00:00 GMT
pragma: no-cache
server: GSE
Not Found
我不知道还有什么可以尝试。对我来说,它看起来像是App-Engine中的一个错误。
那么......任何想法在这里发生了什么以及如何修复或解决它?
2014-05-04:我尝试将方法从POST
更改为GET
:完全相同的行为。我尝试将路径从regionIcons
更改为regionIconsFoo
:完全相同的行为。我尝试将@API版本从v1
更改为v2
:完全相同的行为。
最后,我尝试将类的名称更改回上一个(使用重复的单词):我获得的故障更少(可能是5%而不是20%)但是仍然会出现尝试访问现在的失败请求不存在的类名没有重复的单词。
恢复正确的名称将恢复原始描述的具有原始故障率的行为。
答案 0 :(得分:0)
我一直在努力解决类似的问题。检查appengine.com项目站点上的日志。您应该看到有关更新的日志,如果它有关于错误的其他信息 - 请检查它。 有时AE可以在本地机器上运行,但部署过程会发现一些错误。
修改:
<强> 1 即可。将课程重命名为旧的&#34; double&#34;名称,将其上传到AE并检查所有请求是否正常工作没有错误,如果是,则重新命名该类。 (如果是它的appengine bug它应该修复它。)
<强> 2 即可。创建尽可能简单的api并将其替换为您的项目。将其更新为AE并使用api explorer检查一切正常,没有主项目的方法。如果没问题,再次交换&#34; test&#34;与您的真实项目一起投影并上传到AE。
答案 1 :(得分:0)
这不是答案,因为它没有解决原因,但它是我的解决方案。
我将工人阶级复制回旧的班级名称。
public class RegionRegionIconsEndpoint {
@ApiMethod(name = "getRegionIconsOld", path="regionIconsOld", httpMethod = HttpMethod.POST)
public RegionInfoVersion.RegionIcons getRegionIcons(User user, @Named("id") String id)
throws OAuthRequestException {
...
}
}
现在在日志中,即使我只调用getRegionIcons
,我也看到有迹象表明这两个类都是使用“旧”版本调用大约20%的请求。这是一个黑客,我不喜欢它,但它的工作原理和客户都很满意。
如果你无法击败他们,请加入他们。