我在localhost:54722
运行的本地计算机上运行Web服务。
我想从Android模拟器中运行的应用程序调用该服务。
我读到在应用程序中使用10.0.2.2
将访问localhost,但它似乎也不适用于端口号。它说HttpResponseException: Bad Request
。
答案 0 :(得分:350)
您可以使用IP地址“10.0.2.2
”访问主机。
这是由Android团队以这种方式设计的。因此,您的网络服务器可以在本地主机上完美运行,您可以通过“http://10.0.2.2:<hostport>
”在Android应用中访问它。
如果您的模拟器必须通过代理服务器访问Internet,则可以从模拟器的扩展控件屏幕配置自定义HTTP代理。打开模拟器后,点击更多 ,然后点击设置和代理。从这里,您可以定义自己的HTTP代理设置。
答案 1 :(得分:51)
默认AVD使用10.0.2.2,Genymotion使用10.0.3.2
答案 2 :(得分:13)
如果您使用的是IIS Express,则可能需要绑定到所有主机名而不仅仅是“localhost”。检查这个好答案:
https://stackoverflow.com/a/15809698/383761
告诉IIS Express本身绑定到所有IP地址和主机名。在.config文件中(通常为%userprofile%\ My Documents \ IISExpress \ config \ applicationhost.config,或 Visual Studio的$(solutionDir).vs \ config \ applicationhost.config 2015),找到您网站的绑定元素,然后添加
<binding protocol="http" bindingInformation="*:8080:*" />
确保将其添加为第二个绑定而不是修改现有绑定,否则VS将重新添加一个附加了(1)
的新网站。此外,您可能需要以管理员身份运行VS.
答案 3 :(得分:10)
我通过安装&#34; Conotor by Keyoti&#34;解决了这个问题。在Visual Studio Professional 2015中。 传送带使用启用外部请求的端口(45455)生成REMOTE地址(您的IP)。 例如:
传送带允许您通过网络上的外部平板电脑和手机或Android模拟器测试网络应用程序(不使用#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void reverse_string(char *str) {
/* skip null */
if (str == 0) {
return;
}
/* skip empty string */
if (*str == 0) {
return;
}
/* get range */
char *start = str;
char *end = start + strlen(str) - 1; /* -1 for \0 */
char temp;
/* reverse */
while (end > start) {
/* swap */
temp = *start;
*start = *end;
*end = temp;
/* move */
++start;
--end;
}
}
char *read(void) {
char *line = malloc(100), *linep = line;
size_t lenmax = 100, len = lenmax;
int c;
if (line == NULL)
return NULL;
for (;;) {
c = fgetc(stdin);
if (c == EOF)
break;
if (--len == 0) {
len = lenmax;
char *linen = realloc(linep, lenmax *= 2);
if (linen == NULL) {
free(linep);
return NULL;
}
line = linen + (line - linep);
linep = linen;
}
if ((*line++ = c) == '\n')
break;
}
*line = '\0';
return linep;
}
int main(void) {
printf("Enter a sentence:");
char *sentence = read();
reverse_string(sentence);
printf(sentence);
return 0;
}
)
步骤如下:
https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti
答案 4 :(得分:9)
我在Visual Studio上执行IIS Express上的Web应用程序时面临同样的问题。要解决此问题,您需要转到项目属性,然后单击Debug选项卡并将http://localhost:[YOUR PORT]更改为http://127.0.0.1:[YOUR PORT]并将android url设置为http://10.0.2.2:[YOUR PORT]。它对我有用。
答案 5 :(得分:8)
我有一个在我的localhost上运行的网络服务器。
如果我打开模拟器并想连接到我的localhost,我使用的是192.168.x.x
。这意味着您应该使用本地lan IP地址。顺便说一句,您的HttpResponseException (Bad Request)
并不意味着主机无法访问。
其他一些错误会导致此异常。
答案 6 :(得分:6)
问题是Android模拟器将10.0.2.2
映射到127.0.0.1
,不映射到localhost
。因此,请将您的Web服务器配置为serveron 127.0.0.1:54722
而不是localhost:54722
。应该这样做。
答案 7 :(得分:3)
您需要将网址设置为10.0.2.2:portNr
portNr =
ASP.NET Development Server的给定端口我的当前服务正在localhost:3229/Service.svc
上运行
所以我的网址是10.0.2.2:3229
我以这种方式解决了我的问题
我希望它有所帮助...
答案 8 :(得分:3)
“BadRequest”是一个错误,通常由服务器本身发送,请参阅rfc 2616
10.4.1 400错误请求
由于语法格式错误,服务器无法理解该请求。客户端不应该在没有修改的情况下重复请求。
因此,您与服务器建立了有效连接,但您的请求不符合excet表单。我不知道你是如何创建连接的,包括哪些标题(如果有的话) - 但那就是你要检查的内容。
如果您需要更多帮助,请说明您的代码是什么以及它用于连接服务器的用途,因此我们可以了解全局。
Here是一个同样问题的问题 - 答案是内容类型没有在标题中设置。
答案 9 :(得分:2)
要在Android Emulator上访问localhost
从AndroidManifest.xml添加Internet权限
<uses-permission android:name="android.permission.INTERNET" />
添加android:usesCleartextTraffic="true"
,更多详细信息here:
运行以下命令找到您的系统IP地址:
ifconfig | grep "inet " | grep -v 127.0.0.1
复制从此步骤(A)获得的IP地址
运行您的后端应用程序,您可以在系统中的localhost
或127.0.0.1
上访问它。
现在在android studio中,如果您在代码中使用,则可以替换网址;也可以使用从步骤(A)获得的ip地址,然后尝试在网络浏览器中打开, 像这样http://192.168.0.102:8080/
别忘了在IP地址后添加PORT,在我的情况下,应用程序在8080端口上运行,因此我添加了在(A)中使用8080端口获得的IP
答案 10 :(得分:2)
运行本地主机后,您会在此处找到http://localhost:[port number]/
,找到了端口号。
然后从Command处获取IP地址,打开Windows命令并输入ipconfig
在我的情况下,IP为192.168.10.33
,因此我的URL为http://192.168.10.33:[port数字] /。
在Android中,工作室使用此URL作为您的URL。然后,在模拟器的手动代理中设置URL和端口号。
答案 11 :(得分:1)
我不确定该解决方案是否适用于每个Android Emulator和每个Android SDK版本,但是运行以下命令对我来说很成功。
adb reverse tcp:54722 tcp:54722
您需要先启动模拟器,然后才能在运行中的模拟器设备中成功击中localhost:54722
。
答案 12 :(得分:1)
对于Laravel Homestead用户: 如果有人使用Laravel和宅基地,你可以在模拟器中使用192.168.10.10访问app后端
仍然无法使用? 另一个好的解决方案是使用ngrok https://ngrok.com/
答案 13 :(得分:0)
如果您正在使用 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中,使用“http://10.0.2.2:1234”访问你的api ...
答案 14 :(得分:0)
错误请求通常表示您发送的数据格式不正确。可能是数据映射不匹配。如果您收到错误请求意味着您可以连接到服务器,但请求未正确发送。
答案 15 :(得分:0)
当我尝试从Android模拟器连接到IIS .NET Web服务时,我遇到了同样的问题。
application.yml
# Libs
import discord # Version 1.2.5
from discord.ext import commands
# set discord API token
token = "MASKED"
# Initiate used objects
bot = commands.Bot(command_prefix="!")
@bot.event
async def on_member_join(member):
print(f"{member} has joined the server.")
for channel in member.server.channels:
if str(channel) == "general":
await bot.send_message(f"""Welcome to the server
{member.mention}""")
bot.run(token)
代理IIS Express端口到9000,并从仿真器访问端口9000,例如npm install -g iisexpress-proxy
原因似乎是默认情况,IIS Express不允许来自网络的连接 https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API+or+Web+App+from+across+LAN
答案 16 :(得分:0)
说明为什么localhost
对于有基本访问问题的人无法从仿真器中获得。对于复杂的案例,请阅读其他答案。
问题:仿真器拥有本地局域网,并且localhost
会将自己映射到仿真器,但没有您的主机!
解决方案:
0.0.0.0
,以使其可用于模拟器的网络ifconfig
命令192.168.1.10
而不是localhost
答案 17 :(得分:0)
我正在使用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启动模拟器。
答案 18 :(得分:0)
由于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">
答案 19 :(得分:0)
1)在cmd中运行ipconfig命令
3)然后使用VMWare网络适配器1的IPv4地址,后跟端口号
在我的案例中它是8080,所以不使用localhost:8080
我正在使用192.168.56.1:8080
完成.....
答案 20 :(得分:0)
如果您正在使用某些第三方软件包,例如node express或angular-cli,则需要查找计算机的IP,并将主机连接到服务器启动配置(而不是localhost)中的IP。然后使用IP从模拟器启动它。例如,我必须使用:ng serve -H 10.149.212.104
来使用angular-cli。然后从我使用的模拟器:http://10.149.212.104:4200
答案 21 :(得分:0)
localhost似乎在我的模拟器中正常工作,然后我开始获得连接拒绝异常 我从模拟器浏览器使用了127.0.2.2并且它工作,当我在我的模拟器中的Android应用程序中使用它时它再次开始显示连接被拒绝的问题。
然后我做了ifconfig,我使用了ip 192.168.2.2,它运行得很好
答案 22 :(得分:0)
当服务层使用Visual Studio IIS Express时,我解决了问题。只是指向10.0.2.2:port不会工作。我没有像其他帖子所提到的那样弄乱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
答案 23 :(得分:0)
如果有人仍然在寻找这个,这就是它对我有用的方式。
您需要找到与您连接的设备/仿真器相关的机器IP。对于仿真器,请遵循以下步骤;
提供此IP以从模拟器访问localhost。端口与运行/发布服务时提供的端口相同。
注意#1:确保您已经处理好防火墙和入站规则。
注意#2:重新启动计算机后请检查此IP。出于某种原因,即使我提供“使用以下IP”,主机IP也已更改。
答案 24 :(得分:-1)
您可以在Windows任务管理器中的“性能”选项卡中查找所需的IP(按ctrl + alt + del)。 。