我正在尝试使用 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 分支中的断点,而不会捕获处理重定向的断点。
我刚刚在docs中找到了解释:
基于 dart:html 的 HTTP 客户端,在浏览器中运行,并由 XMLHttpRequest。该客户端继承了 XMLHttpRequest 的一些限制。它忽略 BaseRequest.contentLength、BaseRequest.persistentConnection、BaseRequest.followRedirects 和 BaseRequest.maxRedirects 字段。它也无法传输请求或响应;仅当所有数据可用时才会发送请求并返回响应。
原因似乎是 XMLHttpRequest 重定向对于客户端来说是不透明的。