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

Android无法访问在同一网络上运行的Restlet服务,android,web-services,restlet,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地址 我将服务映射到我的Restle

我正在测试一个连接到本地路由器的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
应用程序
类中,如下所示:

router.attach("/login", LoginResource.class);
我的
web.xml
文件具有适当的映射,可以将任何具有
/service/
模式的内容路由到restleservlet

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

出于某种原因,Android应用程序可以点击服务过滤器,但当它达到:

chain.doFilter(request, response);
请求最终会丢失在空间中,并且不会返回任何内容


我怀疑这在很大程度上是一个Reslet配置问题,尽管我不知道这里到底发生了什么。

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

  • 未向登录服务发送正确的JSON
  • 未在文章的标题中将内容类型声明为JSON
  • 使用Restlet服务,所有这些服务都需要JSON

对于任何使用带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.

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

  • 未向登录服务发送正确的JSON
  • 未在文章的标题中将内容类型声明为JSON
  • 使用Restlet服务,所有这些服务都需要JSON

对于任何使用带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.

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