如何从我的 android 设备访问我的本地 REST api?

Posted

技术标签:

【中文标题】如何从我的 android 设备访问我的本地 REST api?【英文标题】:How can I access my local REST api from my android device? 【发布时间】:2017-05-02 22:28:30 【问题描述】:

我有一个 spring REST api 在我的计算机上本地运行。我想将此 api 用于 android 开发。

这是我的获取请求:

public static String sendGet(final String url) 
        StringBuilder result = new StringBuilder();
        HttpURLConnection urlConnection = null;
        try 
            String apiUrl = getAbsoluteUrl(url); // concatenate uri with base url eg: localhost:8080/ + uri
            URL requestUrl = new URL(apiUrl);
            urlConnection = (HttpURLConnection) requestUrl.openConnection();
            urlConnection.connect(); // no connection is made
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = reader.readLine()) != null) 
                result.append(line);
            

         catch (Exception e) 
            e.printStackTrace();
         finally 
            urlConnection.disconnect();
        
        return result.toString();
    

我可以通过设备的浏览器访问我的 api。但是,当我在构建的 apk 中使用相同的 url 发出请求时,没有建立连接。

我的清单包括:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

旁注:

我正在通过 USB 将我的设备连接到运行其余 api 的笔记本电脑。 我正在使用通过调用 ipconfig 找到的 WLAN IPv4 地址。

任何正确方向的提示将不胜感激 - 谢谢!

编辑以包含来自我笔记本电脑上运行的本地 REST api 的 chrome 浏览器(在 android 设备上)输出(返回默认访客用户信息的 GET 请求):

【问题讨论】:

您可以从android浏览器访问localhost:8080吗?可能不是。 localhost 在所有设备上的含义不同。 尝试通过 localhost 检查this 连接到您的设备,访问您的文件并解析它 @cricket_007:我可以从我的安卓浏览器访问我的 WLAN IPv4 地址 + URI。我有一个api如下: /api/users 返回所有用户的获取请求。我可以在我的 android chrome 浏览器中看到输出 JSON。但是当我在我的 android 设备 apk 版本中进行此调用时,我没有连接。 @Alien 我面临同样的问题。你有解决方案吗? 【参考方案1】:

让我告诉你一个更简单的方法来做到这一点。如果您使用的是 Android 模拟器,您可以使用 10.0.2.2 作为 IP 地址来连接到您的 REST API 可用的主机。

同样,如果您使用的是使用 Oracle Virtualbox 的 Genymotion,您可以使用 10.0.3.2。

【讨论】:

感谢您的评论。我刚刚尝试使用模拟器执行此操作,但我的主机仍然没有响应。嗯…… 你在用安卓模拟器吗??你可以检查并让我知道模拟器的详细信息。设置->关于手机->状态->IP地址 我无法找到设置-->关于手机等。所以我跑了adb shell ifconfig 结果: 10.0.2.15 在你的模拟器浏览器上,你能试试 10.0.2.2:8080 吗? 当我通过模拟器浏览器调用我的 api 时,我的 get 请求得到了成功的响应。【参考方案2】:

检查你的 ip:- 检查ip的步骤(确保您已连接到互联网)

    打开命令提示符 输入 ipconfig Ip 是下图中突出显示的 IP

现在让你的网址像这样: http://192.168.240.2/index.html

【讨论】:

非常感谢您上传图片,但是我也尝试过,但我的 apk 文件仍然没有运气。我在原始问题中附上了一张图片,以显示我的设备浏览器的输出。我从我的 android 版本中调用了这个相同的地址,但没有检索到任何响应。【参考方案3】:

您的 rest url 必须是这样的 - http://localhost:8080/yourRest/restMethod 。在同一网络(wifi 网络)上连接您的移动设备和本地计算机,而不是 localhost url。获取本地机器的 ip 地址例如 192.168.1.X ...所以现在您的休息端点 url 将是 http://192.168.1.X:8080/yourRest/restMethod

【讨论】:

我可以从我的平板设备浏览器访问我的 rest url 没有问题,但是当我从我的 apk 构建访问相同的 url 时,我没有连接。【参考方案4】:

如果有人感兴趣,请解决:

我设法通过扩展我原来的sendGet(final String url) 所在的类来解决这个问题,如下HttpClientUsage extends AsyncTask&lt;String, Void, String&gt; 更多信息和教程可以在这里找到:AsyncTask tutorial

然后我必须在本地 REST API 上配置我的 CORS 设置,如下所示:

 cors:
        allowed-origins: "*"
        allowed-methods: GET, PUT, POST, DELETE, OPTIONS
        allowed-headers: "*"
        exposed-headers:
        allow-credentials: true
        max-age: 1800

感谢大家的帮助,非常感谢。

【讨论】:

以上是关于如何从我的 android 设备访问我的本地 REST api?的主要内容,如果未能解决你的问题,请参考以下文章

如何从我的物理 Android 设备访问我的本地主机?

Android - 如何在 WebView 中访问本地存储值?

如何确保可以从我的设备网络访问 GCM 服务器?

无法使用 Easyphp 通过 android 设备访问 localhost

无法通过安卓设备连接本地服务器

如何从我的本地设备在 webView 上读取 pdf 文件