Flutter - обрабатывать код состояния 302 в запросе POST - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь отправить запрос post во флаттере с пакетом DIO.

Вот запрос:

getSessionId() async {

  var csrf = await getCsrftoken();

  var dio = new Dio(new Options(
      baseUrl: "http://xxxxxxx/accounts/login/",
      connectTimeout: 5000,
      receiveTimeout: 100000,
      // 5s
      headers: {
        'Cookie': "csrftoken=" + csrf
      },
      contentType: ContentType.JSON,
      // Transform the response data to a String encoded with UTF8.
      // The default value is [ResponseType.JSON].
      responseType: ResponseType.PLAIN
  ));

  var response;
  response = await dio.post("http://xxxxxxx/accounts/login/",
    data: {
      "username": "xxxxx",
      "password": "xxxxx",
      "csrfmiddlewaretoken" : csrf
    },
    options: new Options(
        contentType: ContentType.parse("application/x-www-form-urlencoded")),
  );

  print("StatusCode: ");
  print(response.statusCode);
  print("Response cookie: ");   //THESE ARE NOT PRINTED
  print(response.headers);
}

После запроса я получаю:

E/flutter ( 4567): [ERROR:flutter/shell/common/shell.cc(181)] Dart Error: Unhandled exception:
    E/flutter ( 4567): DioError [DioErrorType.RESPONSE]: Http status error [302]
    E/flutter ( 4567): #0      getSessionId (file:///C:/get_order/lib/main.dart:36:14)
    E/flutter ( 4567): <asynchronous suspension>

Из этого запроса мне нужно только получить файл cookie sessionid, но функция остановилась с необработанным исключением.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Я решил таким образом:

Добавьте followRedirects: false и validateStatus: (status) { return status < 500;} к запросу.Вот так:

var response = await Dio().post("http://myurl",
    options: Options(
        followRedirects: false,
        validateStatus: (status) { return status < 500; }
    ),
);

Таким образом, вы можете получить от 302 каждый headers и другие.

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

Перенаправления для 302 выполняются в ответ на запросы GET или HEAD, а не для POST.Иногда сервер отправляет 302 в ответ на POST (что было в моем случае).В этом случае Dio генерирует исключение, которое вы можете поймать - не забудьте проверить, является ли код состояния сервера 302 или, возможно, это другая ошибка.

try{
    await dio.post( _urlLogin,
      data:{...},
      options: Options(
        contentType: ContentType.parse("application/x-www-form-urlencoded"),          
      )
  );
}on DioError catch(error){
    if(error.response.statusCode == 302){
    // do your stuff here
     }
0 голосов
/ 27 сентября 2018

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

Вы можете увидеть, можете ли вы остановитьсервер отправляет перенаправление в ответ на (предположительно) действительный запрос входа в систему и вместо этого отправляет 200.

Или вы можете попробовать отправить запрос входа в систему как GET, кодируя поля формы в URL, например:

http://xxxxxxx/accounts/login/?username=xxxx&password=yyyy&csrfmiddlewaretoken=zzzz

Вы должны будете URL кодировать любые специальные символы в параметрах.Предположительно, вы тоже захотите использовать HTTPS.

Наконец, URL должен заканчиваться на /?Возможно, стоит попробовать /accounts/login.

...