我在飞镖中有以下代码
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)
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)
为什么会出现这种情况?当我使用浏览器时它可以工作
第一个请求以 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,而不是对其进行硬编码。