Android应用无法访问Vagrant Homestead托管的Web API

4

注意:
我对Laravel、Vagrant-Homestead设置和Android的网络库Retrofit都比较新,但我擅长于Android和PHP Web开发。我已经设置好了Laravel,并开发了一个简单的测试Web API,只是为了在Android应用程序中测试Retrofit库。请不要将此标记为以下Q&A线程的重复问题。即使它提出了类似的问题,这些问题也是不同的。

我的问题:
我的Vagrant-Homestead托管的Web API可以通过安装在主机OS X Mac中的Web浏览器进行访问。而且我的Homestead有两个Laravel站点ll5.app和tapi.app(即API)。

 _____________Mac OS X on MB Pro___________________
|  _______________            ______________      |
| | Vagrant       |          |              |     |
| |http://api.app | <------> | Web Browser  |     | IP: 192.168.1.7
| |_______________|          |______________|     |
|_________________________________________________|

But, I still couldn't fix this up for the following:

 _____________Mac OS X on MB Pro_______________________
|  __________________            ________________      |
| | Vagrant          |          |                |     |
| |http://api.app    | <---X--> | Android App    |     |
| | IP:192.168.10.10 |          |IP:192.168.56.1 |     |
| |__________________|          |________________|     |
|______________________________________________________|

我的 Host 文件如下:

127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
192.168.10.10   ll5.app
192.168.10.10   tapi.app

以下是我Homestead.yaml的一部分内容:
folders:
    - map: "/Users/randika/Private_Projects/webapps/"
      to: "/home/vagrant/webapps"

sites:
    - map: tapi.app
      to: "/home/vagrant/webapps/test_api/public"
    - map: ll5.app
      to: "/home/vagrant/webapps/ll5/public"

我尝试使用Retrofit库进行Web服务调用并尝试了以下内容。
Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("<address>")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

For the <address> I tried giving following values:
        http://tapi.app
        192.168.10.10:8000

当我尝试使用Genymotion Android的Web浏览器并使用地址http://192.168.10.10:8000访问时,它加载的是ll5.app主页而不是API。如何解决这个问题?任何帮助都将不胜感激。至少告诉我这不能做到吗?P.S.:已经是凌晨1点多了,我已经在上周末为此苦苦挣扎!

这个IP地址似乎无法被你的Android应用程序访问。你能解释一下为什么你的Android应用程序的IP地址不同吗? - Felippe Duarte
实际上这不是 Android 应用的 IP 地址,而是 Genymotion 的 IP(IP:192.168.56.1),我已经找到了。 - Randika Vishman
展示你的 Vagrant 配置。主要是 config.vm.network 的值。 - Alex Blex
@AlexBlex,我在哪里可以找到这个?它在Vagrantfile里吗?如果是的话,我已经检查过了,但没有设置这样的值! - Randika Vishman
好的。我认为这是一个通信问题。你的安卓应用无法连接到你的vagrant box。尝试在你的盒子之间创建一个网络。假设你正在使用virtualbox,请看一下这个链接,也许会有所帮助:http://www.virtualbox.org/manual/ch06.html#network_internal - Felippe Duarte
2个回答

3

我不想再每次需要托管和与同事共享内容时都去寻找Web主机,因此我必须解决这个问题并一劳永逸地解决它。

答案概要:以下是您需要遵循的步骤:

必须完成的任务:

  • 修改主机文件
  • 修改vagrant内的Nginx文件

可选任务:

  • 创建Atlas帐户并使用vagrant share功能,以便在全球范围内通过互联网访问Vagrant-Homestead Laravel开发应用程序。

步骤:

1. 介绍我的Mac + Vagrant + Homestead环境。

我的Host MacBook当前IP地址:192.168.1.7

Homestead.yaml中定义的我的Vagrant-Homestead IP地址:192.168.10.10

如我在问题中所述,我有多个站点(ll5.app和tapi.app)。 因此,以下是我Homestead.yaml的一部分,其中已映射了这些多个站点

folders:
     - map: "/Users/randika/Private_Projects/webapps/"
       to: "/home/vagrant/webapps"

 sites:
     - map: tapi.app
       to: "/home/vagrant/webapps/test_api/public"
     - map: ll5.app
       to: "/home/vagrant/webapps/ll5/public"

好的,现在我们可以进行第二步了。抱歉上面Hosts文件部分由于编辑器错误未格式化为代码。

2. 我修改了我的hosts文件如下:

请注意,我将我的当前IP地址映射到Vagrant IP地址。

127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
192.168.10.10   tapi.app
192.168.10.10   ll5.app
192.168.1.7     192.168.10.10

保存它。

3. 启动您的Vagrant并进行配置。

 cd Homestead/
 vagrant up
 vagrant provision

4. 接下来我们进入虚拟机编辑 Nginx 文件。通过 ssh 登录到 vagrant。

 vagrant ssh

您应该会看到一个像下面这样的vagrant ssh提示符:vagrant@homestead:~$

5. 现在,让我们编辑每个已配置的Vagrant托管Web应用程序的Nginx配置文件。

 cd /etc/nginx/sites-available
 ls

根据我的设置,您将看到以下网络应用程序配置列表:
 ll5.app  tapi.app

在这两个网络应用中,我想通过Android Genymotion访问tapi.app,但是尽管我提供了Vagrants VirtualBox IP或Vagrant IP地址,由于我在vagrant homestead中托管了多个站点,因此无法访问。如果只有一个站点设置,则可以通过Vagrant IP地址访问。

按照以下步骤获取所需的应用程序相关Nginx配置文件:(此步骤假定您知道Vim编辑器的基础知识)。

 sudo vim tapi.app     ----> This will give you the chances to edit that NginX config file.

以下是内容:

就像下面这样:

server {
  listen 80;
  listen 443;
  server_name tapi.app;
  root "/home/vagrant/webapps/test_api/public";

并将其更改为以下样式:

server {
  listen 80 default_server;
  listen 443 default ssl;
  server_name tapi.app;
  root "/home/vagrant/webapps/test_api/public";

我希望您注意以下两行:

 listen 80;    to    listen 80 default_server;
 listen 443;   to    listen 443 default ssl;

好的,现在保存Nginx配置文件并退出Vim编辑器。

6. 现在执行最后一个必要的命令,在vagrant ssh中执行:

sudo service nginx reload

如果您按照上述步骤一直做到最后一步,那么现在您可能已经得到了您的问题的答案(我尝试解决这个问题,花费了过去5个晚上的时间,睡眠时间更少:D)。
注意:在重新加载Nginx之后,请不要再次对vagrant进行配置,因为这样将会覆盖您对上述Nginx配置文件所做的修改。

注意事项:

请记住,我们仅仅是编辑了Nginx配置文件,以便通过服务器默认提供我们的其中一个站点。因此,这些步骤是针对我们在Vagrant-Homestead盒子中有多个站点而进行的。因此,在完成我们想要的操作后,我们应该通过Vagrant SSH访问同样的方式来回滚我们对特定Nginx配置文件所做的更改。否则,如果您保留此更改,其他站点将无法正常工作。 如需进一步阅读,请阅读以下主题。

可选任务:

  • 假设您希望将Vagrant-Homestead下开发的一个项目(Web API或Web应用程序)与同事共享,而且您还有另外一堆站点(这就是我们努力实现上述步骤的原因)。所以这也是可能的,我们称之为 (vagrant share)。因此,我已编辑了Nginx文件并告知服务器我需要为默认站点提供服务,因此通过Vagrant分享,现在将通过共享URL提供该站点的服务。那么让我们开始吧:

访问此链接 以获取关于我们将要做什么的一些背景信息。

Vagrant Share 步骤:

  1. 访问以下链接 并创建您的Atlas帐户。
  2. 退出Vagrant ssh,只需键入exit,然后在Homestead目录中像下面这样登录到vagrant:

    vagrant login

  3. 在提示输入时,请分别提供您的Atlas帐户详细信息(用户名和密码)。

  4. vagrant share 的最终步骤是 vagrant share 本身。请按照以下方式执行:

    vagrant share

    这应该会给您一个类似于以下内容的结果输出,具有全球访问临时URL,该URL将持续到您使用Ctrl+C命令停止共享。

Vagrant Share URL

希望这个答案能对其他人有所帮助,并节省他们的时间。

向地球上所有工程师致敬!


2
嗨,老兄,感谢你的努力。现在我正处于你曾经的位置,但我已经按照你说的做了,但我的安卓模拟器仍然无法连接到正在运行的网站。问题是Xcode可以很容易地使用我的本地网站的API,但该死的安卓模拟器却不能。我用的是带有虚拟机和Laravel Homestead的Mac系统,还有安卓模拟器。提前感谢你的任何帮助。 - Arman Momeni

0

您需要使用公共网络,以便从其他设备访问您的vagrant box。例如:

Vagrant.configure("2") do |config|
  config.vm.network "public_network"
end

私有网络仅可从主机系统访问。
请注意安全影响。


请您再指导我一下。我应该把以上这些代码放在哪里? - Randika Vishman
我把 config.vm.network 这一行放在下面这样可以吗?Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.network "public_network" - Randika Vishman
没错。它将使用DHCP为您的VM盒分配公共IP地址。 - Alex Blex
请阅读文档页面了解其他可用选项。为确保IP地址不变,分配静态IP地址可能是值得的。 - Alex Blex
实际上这对我没有起作用。我按照它所建议的添加了上面的行,并执行了vagrant provision,但仍然无法运行。因此,我从Vagrant-Homestead中删除了非API Laravel项目,尝试通过给予Vagrant的IP地址访问API,它可以正常工作。因此,必须有一种特殊的配置方式才能使用多个站点。 - Randika Vishman
Alex,实际上你的简单回答对我并没有起作用。但无论如何,感谢你的时间。请检查我的答案。我已经实际操作并取得了比我所需更多的成果。干杯! - Randika Vishman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接