在flatter/dart中使用restapi获取访问令牌

在flatter/dart中使用restapi获取访问令牌,rest,http,dart,flutter,localhost,Rest,Http,Dart,Flutter,Localhost,我无法使用此getData()函数获取访问令牌,它返回“错误请求-无效主机名”。如何解决这个问题?Amı更改未来方法、异步或http方法 这是我的主要任务。省道: Future<HttpClient> getData() async { Map<String, String> connection = { 'grant_type': 'string', 'branchcode': 'string', 'password': 'string',

我无法使用此getData()函数获取访问令牌,它返回“错误请求-无效主机名”。如何解决这个问题?Amı更改未来方法、异步或http方法

这是我的主要任务。省道:

Future<HttpClient> getData() async {

  Map<String, String> connection = {
    'grant_type': 'string',
    'branchcode': 'string',
    'password': 'string',
    'username': 'string',
    'dbname': 'string',
    'dbuser': 'string',
    'dbpassword': 'string',
    'dbtype': 'string+'
  };

  var uri = Uri.http("192.168.1.44:7070","api/v2/token",connection);
  http.Response r = await http.get(uri);
  print(r.statusCode);
  print(r.body);
}
Future getData()异步{
映射连接={
“授权类型”:“字符串”,
'branchcode':'string',
“密码”:“字符串”,
“用户名”:“字符串”,
“dbname”:“string”,
“dbuser”:“string”,
“dbpassword”:“string”,
“dbtype”:“string+”
};
var uri=uri.http(“192.168.1.44:7070”,“api/v2/token”,连接);
Response r=wait http.get(uri);
打印(r.statusCode);
印刷品(r.body);
}
错误

I/flutter ( 9316): 400
I/flutter ( 9316): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
I/flutter ( 9316): <HTML><HEAD><TITLE>Bad Request</TITLE>
I/flutter ( 9316): <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
I/flutter ( 9316): <BODY><h2>Bad Request - Invalid Hostname</h2>
I/flutter ( 9316): <hr><p>HTTP Error 400. The request hostname is invalid.</p>
I/flutter ( 9316): </BODY></HTML>
I/颤振(9316):400
I/颤振(9316):
I/颤振(9316):请求错误
I/颤振(9316):
I/flatter(9316):请求错误-主机名无效
I/颤振(9316):
HTTP错误400。请求主机名无效

I/颤振(9316):
我尝试使用unsplash api获取访问令牌,但效果很好。我使用了两个插件。首先,它允许您在浏览器中打开url。您应该放置注册url,一旦用户成功注册,用户将重定向到您的应用程序。怎样?使用第二个插件。一旦用户返回,您就开始提取访问令牌

启动允许用户注册的url

_launchURL() async {
    var registerUrl= Constants.registerUrl;
    if (await canLaunch(registerUrl)) {
      await launch(registerUrl);
    } else {
      throw 'Could not launch $loginUrl';
    }
  }
当用户完成该过程时。您的应用程序应侦听此步骤

@override
  initState() {
    super.initState();
    initUniLinks();
  }




Future<Null> initUniLinks() async {
    getUriLinksStream().listen((Uri uri) {
      if (uri != null) {
        setState(() {
          String code = uri.queryParameters["code"];
          print("code:" + code);
          if (code != null) {
            _getAccessToken(Constants.clientId, Constants.clientSecret,
                Constants.redirectURI, code, "authorization_code");
          }
        });
      }
    }, onError: (err) {
      print("error:" + err.toString());
    });
  }



_getAccessToken(String client_id, String client_secret, String redirect_uri,
      String code, String grant_type) async {
    var url = "https://unsplash.com/oauth/token";

    var query_params = {
      "client_id": client_id,
      "client_secret": client_secret,
      "redirect_uri": redirect_uri,
      "code": code,
      "grant_type": grant_type
    };

    var response = await http.post(url, body: query_params);

    Map<String, dynamic> map = json.decode(response.body);
    var accessToken = AccessToken.fromJson(map);
    _saveAccessTokenToPrefs(accessToken);
  }
@覆盖
initState(){
super.initState();
初始化链接();
}
Future initUniLinks()异步{
getUriLinksStream().listen((Uri){
if(uri!=null){
设置状态(){
字符串代码=uri.queryParameters[“代码”];
打印(“代码:”+代码);
如果(代码!=null){
_getAccessToken(Constants.clientId、Constants.clientSecret、,
Constants.redirectURI,代码,“授权代码”);
}
});
}
},onError:(错误){
打印(“错误:+err.toString());
});
}
_getAccessToken(字符串客户端\u id、字符串客户端\u机密、字符串重定向\u uri、,
字符串代码,字符串授予(类型)异步{
变量url=”https://unsplash.com/oauth/token";
变量查询参数={
“客户id”:客户id,
“客户机密”:客户机密,
“重定向uri”:重定向uri,
“代码”:代码,
“授予类型”:授予类型
};
var response=wait http.post(url,body:query_params);
Map=json.decode(response.body);
var accessToken=accessToken.fromJson(map);
_saveAccessTokenToPrefs(accessToken);
}

如果您想从rest api获取令牌,您必须使用http.post()方法发布连接。在这个方法中,您可以轻松地在body字段中声明连接字符串。我试过了,它正在工作

这是我的代码块:

   Future<Null> getData() async {

        var url = "http://192.168.1.23:7070/api/v2/token";
        http.post(url, body:{
          "grant_type": "string",
          "branchcode": "string",
          "password": "string",
          "username": "string",
          "dbname": "string",
          "dbuser": "string",
          "dbpassword": "string",
          "dbtype": "string"
        }).then((response){
          print("Response Status: ${response.statusCode}");
          print("Response Body: ${response.body}");
        });
    }
Future getData()异步{
变量url=”http://192.168.1.23:7070/api/v2/token";
http.post(url,正文:{
“授权类型”:“字符串”,
“分支代码”:“字符串”,
“密码”:“字符串”,
“用户名”:“字符串”,
“dbname”:“字符串”,
“dbuser”:“字符串”,
“dbpassword”:“string”,
“dbtype”:“字符串”
}).然后((回应){
打印(“响应状态:${Response.statusCode}”);
打印(“响应正文:${Response.Body}”);
});
}

服务器正在返回该错误,因此您需要在那里进行调查,看看它不喜欢什么。(以前,您的C#code将
连接
参数作为URL编码的主体发送,但也可以将其作为查询参数发送。)我建议使用类似于Postman或其他工作客户端的方法来证明请求有效,然后比较您在Dart中形成的请求与工作请求之间的差异。(当您正处于测试请求的阶段时,考虑只使用一个DART程序来测试;您可以使用简单的CMD行PROG快速迭代)。我可以在CyaseEasILIN中完成它。在这种情况下,您可以轻松地比较Dart发送的和由Cype发送的HTTP请求。一旦你看到了差异,你应该能够调整Dart代码来匹配。如果你不能,那将是一个好问题。我现在不知道如何比较这两种语言?我建议使用像Wireshark这样的数据包捕获工具来捕获请求和响应。这不容易做到。ı当ı与我的代码混合时,请接受所有警告。