Как разместить x- www-form-urlencoded во Flutter - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь отправить POST запрос к API для создания учетной записи.
Запрос работает нормально, он должен выглядеть так:

Режим массового редактирования:
Bulk Edit mode

Режим редактирования ключевого значения:
Key-Value Edit mode

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

Мой запрос выглядит так:

import 'dart:convert' as convert ;

import 'package:my_project/requests/utils.dart';
import 'package:http/http.dart' as http;


Future<String>      createUser(String firstName, String name, String mail,
    String password, String confirmPassword, String birthDate,
    String phone) async {
  String              url = BASE_URL + "createUser" ; // Don't worry about BASE_URL, the final url is correct

  Map<String, dynamic>    formMap = {
    "name": name,
    "surname": firstName,
    "mail": mail,
    "password": password,
    "birth": birthDate,
    "phone": phone,
    "confirmPassword": confirmPassword
  } ;

  http.Response    response = await http.post(
    url,
    body: convert.jsonEncode(formMap),
    headers: {
      "Content-Type": "application/x-www-form-urlencoded"
    },
    encoding: convert.Encoding.getByName("utf-8"),
  );
  print("RESPONSE ${response.statusCode} ; BODY = ${response.body}");

  return (response.body) ;

}

Вот мой результат печати:

I/flutter ( 6942): RESPONSE 307 ; BODY =  

Как видите, я получаю ошибку 307, и проблема исходит не от сервера, поскольку он работал с Postman.

Правильно ли я отправляю этот form-urlencoded POST запрос?

Я тоже пробовал:

http.Response    response = await http.post(
    url,
    body: "name=$name&surname=$firstName&mail=$mail&password=$password&birth=$birthDate&phone=$phone&confirmPassword=$confirmPassword",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded"
    },
    encoding: convert.Encoding.getByName("utf-8"),
  );

, но с теми же результатами. Я тоже пробовал:

http.Response    response = await http.post(
    url,
    body: formMap,
    headers: {
      "Content-Type": "application/x-www-form-urlencoded"
    },
    encoding: convert.Encoding.getByName("utf-8"),
  );

снова с тем же результатом.
Что я делаю не так?

РЕДАКТИРОВАТЬ:

Я попробовал ответить FoggyDay, вот мой запрос сейчас:

final client = HttpClient() ;
final request = await client.postUrl(Uri.parse(url));
request.headers.set(HttpHeaders.contentTypeHeader, "application/x-www_form-urlencoded");
request.followRedirects = true ;
request.write(formMap);
final response = await request.close();
print("STATUS CODE = ${response.statusCode}");

Однако у меня все еще есть ошибка 307. Правильный ли я запрос создал?

РЕДАКТИРОВАТЬ 2:

Как и просили, я напечатал местоположение следующим образом:

final client = HttpClient() ;
final request = await client.postUrl(Uri.parse(url));
request.headers.set(HttpHeaders.contentTypeHeader, "application/x-www_form-urlencoded");
request.followRedirects = true ;
request.write(formMap);
final response = await request.close();
print("STATUS CODE = ${response.statusCode}");
print("Response headers = ${response.headers}");

И я получаю:

I/flutter ( 7671): STATUS CODE = 307
I/flutter ( 7671): Response headers = location: /app/createUser/
I/flutter ( 7671): date: Tue, 26 May 2020 09:00:29 GMT
I/flutter ( 7671): content-length: 0
I/flutter ( 7671): server: Apache/2.4.41 (Amazon) OpenSSL/1.0.2k-fips

Дело в том, что я уже звоню в / app / createUser ... ('/ app /' находится в BASE_URL)

1 Ответ

0 голосов
/ 26 мая 2020

As you can see, I am getting a 307 error, and the problem does not come from the server, as it worked with Postman.

Нет, это НЕ обязательно. Посмотрите здесь:

MDN: 307 Temporary Redirect

Другими словами, Postman следует за перенаправлением ... а ваше приложение Flutter - нет.

ПРЕДЛОЖЕНИЕ: попробуйте установить для followRedirects значение true:

https://api.flutter.dev/flutter/dart-io/HttpClientRequest/followRedirects.html


ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

  • Значение по умолчанию для request.followRedirects в любом случае оказывается "истинным". Это не повредит явно установить его ... но это объясняет, почему поведение не изменилось.

  • Per this post :

HTTP-клиент Dart не будет следовать перенаправлениям для POST, если код ответа не равен 303. Он следует за перенаправлениями 302 для GET или HEAD.

Правильный способ обработки перенаправлений в запросах POST - это вручную реализовать подходящую стратегию для вашего варианта использования:

  var response = await client.post(...);
  if (response.statusCode == 301 || response.statusCode == 302) {
    // send post request again if appropriate
  }
...