Каков наилучший способ сделать HTTP-пост в дартс? - PullRequest
0 голосов
/ 07 февраля 2020

Пытался опубликовать это: {grant_type: пароль, пароль: 123456, имя пользователя: user1234} с кодом ниже

Future<HttpClientResponse> apiRequest(String url, String username, String password) async {
Map jsonMap = {'grant_type':'password','password':password,'username':username};
HttpClient httpClient = new HttpClient();
HttpClientRequest request = await httpClient.postUrl(Uri.parse(url));
request.headers.set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
request.add(utf8.encode((jsonMap.toString())));
print((jsonMap.toString()));
return await request.close();
}

, но в ответе {"error": "invalid_request", "error_description": "Отсутствует обязательный параметр" grant_type "."}

при попытке почтальона получить другой результат

снимок экрана с ответом с почтальоном

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Хорошо, я не знаю, какой метод вы используете, но я покажу вам мой метод, который работает, и он должен помочь вам понять структуру запроса.

Показывает код на стороне сервера :

POST - /api/getInfo

Request:

{
user_phone: ''
notes: ''
}

Response:

{
status: ''
}

Таким образом, для этого кода на стороне сервера для этого запроса (почтового запроса) требуется переменная user_phone и переменная notes. Это дает нам ответ о статусе.

Итак, что бы я сделал, чтобы сделать один запрос этого сервера, было бы следующее:

String basicAuth = 'Basic ' + base64Encode(utf8.encode('$username:$password')); // <--- Generate the Basic Auth string
http.Response response = await http.get(
  'https://myRandomServer.com/api/getInfo',
  headers: <String, String>{'authorization': basicAuth}, // <--- Authorization in header
  body: {'user_phone': '5555555555', 'notes': 'Some note'}, // <--- Data required in body of request
);

if (response.body != null) {
  Map data = jsonDecode(responseStatus.body); // <--- Decoding from json file response
  myStatus = data.['status']; // <----  Piece of information I need
}

Теперь есть больше способов, чем это, однако , это должно помочь вам выяснить, что может быть не так с вашим исходным кодом, или как его нужно изменить, чтобы сделать то, что вы пытаетесь сделать.

0 голосов
/ 07 февраля 2020

Думаю, нет лучшего способа. В настоящее время я использую Retrofit For Dart, что очень удобно, поскольку генерирует фактическую реализацию.

Например,

@POST('/oauth/token')
@Headers(Constant.HEADER)
Future<LoginResponse> loginByEmail(@Query("email") String email, 
@Query("password") String password, @Query("grant_type") String grantType);

станет

@override
loginByEmail(email, password, grantType) async {
  ArgumentError.checkNotNull(email, 'email');
  ArgumentError.checkNotNull(password, 'password');
  ArgumentError.checkNotNull(grantType, 'grantType');
  const _extra = <String, dynamic>{};
  final queryParameters = <String, dynamic>{
    'email': email,
    'password': password,
    'grant_type': grantType
  };
  final _data = <String, dynamic>{};
  final Response<Map<String, dynamic>> _result = await _dio.request(
    '/oauth/token',
    queryParameters: queryParameters,
    options: RequestOptions(
        method: 'POST',
        headers: <String, dynamic>{

        },
        extra: _extra,
        baseUrl: baseUrl),
    data: _data);
  final value = LoginResponse.fromJson(_result.data);
  return Future.value(value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...