2013-10-30

Android程序通过http访问自己PC上的web应用程序,总是返回请求被拒绝

       最近使用Android studio学习Android手机程序开发,并且采用第三方Android-Query库简化界面控件访问和http网络操作。我准备让我的Android程序访问我用Grails编写的很简单的web应用程序,并得到JSON数据。

      访问Grails Web应用的URL为:http://localhost:8090/GrailsTest1/main/index, 在浏览器中访问这个URL可以得到正确的JSON结果, 但我启动Android Genymotion模拟器, 代码中用Android-Query的ajax方法访问始终返回“Network Error”,为更清楚地得到网络错误的具体原因,把AQuery的ajax访问改成Android的HttpClient异步网络调用,得到返回的错误为请求被对方拒绝。

      在网上发帖咨询,有人说可能是CORS的原因,但我发现我的Android代码可以访问ip.jsontest.com并得到正确的JSON结果,如果是CORS的问题,在对客户端程序进行相应CORS的修改前,访问任何web应用都不应该得到结果的,因此排除是CORS问题。

      继续在网上搜索并试验,最终发现了原因:Android模拟器会使用localhost表示自己的地址,而提供另一个特定的IP作为宿主主机地址给Android程序使用,经过测试,这个IP地址是10.0.3.2。我把Android程序中访问web应用的地址改成http://10.0.3.2:8090/GrailsTest1/main/index。奇迹出现了,看到了企盼已久的JSON返回结果。

No comments:

Post a Comment