Android 错误请求400从Flatter请求ASP.Net Core 3.0
我正在尝试连接Flatter的HttpClient,以便从运行在ASP.NETCore3.0上的本地服务器获取数据。问题是每次尝试时都会出现错误400(错误请求) 以下是颤振代码:Android 错误请求400从Flatter请求ASP.Net Core 3.0,android,asp.net-core,flutter,Android,Asp.net Core,Flutter,我正在尝试连接Flatter的HttpClient,以便从运行在ASP.NETCore3.0上的本地服务器获取数据。问题是每次尝试时都会出现错误400(错误请求) 以下是颤振代码: String token = await SharedPreferencesService.getStringFromSF('idToken'); var client = new HttpClient(); client.badCertificateCallback = (X
String token = await SharedPreferencesService.getStringFromSF('idToken');
var client = new HttpClient();
client.badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
HttpClientRequest request =
await client.getUrl(Uri.parse('https://10.0.2.2:44383/weatherforcast'));
request.headers.add('idToken', token);
HttpClientResponse response = await request.close();
String reply = await response.transform(utf8.decoder).join();
asp.net core 3.0终结点:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
[HttpGet]
public User Get()
{
return new User { UserId = 1332, Username = "Michal" };
}
}
错误
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
请求错误
错误的请求-无效的主机名
HTTP错误400。请求主机名无效
我可以确认我在浏览器和邮递员上都获得了数据。
谢谢你的帮助。好的,我通过一步一步地调试解决了这个问题 看起来Android不喜欢自签名证书,因此我最终无法将其设置为使用HTTPS 我所做的是让它与唯一的HTTP一起工作,以下是步骤:
http://localhost:5000/weatherforcast
。
请记住,默认情况下,ASP.NET Core 3.0在端口5001上提供HTTPS,在端口5000上提供HTTP
接下来,Android为服务器正在运行的本地机器的IP使用别名,因此我们不必编写localhost:
,而必须编写10.0.2.2:
最后,我简化了客户端中的api调用,如下所示:
static Future<Profile> getUserProfile() async {
String url = 'http://10.0.2.2:5000/weatherforecast';
final reply = await http.get('$url');
var responseJson = json.decode(reply.body);
return Profile.fromJson(responseJson);
}
静态未来getUserProfile()异步{
字符串url='0http://10.0.2.2:5000/weatherforecast';
final reply=wait http.get(“$url”);
var responseJson=json.decode(reply.body);
返回Profile.fromJson(responseJson);
}
非常有用
只有一件事,我被困在你该去的地方
What comes next is running the server through our local runtime environment (which we can change in a Debug button in VS).
为此:
- 打开项目属性并将应用程序URL设置为仅http
要解决此问题,首先我们需要了解Android Emulator的工作方式: 您应该了解的第一个技巧是Android emulator(一个 虚拟设备)有自己的网络。所以谷歌定义了一个神奇的IP 地址“10.0.2.2”。如果尝试浏览到此IP地址,则 请求将路由到主机的“127.0.0.1”环回适配器 机器。(稍后我将为您提供有关魔法路由的证明。) 很简单:如果你把
localhost
放在地址上,它会攻击自己的android仿真器网络。因此,如果我们把10.0.0.2
,转换成127.0.0.1
,我们就能够访问我们的机器网络
问题是,IIS没有对127.0.0.1:port
address上的https
请求进行绑定,只针对localhost:port
。自己试试:运行.NET Core API,转到浏览器并键入127.0.0.1:port
。您将直接收到400错误的请求错误
那么,如何让IIS识别127.0.0.1:port
地址呢?
您必须处理ISS Express配置文件并手动添加绑定。按照以下步骤操作:
1-打开applicationHost.config
项目文件。在VS2019中,它位于$(solutionDir)\.vs\{projectName}\config\applicationhost.config
中
.vs
文件夹是隐藏的,因此请确保告诉您的文件资源管理器显示隐藏的目录。
对于其他Visual Studio版本,请查看以下链接:
2-CRTL+F搜索端口:localhost
,您将找到已为项目配置的绑定行
3-为https
协议和127.0.0.1:port
地址插入一行。您的绑定现在应该如下所示:
static Future<Profile> getUserProfile() async {
String url = 'http://10.0.2.2:5000/weatherforecast';
final reply = await http.get('$url');
var responseJson = json.decode(reply.body);
return Profile.fromJson(responseJson);
}
现在,返回浏览器并尝试访问127.0.0.1:port
。你应该做到没有任何错误。颤振应用程序也是如此。享受吧
参考资料:正是我需要的。谢谢你!这仍然有效!谢谢。我的上帝,你从不必要的配置中拯救了我。我花了5个多小时寻找答案,这帮了我很大的忙谢谢汉克斯,这太棒了。我一直在追踪一切,只有你的解决方案有效。