如何从flutter应用程序向本地主机发出http get请求?

Posted

技术标签:

【中文标题】如何从flutter应用程序向本地主机发出http get请求?【英文标题】:How to make http get request from flutter app to the localhost? 【发布时间】:2020-12-26 03:04:54 【问题描述】:

基本上我是从一个颤振应用程序向我的本地主机发出请求,我在 Visual Studio 中有自己的 Web API,每当我发出请求时,它都会给我 Bas Request[400]。所以当我提出这个请求时,它给出了我的错误请求,如果我使用我的 IP 地址发出请求也是这种情况,因为我使用的是实际的 android 手机来运行颤振,我无法使用“localhost”请求所以我写了我机器的IP地址。甚至在邮递员中也是如此。

我的 Fluuter 应用:

import 'dart:io';
import 'package:dio/adapter.dart';
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';


class Project 
  final String Id;
  final String Name;
  final double Amount;


  Project(this.Id, this.Name, this.Amount);

  factory Project.fromJson(Map<String, dynamic> json) 
    return Project(
      Id: json['Id'],
      Name: json['Name'],
      Amount: json['Amount'],
    );
  



void main() => runApp(MyApp());

class MyApp extends StatefulWidget 
  MyApp(Key key) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();


class _MyAppState extends State<MyApp> 

  List<Project> projects = new List<Project>();
  String url = "https://192.168.100.5:44391";

  void fetsh() async
  
    Dio dio = new Dio();
    (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
        (HttpClient client) 
      client.badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
      return client;
    ;
    try
    
      var respond = await dio.get("$url/api/Project");
      print(respond.statusCode);
      print(respond.data);
      var respondData = respond.data as List;
      setState(() 
        projects = respondData.map((e) => Project.fromJson(e)).toList();
      );

    
    catch(e) 
      print("error");
      print(e);
    

  



  @override
  void initState() 
    super.initState();
    fetsh();
  

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'Fetch Data Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fetch Data Example'),
        ),
        body: ListView.builder(
            itemCount: this.projects.length,
            itemBuilder: (BuildContext context, int index) 
              return new Text(this.projects[index].Name);
            
        )
      ),
    );
  

和服务器端:

using demo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace demo.Controllers

    public class ProjectController : ApiController
    
        List<Project> mylist = new List<Project>();
        public ProjectController()
        
            mylist.Add(new Project  Id = 1, Name = "Project 1", Amount = 150 );
            mylist.Add(new Project  Id = 2, Name = "Project 2", Amount = 150 );
            mylist.Add(new Project  Id = 3, Name = "Project 3", Amount = 150 );

        
        // GET: api/Project
        public List<Project> Get()
        
            return mylist;
        

        [Route("api/Project/GetProjectNames")]
        [HttpGet]
        public List<string> GetProjectNames() 
        
            List<string> output = new List<string>();
            foreach (var item in mylist)
            
                output.Add(item.Name);
            
            return output;
        

        // GET: api/Project/5
        public Project Get(int id)
        
            return mylist.Where(x=>x.Id == id).FirstOrDefault();
        

        // POST: api/Project
        public void Post([FromBody]string value)
        
        

        // PUT: api/Project/5
        public void Put(int id, [FromBody]string value)
        
        

        // DELETE: api/Project/5
        public void Delete(int id)
        
        
    

【问题讨论】:

【参考方案1】:

您可以使用ngrok 之类的隧道在互联网上公开您的 localhost API,这将允许您从手机或模拟器上运行的应用程序访问它。使用隧道的优点之一是启动和运行相对容易,但缺点之一是您的 localhost API 会暴露在 Internet 上。

【讨论】:

【参考方案2】:

不清楚您是尝试在本地网络中访问后端进行测试还是通过 Internet。对于本地网络,只需使用运行后端的机器的 IP。对于互联网,您需要使用您的互联网 IP 或使用诸如 duckdns.org 之类的东西来为您提供一个可以与动态 IP 一起使用的域。对于互联网访问,不要忘记将您路由器上的后端端口转发到运行后端代码的 IP。

【讨论】:

不,我正在使用我的本地主机,但是当我输入我的机器 ip 时它返回一个错误的请求 你需要让你的后端监听 IP 0.0.0.0,而不是 localhost 或 127.0.0.1 ;)

以上是关于如何从flutter应用程序向本地主机发出http get请求?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 物理 iOS 设备无法向我的本地 asp.net 服务器发出 api 请求

如何从 docker 容器向 localhost 发出请求?

从我的本地主机客户端发出请求而没有 cors 错误

在同一本地网络上从计算机向手机发出 POST 请求

如何从在不同端口上运行的本地 AngularJS 应用程序向本地 Rails 应用程序发出请求?

如何在 Flutter 上使用 cookie 发出 http 请求?