重定向循环检测到 Dart

Gui*_*ves 4 rest json dart

我在飞镖中有以下代码

import 'dart:io';
import 'package:http/http.dart' as http;

main() async {
  final url = 'https://jsonplaceholder.typicode.com/users';
  final response = await http.get(url);

  if (response.statusCode == HttpStatus.ok) {
    print(response.body);
  }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是当我查询网址更改为 http://loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil/!ut/p/a1/04_Sj9CPykssy0xPLMnMz0vMAfGjzOLNDH0MPAzcDbz8vTxNDRy9_Y2NQ13CDA0sTIEKIoEKnN0dPUzMfQwMDEwsjAw8XZw8XMwtfQ0MPM2I02-AAzgaENIfrh-FqsQ9wBmoxN_FydLAGAgNTKEK8DkRrACPGwpyQyMMMj0VAcySpRM!/dl5/ d5/L2dBISEvZ0FBIS9nQSEh/pw/Z7_61L0H0G0J0VSC0AC4GLFAD2003/res/id=buscaResultado/c=cacheLevelPage/=/?timestampAjax=1534624870817&concurso=1703

import 'dart:io';
import 'package:http/http.dart' as http;

main() async {
  final url =
      'http://loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil/!ut/p/a1/04_Sj9CPykssy0xPLMnMz0vMAfGjzOLNDH0MPAzcDbz8vTxNDRy9_Y2NQ13CDA0sTIEKIoEKnN0dPUzMfQwMDEwsjAw8XZw8XMwtfQ0MPM2I02-AAzgaENIfrh-FqsQ9wBmoxN_FydLAGAgNTKEK8DkRrACPGwpyQyMMMj0VAcySpRM!/dl5/d5/L2dBISEvZ0FBIS9nQSEh/pw/Z7_61L0H0G0J0VSC0AC4GLFAD2003/res/id=buscaResultado/c=cacheLevelPage/=/?timestampAjax=1534624870817&concurso=1703';
  final response = await http.get(url);

  if (response.statusCode == HttpStatus.ok) {
    print(response.body);
  }
}
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

    Unhandled exception:
Redirect loop detected
#0      IOClient.send (package:http/src/io_client.dart:64:7)
<asynchronous suspension>
#1      BaseClient._sendUnstreamed (package:http/src/base_client.dart:171:38)
<asynchronous suspension>
#2      BaseClient.get (package:http/src/base_client.dart:34:5)
#3      get.<anonymous closure> (package:http/http.dart:47:34)
#4      _withClient (package:http/http.dart:167:20)
<asynchronous suspension>
#5      get (package:http/http.dart:47:3)
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种情况?当我使用浏览器时它可以工作

Gün*_*uer 5

第一个请求以 cookie 和HttpStatus.movedTemporarily重定向到同一 URL 进行响应。
浏览器在跟踪重定向时在其第二个请求中发送 cookie。第二个请求完成,HttpStatus.ok因为它包含预期的 cookie。

import 'dart:io';
import 'package:http/http.dart' as http;

void main() async {
  var url =
      'http://loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil/!ut/p/a1/04_Sj9CPykssy0xPLMnMz0vMAfGjzOLNDH0MPAzcDbz8vTxNDRy9_Y2NQ13CDA0sTIEKIoEKnN0dPUzMfQwMDEwsjAw8XZw8XMwtfQ0MPM2I02-AAzgaENIfrh-FqsQ9wBmoxN_FydLAGAgNTKEK8DkRrACPGwpyQyMMMj0VAcySpRM!/dl5/d5/L2dBISEvZ0FBIS9nQSEh/pw/Z7_61L0H0G0J0VSC0AC4GLFAD2003/res/id=buscaResultado/c=cacheLevelPage/=/?timestampAjax=1534624870817&concurso=1703';
  var isRedirect = true;

  while (isRedirect) {
    final client = http.Client();
    final request = http.Request('GET', Uri.parse(url))
          ..followRedirects = false
          ..headers['cookie'] = 'security=true';
    print(request.headers);
    final response = await client.send(request);

    if (response.statusCode == HttpStatus.movedTemporarily) {
      isRedirect = response.isRedirect;
      url = response.headers['location'];
      // final receivedCookies = response.headers['set-cookie'];
    } else if (response.statusCode == HttpStatus.ok) {
      print(await response.stream.join(''));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

考虑set-cookie从第一个响应中读取标头,并将内容用作下一个请求的 cookie,而不是对其进行硬编码。