Android无法访问在同一网络上运行的Restlet服务

时间:2016-09-17 15:05:14

标签: android web-services restlet

我正在测试连接到本地路由器的Android应用。在同一个WiFi网络上也使用Restlet运行一些Java Web服务。我确认Android应用可以访问服务过滤器,甚至可以从服务过滤器接收响应。但是,它似乎无法触及相关的Restlet服务。

该服务的完整URL是:

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。

我可以使用与上面提到的完全相同的URL从SOAP UI进行测试时成功点击此服务。实际上,所有Web服务都已使用SOAP UI进行端到端测试,并且完全正常运行。

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

chain.doFilter(request, response);

请求最终在空间中丢失,并且不会返回任何内容。

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

1 个答案:

答案 0 :(得分:0)

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

  • 未向登录服务发送适当的JSON
  • 未在POSt标题中声明内容类型为JSON
  • 并使用所有期望JSON的Restlet服务


对于使用带有JSON的Restlet而面临类似问题的任何人,以下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.