我下载了 Google Endpoints Tic Tac Toe 示例 - Java 中的服务器代码。
为了快速运行它,我从 API 定义中删除了 clientIds,所以我可以快速看到它在 API Explorer 中运行:
@Api(name = "tictactoe", version = "v1")
public class ScoresV1
{
...
我可以使用 API Explorer 运行以下方法,同时启用 OAuth 并使用我的 gmail 帐户进行身份验证。我可以在调试器中看到为该帐户设置的“用户”对象:
@ApiMethod(name = "scores.list")
@SuppressWarnings("unchecked")
public List<Score> list(@Nullable @Named("limit") String limit,
@Nullable @Named("order") String order, User user)
throws OAuthRequestException, IOException
{
...
然后我继续生成 Android 客户端(仍然删除了 clientIds)。我还下载了 official Android app获取 UI 类和 res 文件(帐户选择器和游戏界面)。
这就是我被困的地方。在真实的 Android 设备上运行时,TictactoeActivity 中的以下代码抛出了 GoogleAuthIOException:
@Override
protected ScoreCollection doInBackground(Void... unused)
{
ScoreCollection scores = null;
try
{
scores = service.scores().list().execute();
}
catch (IOException e)
{
e.printStackTrace();
异常(exception)情况:
02-21 16:38:47.051: D/TicTacToe(6151): com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException
02-21 16:38:47.051: D/TicTacToe(6151): at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:286)
02-21 16:38:47.051: D/TicTacToe(6151): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:858)
...
深入研究源代码,我发现 GoogleAuthUtil.getToken() 中的这段代码引发了根异常,这有点无益:
com.google.android.gms.auth.GoogleAuthException: Unknown
现在,我在 ScoreV1.list() 的本地开发服务器上有一个断点,在使用 API Explorer 进行测试时被击中,但 Android 客户端甚至没有击中服务器就失败了。现在,在本地开发服务器上设置了“-a 0.0.0.0”以接受传入连接。我也检查了 URL 是否正确,并且我可以从手机上运行以下 URL Chrome 浏览器(它给了我一个 Auth 错误,因为没有设置用户,但没关系):
http://192.168.2.23:8888/_ah/api/tictactoe/v1/score?limit=1&order=1
所以我知道网络正在工作并且手机可以访问它。我还验证了 AndroidManifest.xml 具有以下权限集:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
这是在 TicTacToe.java 中显示我的 URL 和路径的代码:
public static final String DEFAULT_ROOT_URL = "http://192.168.2.23:8888/_ah/api/";
/**
* The default encoded service path of the service. This is determined when
* the library is generated and normally should not be changed.
*
* @since 1.7
*/
public static final String DEFAULT_SERVICE_PATH = "tictactoe/v1/";
/**
* The default encoded base URL of the service. This is determined when the
* library is generated and normally should not be changed.
*/
public static final String DEFAULT_BASE_URL = DEFAULT_ROOT_URL
+ DEFAULT_SERVICE_PATH;
...
现在,真正让我感到困惑的是,即使我将 DEFAULT_ROOT_URL 更改为随机的东西,比如 5.5.5.5,我也会得到完全相同的 GoogleAuthIOException!当主机无法访问时,我希望得到一个不同的异常......
此外,我尝试将服务器部署到生产环境,并将 URL 重新指向 [myapp].appspot.com 地址 - 结果相同。服务器日志从未记录进来的请求。
事实上,我现在真的卡住了。请帮忙!一百万!
最佳答案
该错误很可能是由于您的 Android 应用程序和 Cloud Endpoints API 之间没有发生授权。
由于我无法完全访问您实际的 Endpoint API 注释和 Android 代码,我建议您仔细查看以下几点:
确保您已使用 clientIds 和 audiences 正确注释您的 Cloud Endpoints API。 Android Audience 值与 Web Client Id 的值相同。
确保您已部署更新的 API 并重新生成 Endpoints API 源以包含在您的 Android 应用程序中。
最后,在您的 Android 源代码中,您必须使用 GoogleAccountCredential.usingAudience(...) 构建一个 GoogleAccountCredential 实例,然后在调用端点 API 时使用此凭据对象。例如端点构建器采用 HTTP 传输、GSON 工厂和凭证。不要将最后一个参数(即 Credential)留空。
关于java - Google 端点 - Android GoogleAuthIOException Tic Tac Toe - 删除了 clientIds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41395505/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/