在很多时候,后端为了安全都会有一些请求头的限制,只有请求头对了,才能正确返回数据。这虽然限制了一些人恶意请求数据,但是对于我们聪明的程序员来说,就是形同虚设。下面就以极客时间为例,讲一下通过伪造请求头,来获取极客时间首页主要数据。(不保证接口和安全措施一直可用哦)

查看极客时间的数据端口

如果你是一个前端,这套流程可能已经烂熟于心,先找出掘金的一个端口,来进行分析。

首先在浏览器端打开极客时间(我用的是chrome浏览器):https://time.geekbang.org/ ,然后按F12打开浏览器控制台,来到NetWork选项卡,再选择XHR选项卡,这时候刷新页面就会出现异步请求的数据。我们选择topList这个接口来进行查看。

拷贝地址:https://time.geekbang.org/serv/v1/column/topList

我们就以这个接口为案例,来获取它的数据。

非法的请求

注意的是,这时候我们并没有设置请求头,为的是演示我们不配置请求头时,是无法获取数据的,它会返回一个451的错误。

451:就是非法请求,你的请求不合法,服务器决绝了请求,也什么都没给我们返回。代码如下:

  1. import 'package:flutter/material.dart';
  2. import 'package:dio/dio.dart';
  3.  
  4. class HomePage extends StatefulWidget {
  5. _HomePageState createState() => _HomePageState();
  6. }
  7.  
  8. class _HomePageState extends State<HomePage> {
  9. String showText='还没有请求数据';
  10. @override
  11. Widget build(BuildContext context) {
  12. return Container(
  13. child: Scaffold(
  14. appBar: AppBar(title: Text('请求远程数据'),),
  15. body: SingleChildScrollView(
  16. child: Column(
  17. children: <Widget>[
  18. RaisedButton(
  19. onPressed: _jike,
  20. child: Text('请求数据'),
  21. ),
  22. Text(showText)
  23. ],
  24. ),
  25. ),
  26. ),
  27. );
  28. }
  29.  
  30. void _jike(){
  31. print('开始向极客时间请求数据............');
  32. getHttp().then((val){
  33. setState(() {
  34. showText=val['data'].toString();
  35. });
  36. });
  37. }
  38.  
  39. Future getHttp()async{
  40. try{
  41. Response response;
  42. Dio dio = new Dio();
  43. response =await dio.get("https://time.geekbang.org/serv/v1/column/topList");
  44. print(response);
  45. return response.data;
  46. }catch(e){
  47. return print(e);
  48. }
  49. }
  50.  
  51. }

这时候我们运行,点击请求数据按钮,会返现控制台无情的输出了异常消息。

  1. I/flutter ( ): DioError [DioErrorType.RESPONSE]: Http status error []
  2. E/flutter ( ): [ERROR:flutter/shell/common/shell.cc()] Dart Error: Unhandled exception:

伪造请求头

新建一个文件夹,起名叫作config,然后在里边新建一个文件httpHeaders.dart,把请求头设置好,请求头可以在浏览器中轻松获得Request Headers,复制获得后需要进行改造。

  1. const httpHeaders={
  2. 'Accept': 'application/json, text/plain, */*',
  3. 'Accept-Encoding': 'gzip, deflate, br',
  4. 'Accept-Language': 'zh-CN,zh;q=0.9',
  5. 'Connection': 'keep-alive',
  6. 'Content-Type': 'application/json',
  7. 'Cookie': '_ga=GA1.2.676402787.1548321037; GCID=9d149c5-11cb3b3-80ad198-04b551d; _gid=GA1.2.359074521.1550799897; _gat=1; Hm_lvt_022f847c4e3acd44d4a2481d9187f1e6=1550106367,1550115714,1550123110,1550799897; SERVERID=1fa1f330efedec1559b3abbcb6e30f50|1550799909|1550799898; Hm_lpvt_022f847c4e3acd44d4a2481d9187f1e6=1550799907',
  8. 'Host': 'time.geekbang.org',
  9. 'Origin': 'https://time.geekbang.org',
  10. 'Referer': 'https://time.geekbang.org/',
  11. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
  12. };

有了请求头文件后,可以引入请求头文件,并进行设置,主要代码就这两句。

  1. import '../config/httpHeaders.dart';
  2.  
  3. dio.options.headers = httpHeaders;

完成代码如下:

  1. import 'package:flutter/material.dart';
  2. import 'package:dio/dio.dart';
  3. import '../config/httpHeaders.dart';
  4.  
  5. class HomePage extends StatefulWidget {
  6. _HomePageState createState() => _HomePageState();
  7. }
  8.  
  9. class _HomePageState extends State<HomePage> {
  10. String showText='还没有请求数据';
  11. @override
  12. Widget build(BuildContext context) {
  13. return Container(
  14. child: Scaffold(
  15. appBar: AppBar(title: Text('请求远程数据'),),
  16. body: SingleChildScrollView(
  17. child: Column(
  18. children: <Widget>[
  19. RaisedButton(
  20. onPressed: _juejin,
  21. child: Text('请求数据'),
  22. ),
  23. Text(showText)
  24. ],
  25. ),
  26. ),
  27. ),
  28. );
  29. }
  30.  
  31. void _juejin(){
  32. print('开始向极客时间请求数据..................');
  33. getHttp().then((val){
  34. setState(() {
  35. showText=val['data'].toString();
  36. });
  37. });
  38. }
  39.  
  40. Future getHttp()async{
  41. try{
  42. Response response;
  43. Dio dio = new Dio();
  44. dio.options.headers= httpHeaders;
  45. response =await dio.get("https://time.geekbang.org/serv/v1/column/topList");
  46. print(response);
  47. return response.data;
  48. }catch(e){
  49. return print(e);
  50. }
  51. }
  52.  
  53. }

现在运行程序就可以正常获取数据了。

总结: 学习了Dio中如何通过伪造请求头来获取别人接口的数据,学会了这个是非常有用的,以后我们想自己作练习Demo时就不用为后端接口而犯愁了。当然查看接口的方法比较初级,我们可以使用向Fiddler这样的专用软件来获得接口。

Flutter dio伪造请求头获取数据的更多相关文章

  1. Flutter实战视频-移动电商-08.Dio基础_伪造请求头获取数据

    08.Dio基础_伪造请求头获取数据 上节课代码清楚 重新编写HomePage这个动态组件 开始写请求的方法 请求数据 .但是由于我们没加请求的头 所以没有返回数据 451就是表示请求错错误 创建请求 ...

  2. Flutter移动电商实战 --(8)dio基础_伪造请求头获取数据

    在很多时候,后端为了安全都会有一些请求头的限制,只有请求头对了,才能正确返回数据.这虽然限制了一些人恶意请求数据,但是对于我们聪明的程序员来说,就是形同虚设.这篇文章就以极客时间 为例,讲一下通过伪造 ...

  3. 08-Flutter移动电商实战-dio基础_伪造请求头获取数据

    在很多时候,后端为了安全都会有一些请求头的限制,只有请求头对了,才能正确返回数据.这虽然限制了一些人恶意请求数据,但是对于我们聪明的程序员来说,就是形同虚设.这篇文章就以极客时间 为例,讲一下通过伪造 ...

  4. flutter dio网络请求封装实现

    flutter dio网络请求封装实现 文章友情链接:   https://juejin.im/post/6844904098643312648 在Flutter项目中使用网络请求的方式大致可分为两种 ...

  5. 爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,loads,dump,load方法介绍

    爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,load ...

  6. 一、表单和ajax中的post请求&&后台获取数据方法

    一.表单和ajax中的post请求&&后台获取数据方法 最近要做后台数据接收,因为前台传来的数据太过于混乱,所以总结了一下前台数据post请求方法,顺便写了下相对应的后台接收方法. 前 ...

  7. Python Socket请求网站获取数据

     Python Socket请求网站获取数据 ---阻塞 I/O     ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...

  8. React 中的 AJAX 请求:获取数据的方法

    React 中的 AJAX 请求:获取数据的方法 React 只是使用 props 和 state 两处的数据进行组件渲染. 因此,想要使用来自服务端的数据,必须将数据放入组件的 props 或 st ...

  9. nodejs发起HTTPS请求并获取数据

    摘要:在网站中有时候需要跨域请求数据,直接用Ajax无法实现跨域,采用其他方式需要根据不同的浏览器做相应的处理.用Nodejs可以很好的解决这些问题,后台引用HTTPS模块,发送和返回的数据均为JSO ...

随机推荐

  1. VSCode 的PHP常用插件及安装

    一.在程序中打断点调试:PHP Debug 二.高级自动完成和重构支持(代码智能提示):PHP IntelliSense 配置: "php.suggest.basic": fals ...

  2. Eclipse使用技巧小结

    前言:自学Java以来,就一直用eclipse,这款ide深受广大新手和大牛喜爱.学会使用其中的技巧,越用越熟练,开发也就越快捷方便.话不多说,直接上小结吧. 一.快捷键 1.提示 :A|t+/ 2. ...

  3. python numpy的基本操作

    站长资讯平台:文章目录0.NumPy 与 ndarry1.数组属性查看:类型.尺寸.形状.维度2.numpy元素中数据存储方式,数据类型,类型转换2.1 查看元素数据存储类型2.2 元素数据存储类型转 ...

  4. 分布式可扩展存储系统 BaikalDB

    BaikalDB是一个分布式可扩展的存储系统,支持PB级结构化数据的随机实时读写. 提供MySQL接口,支持常用的SELECT,UPDATE,INSERT,DELETE语法.提供各种WHERE过滤.G ...

  5. Pandas to_sql TypeError: sequence item 0: expected str instance, dict found

    问题介绍 打印了一下数据格式,并未发现问题.如果说是字典实例引起的. 我猜测也是extra字段引起的,因为extra字段是一个json字段.根据网上的提示要对这样的格式进行强转str. 其他发现:pd ...

  6. redis在linux服务器部署

    0)参考资料 http://www.cnblogs.com/liuling/p/2014-4-19-02.html 1)下载安装包地址 http://download.redis.io/release ...

  7. csv测试类。用起来,就是那么简单。每个单元格都是以逗号分隔

    package com.hyxt.wxpay.util; import java.io.File; import java.util.ArrayList; import java.util.List; ...

  8. 解决每次执行Java等命令时都要重新source /etc/profile后才能执行,否则找不到命令

    linux mint 我们通常将环境变量设置在/etc/profile这个文件中,这个文件是全局的. /etc/profile:在登录时,操作系 统定制用户环境时使用的第一个文件 ,此文件为系统的每个 ...

  9. Java中通过Array.sort()对数组从大到小排序

    package com.itheimajavase; import java.util.Arrays; import java.util.Comparator; public class Day01 ...

  10. dblclick([[data],fn]) 当双击元素时,会发生 dblclick 事件。

    dblclick([[data],fn]) 概述 当双击元素时,会发生 dblclick 事件.大理石量具哪家好 当鼠标指针停留在元素上方,然后按下并松开鼠标左键时,就会发生一次 click.在很短的 ...