我在本地机器上运行一个web服务,该服务运行在localhost:54722上。
localhost:54722
我想从Android模拟器中运行的应用程序调用该服务。
我读到在应用程序中使用10.0.2.2将访问localhost,但它似乎不能与端口号一起工作。它说HttpResponseException: Bad Request。
10.0.2.2
HttpResponseException: Bad Request
我有一个网络服务器运行在我的本地主机。
如果我打开模拟器并想连接到我的本地主机,我使用192.168.x.x。这意味着您应该使用本地局域网ip地址。顺便说一下,你的HttpResponseException (Bad Request)并不意味着主机不可达。
192.168.x.x
HttpResponseException (Bad Request)
其他一些错误会导致此异常。
你可以通过IP地址“10.0.2.2”访问你的主机。
Android团队就是这样设计的。所以你的web服务器可以完美地运行在本地主机和从你的Android应用程序,你可以通过“http://10.0.2.2:<hostport>”访问它。
http://10.0.2.2:<hostport>
"BadRequest"是一个通常由服务器本身发送的错误,参见rfc 2616
10.4.1 400个错误请求 由于语法错误,服务器无法理解请求。客户不应该在没有修改的情况下重复请求。
10.4.1 400个错误请求
由于语法错误,服务器无法理解请求。客户不应该在没有修改的情况下重复请求。
因此,您获得了到服务器的工作连接,但是您的请求不符合预期的形式。我不知道你如何创建连接,包括什么头(如果有的话)-但这是你应该检查。
如果您需要更多的帮助,请解释一下您的代码是关于什么的,以及它用来连接到服务器的是什么,这样我们就有了总体的了解。
在这里是一个具有相同问题的问题-答案是在头文件中没有设置内容类型。
你需要将URL设置为10.0.2.2:portNr
10.0.2.2:portNr
portNr =指定端口的ASP。我当前的服务运行在localhost:3229/Service.svc上
portNr =
localhost:3229/Service.svc
所以我的url是10.0.2.2:3229
10.0.2.2:3229
我用这种方法解决了我的问题
我希望它能有所帮助……
localhost在启动时似乎在我的模拟器中工作正常,然后我开始得到连接拒绝异常 我使用了模拟器浏览器中的127.0.2.2,它可以工作,当我在模拟器中使用我的android应用程序时,它再次开始显示连接拒绝问题
然后我做了ifconfig,我使用IP 192.168.2.2,它工作得很好
默认AVD使用10.0.2.2, Genymotion使用10.0.3.2
10.0.3.2
如果您正在使用IIS Express,您可能需要绑定到所有主机名,而不仅仅是“localhost”。看看这个精彩的答案:
https://stackoverflow.com/a/15809698/383761 < a href = " https://stackoverflow.com/a/15809698/383761 " > < / >
告诉IIS Express本身绑定到所有ip地址和主机名。在你的.config文件中(通常是%userprofile%\My 文档\ IISExpress \ config \ applicationhost。配置,或者 $ (solutionDir) .vs \ config \ applicationhost。Visual Studio配置 2015),找到你的网站的绑定元素,并添加 <binding protocol="http" bindingInformation="*:8080:*" />
<binding protocol="http" bindingInformation="*:8080:*" />
确保将它作为第二个绑定添加,而不是修改现有的绑定,否则VS将重新添加一个附加了(1)的新站点。此外,你可能需要以管理员身份运行VS。
(1)
坏请求通常意味着您发送的数据格式不正确。可能是数据映射不匹配。如果您正在收到坏请求,则意味着您能够连接到服务器,但请求没有正确发送。
如果有人还在寻找这个,这就是我的工作方式。
您需要找到您的机器相对于您所连接的设备/模拟器的IP。对于模拟器的方法是按照以下步骤;
提供这个IP以从模拟器访问本地主机。端口与您在运行/发布服务时提供的端口相同。
注1:确保你已经照顾防火墙和入站规则。
注2:请重新启动计算机后检查此IP。由于某种原因,即使我提供了“使用以下IP”,主机IP也发生了变化。
我想向您展示我从我的Android模拟器访问IISExpress Web api的方式。我使用Visual Studio 2015。我从Android Studio调用Android模拟器。
我所需要做的就是在我的< em > applicationhost.config < / em >文件中添加下面这行绑定配置
<binding protocol="http" bindingInformation="*:<your-port>:" />
然后我检查并使用IP4地址从Android模拟器访问我的API
要求:你必须以管理员身份运行Visual Studio。这篇文章提供了一个完美的方法来做到这一点。
更多详细信息,请访问github上的我的帖子
希望这能有所帮助。
我解决了服务层使用Visual Studio IIS Express时的问题。只是指向10.0.2.2:端口不会工作。我没有像其他文章中提到的那样把IIS Express搞得一团糟,而是在IIS Express前面放了一个代理。例如apache或nginx。nginx.conf看起来像
# Mobile API server { listen 8090; server_name default_server; location / { proxy_pass http://localhost:54722; } }
然后android需要指向我的IP地址为192.168.x.x:8090
输送机允许您从外部平板电脑和手机在您的网络或从Android模拟器测试web应用程序(没有http://10.0.2.2:<hostport>)
操作步骤如下:
https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti
如果你正在使用一些第三方包,如node express或angular-cli,你需要找到你的机器的IP,并在服务器启动配置中将你的主机附加到该IP(而不是localhost)。然后使用IP从模拟器启动它。例如,我必须使用:ng serve -H 10.149.212.104来使用angular-cli。然后从我使用的模拟器:http://10.149.212.104:4200
ng serve -H 10.149.212.104
http://10.149.212.104:4200
问题是Android模拟器将10.0.2.2映射到127.0.0.1, 不映射到localhost。所以把你的web服务器配置到服务器上127.0.0.1:54722而不是localhost:54722。这样就行了。
127.0.0.1
localhost
127.0.0.1:54722
我在Visual Studio上执行IIS Express上的web应用程序时也遇到了同样的问题。要修复它,你需要进入你的项目属性,然后单击调试选项卡,并将http://localhost:[你 PORT]改为http://127.0.0.1:[你 PORT],并将android url设置为http://10.0.2.2:[你 PORT]。这对我很管用。
对于Laravel家园用户: 如果任何人使用Laravel与homestead,您可以在模拟器
仍然不工作? 另一个好的解决方案是使用ngrok https://ngrok.com/
1)在cmd下执行ipconfig命令
3)使用VMWare网卡1的IPv4地址加上端口号
在我的例子中是8080,所以不用localhost:8080
我使用的是192.168.51:8080
做……
运行本地主机后,你得到http://localhost:[port number]/,在这里你找到了你的端口号。
http://localhost:[port number]/
ipconfig
在我的情况下,IP是192.168.10.33,所以我的URL将是http://192.168.10.33(端口:数字]/。 在Android中,工作室使用这个URL作为你的URL。然后在模拟器的手动代理中设置URL和端口号。< / p >
192.168.10.33
由于10.0.2.2不是Android的安全域,你必须在API 28+的网络配置中允许非安全域,默认情况下禁止非tls连接。
您可以使用我的以下配置:
在main/res/xml/network_security_config.xml中创建一个新文件,如下所示:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">localhost</domain> <domain includeSubdomains="true">10.0.2.2</domain> </domain-config> </network-security-config>
把它指向androidmanifest。xml
<application ...... ...... android:networkSecurityConfig="@xml/network_security_config">
我使用Windows 10作为我的开发平台,在我的模拟器中访问10.0.2.2:port没有像预期的那样工作,在这个问题上的其他解决方案也有同样的结果。
经过几个小时的深入研究,我发现如果你在模拟器启动命令中添加-writable-system参数,事情就会正常工作。
你必须像下面这样通过命令行启动模拟器:
emulator.exe -avd <emulator_name> -writable-system
然后在模拟器中,您可以使用LAN IP地址和绑定端口访问主机上运行的API服务:
http://192.168.1.2:<port>
希望这能帮到你。
关于从命令行启动模拟器:https://developer.android.com/studio/run/emulator-commandline。
解释为什么localhost不能从模拟器提供给任何有基本访问问题的人。对于复杂的案例,请阅读其他答案。
问题:模拟器有自己的本地网络和localhost自己映射到模拟器,但不是你的主机!
解决方案:
0.0.0.0
ifconfig
192.168.1.10
当我试图从Android模拟器连接到我的IIS . net Webservice时,我也遇到了同样的问题。
npm install -g iisexpress-proxy
iisexpress-proxy 53990 to 9000
"http://10.0.2.2:9000"
在Android模拟器上访问本地主机
添加来自AndroidManifest.xml的上网权限 .xml 李<uses-permission android:name="android.permission.INTERNET" /> < / p > < / >
<uses-permission android:name="android.permission.INTERNET" />
添加android:usesCleartextTraffic="true",更多细节here:
android:usesCleartextTraffic="true"
运行如下命令找到您的系统IP地址:
ifconfig | grep "inet " | grep -v 127.0.0.1
复制从这一步(A)获得的IP地址
运行您的后端应用程序,您可以通过localhost或127.0.0.1从您的系统访问它。
不要忘记在IP地址后添加PORT,在我的例子中,应用程序运行在8080端口上,所以我添加了在(A)中获得的IP,端口为8080
我不确定这个解决方案是否适用于每个Android模拟器和每个Android SDK版本,但运行下面的方法对我来说是有效的。
adb reverse tcp:54722 tcp:54722
你需要让你的模拟器运行起来,然后你才能在运行的模拟器设备中成功地击中localhost:54722。
如果你和Asp一起工作。Net Web API,在项目中的.vs/config文件夹中,根据您的端口设置修改这些行。假设您使用端口1234和物理路径到IIS设置的项目文件夹是“D:\My Projects\ yoursitename”,那么
<site name="YourSiteName" id="1"> <application path="/" applicationPool="Clr4IntegratedAppPool"> <virtualDirectory path="/" physicalPath="D:\My Projects\YourSiteName" /> </application> <bindings> <binding protocol="http" bindingInformation="*:1234:*" /> </bindings> </site>
在android studio,访问您的api "http://10.0.2.2:1234"...