如何使用 Darts http-package 不遵循重定向? request.followRedirects = false 已设置

问题描述 投票:0回答:1

我正在尝试使用 Flutter 和 Dart 实现一个小型 http 包装器,如下所示:

import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;

class HttpWrapper {
  http.Client httpClient = http.Client();

  Future<http.StreamedResponse> backendHttpRequest(
      String method, String endpoint) async {
    String backendUrlBase = const String.fromEnvironment("backend_url_base");

    var uri = Uri.parse(backendUrlBase + endpoint);
    http.Request request = http.Request(method, uri);
    request.followRedirects = false;

    var response = await httpClient.send(request);

    if (response.isRedirect) {
      debugPrint("Redirecting...");
      // handle redirect
      return response;
    } else {
      return response;
    }
  }
}

我想单独处理重定向,因为服务器可能会将我重定向到不接受 XMLHttpRequests 的端点,这会让我遇到 CORS 问题。如果我可以自己处理重定向响应,这不会成为问题,因为我尝试处理

response.statusCode == 302
- 我的问题是
request.followRedirect = false
似乎根本没有效果。
客户端只是无论我设置什么 followRedirects,都会遵循重定向。

如何解决我的请求不遵循重定向的问题?

谢谢您的帮助!

编辑1:

response.statusCode == 302
更改为
response.isRedirect

编辑2: 我如何产生问题:

我在express中设置了一个示例服务器,如下所示:

const express = require('express');
const app = express();
var cors = require('cors')
const logger = require('morgan');
const PORT = 3000;

app.use(logger('dev'));
app.use(cors()) 

// Without middleware
app.get('/endpointwhichredirects', function (req, res) {
    console.log("Redirecting...");
    res.redirect('/user');
});
 
app.get('/user', function (req, res) {
    res.send("This is the user-page");
});
 
app.listen(PORT, function (err) {
    if (err) console.log(err);
    console.log("Server listening on PORT", PORT);
});

我在 Dart 中使用我的 http-wrapper,如下所示:

HttpWrapper httpWp = HttpWrapper();
res = httpWp.backendHttpRequest('Get', '/endpointwhichredirects');

执行此 Dart 代码时,我的服务器会记录以下内容:

> GET /endpointwhichredirects 302 3.051 ms - 27
> GET /user 304 2.986 ms - -

调试打印“重定向...”永远不会被调用。如果我为

response
的两个返回设置断点,则只会捕获 else 分支中的断点,而不会捕获处理重定向的断点。

flutter dart http http-redirect dart-http
1个回答
0
投票

我刚刚在docs中找到了解释:

基于 dart:html 的 HTTP 客户端,在浏览器中运行,并由 XMLHttpRequest。该客户端继承了 XMLHttpRequest 的一些限制。它忽略 BaseRequest.contentLength、BaseRequest.persistentConnection、BaseRequest.followRedirects 和 BaseRequest.maxRedirects 字段。它也无法传输请求或响应;仅当所有数据可用时才会发送请求并返回响应。

原因似乎是 XMLHttpRequest 重定向对于客户端来说是不透明的。

© www.soinside.com 2019 - 2024. All rights reserved.