Получить токен доступа с REST API в флаттере / дротике - PullRequest
0 голосов
/ 17 марта 2019

Я не могу получить токен доступа с этой функцией getData (), он возвращает «Bad Request - Invalid Hostname». Как я могу решить эту проблему? Могу ли я изменить метод Future <>, async или http?

Вот мой main.dart:

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);
}

ОШИБКА!

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>

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Если вы хотите получить токен из остальных 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}");
        });
    }
0 голосов
/ 17 марта 2019

Я попытался получить токен доступа с помощью unsplash api, и он работал нормально. Я использовал два плагина. Первый, url_launcher , позволяет открывать URL в браузере. Вы должны указать URL-адрес регистрации, и после успешной регистрации пользователь будет перенаправлен в ваше приложение. как? используя второй плагин uni_links . как только пользователь вернется обратно, вы начнете извлекать токен доступа.

Запустите 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);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...