【问题标题】:Android cannot reach Restlet service running on same networkAndroid 无法访问在同一网络上运行的 Restlet 服务
【发布时间】:2016-09-17 15:05:14
【问题描述】:

我正在测试一个连接到本地路由器的 Android 应用。在同一个 WiFi 网络上,还使用 ​​Restlets 运行一些 Java Web 服务。我验证了 Android 应用可以点击服务过滤器,甚至可以收到服务过滤器的响应。但是,它似乎无法访问有问题的 Restlet 服务。

服务的完整网址是:

http://192.168.0.148:8080/MyApp/service/login

其中192.168.0.148 是运行 Restlet Web 服务的计算机的本地 IP 地址。

我将服务映射到我的 Restlet Application 类中,如下所示:

router.attach("/login", LoginResource.class);

我的web.xml 文件具有适当的映射,可以将具有/service/ 模式的任何内容路由到Restlet servlet。

从 SOAP UI 使用与我上面给出的完全相同的 URL 进行测试时,我可以成功地访问此服务。事实上,所有 Web 服务都已使用 SOAP UI 进行了端到端测试,并且功能齐全。

由于某种原因,Android 应用可以点击服务过滤器,但何时到达:

chain.doFilter(request, response);

请求最终在空间中丢失,没有任何返回。

我怀疑这主要是 Reslets 配置问题,虽然我不知道这里到底发生了什么。

【问题讨论】:

  • 发布您用于连接服务器的代码。您是否收到超时错误?您可以从服务器登录以查看请求是否到达那里?
  • @nasch 正如我所提到的,只要从过滤器发送响应,Android 应用程序就可以发送和接收。但是当过滤器链被转发时,它永远不会到达/login 服务。

标签: android web-services restlet


【解决方案1】:

我几乎没有收到来自 SO 社区或 Restlets 的反馈,考虑到我在问题中报告的所有内容都是正确的,这实际上是有道理的。我决定将 Restlet 源附加到我的 IntelliJ IDE,并逐步执行代码。我看到 Tomcat 日志包含415 的响应代码,通过检查 Restlets 中的实际异常,我看到一个错误,指出我发布的媒体类型是意外的。看到这里,我立刻知道自己做错了什么,那就是:

  • 未向登录服务发送正确的 JSON
  • 不在 POST 的标头中将内容类型声明为 JSON
  • 并使用所有需要 JSON 的 Restlet 服务


对于使用带有 JSON 的 Restlets 遇到类似问题的任何人,以下 Android 代码可以让一切正常运行:

String endpoint = "http://192.168.0.148:8080/MyApp/service/login";
URL obj = new URL(endpoint);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

JSONObject json = new JSONObject();
json.put("username", username);
json.put("password", password);
// etc.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多