多くの場合、安全のためのバックエンドは、正しいデータを返すために、リクエストヘッダ、ヘッドのための唯一のリクエストに応じていくつかの制限があるでしょう。これは悪質な要求データの数を制限しますが、私たちの巧妙なプログラマが、それは無用です。ここだ极客时间
、頭について話をする取得するために要求鍛造により、例えば、极客时间
自宅の鍵データを。(無保証・インタフェースおよびセキュリティ対策がああ利用されていません)
ビューオタク時刻データポート
あなたは、フロントエンドであれば、このプロセスはすでに分析のために、ポートデンバーを見つけるために、心で知っているかもしれません。
まず、(私はChromeブラウザを使用)ブラウザオタクの時間を開きますhttps://time.geekbang.org/
し、ブラウザのコンソールを開くには、F12キーを押し、来たNetWork
タブを、[選択] XHR
タブを、非同期データ要求が表示されます。この時点でページを更新。我々はそれを表示するには、このインタフェースをほん選びました。
URLをコピーします。https://time.geekbang.org/serv/v1/column/topList
私たちは、そのデータを取得するために、一例として、このインタフェースです。
リクエストが無効です
我々はリクエストヘッダがデータを取得することはできません設定しないことを実証するために、それが返されます、この時点で我々は、リクエストヘッダを設定しない、ということに注意してください451
エラーを。
451
:それは不正な要求である、あなたの要求が正当なものではありません、我々はに戻ることは何もない、サーバ要求をやってのけます。コードは以下の通りであります:
インポート' パッケージ:フラッター/ material.dart ' ; インポート' パッケージ:DIO / dio.dart ' ; クラスホームページStatefulWidget {延び _HomePageState createState() => _HomePageState(); } クラス _HomePageStateはステート<ホームページ>延び{ 文字列showText = ' 还没有请求数据を' 。 @Overrideの ウィジェットのビルド(BuildContextコンテキスト){ 返す(コンテナの 子:足場( アプリケーションバー:アプリケーションバー(タイトル:テキスト(' 请求远程数据' )、)、 本体:SingleChildScrollView( 子:カラム( 子供: <ウィジェット> [ RaisedButton( onPressed:_jike、 子供:テキスト(' 要求データ' ) )、 本文(showText) ]、 )、 )、 )、 ); } ボイド_jike( ){ 印刷(' ............ポールオフにデータ要求の開始時刻' ) 。getHttp()を((ヴァル){ SETSTATE((){ showText =ヴァル[ 'データ' ] .toString(); }); }); } 将来getHttp()非同期{ 試み{ レスポンス応答。 ディオDIO = 新しいディオ(); 応答は = 待つ DIO。取得(" https://time.geekbang.org/serv/v1/column/topList " ); プリント(応答)。 リターンresponse.data。 } キャッチ(E){ 戻りプリント(E); } } }
我々は、データを要求するボタンをクリックして実行します。この時間は、コンソールは、冷酷な例外メッセージの電流出力に戻ります。
I /フラッター(6942):DioError [DioErrorType.RESPONSE]:HTTPのステータスエラー[ 451 ] E /フラッター(6942):[ERROR:フラッター/シェル/共通/ shell.cc(184)]ダートエラー:未処理の例外:
リクエストヘッダの偽造
呼ばれる名前の新しいフォルダを作成config
し、その後に内部のファイルを作成するhttpHeaders.dart,
リクエストヘッダに設定されて、あなたは簡単にリクエストヘッダがブラウザにヘッダを請求することができ、得られたコピーを変換する必要があります。
CONST httpHeaders = { ' 受け入れ':' アプリケーション/ JSONを、text / plainで、* / * ' 、 ' 符号化を受け入れ':' GZIPを、収縮、BR ' 、 ' 言語が受け入れ':' ZH ZH-CN、; Q = 0.9 ' ' 接続':' キープアライブ' ' Content-Typeの':' アプリケーション/ jsonの' ' クッキー":"_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 ' ' ホスト':' time.geekbang.org ' ' 起源':' https://time.geekbang.org ' ' リファラー':' https://time.geekbang.org/ " 、 「ユーザーエージェント」:Mozilla / 5.0(Windows NTの10.0; Win64の、のx64)のAppleWebKit / 537.36(KHTML、ヤモリ等)クローム/ 70.0.3538.77サファリ/ 537.36 ' };
要求ヘッダーと、要求ヘッダーを導入することができ、そして、この二つの主なコードが提供されます。
インポート' ../config/httpHeaders.dart ' ; dio.options.headers = httpHeaders。
次のように完全なコードは次のとおりです。
インポート' パッケージ:フラッター/ material.dart ' ; インポート' パッケージ:DIO / dio.dart ' ; インポート' ../config/httpHeaders.dart ' ; クラスホームページStatefulWidget {延び _HomePageState createState() => _HomePageState(); } クラス _HomePageStateはステート<ホームページ>延び{ 文字列showText = ' 还没有请求数据を' 。 @Overrideの ウィジェットのビルド(BuildContextコンテキスト){ 返す(コンテナの 子:足場( (テキスト:アプリケーションバー(タイトル:アプリケーションバーを"リモートデータを要求する')、) :SingleChildScrollView体( 子供:カラム( 子供: <ウィジェット> [ RaisedButton( onPressed:_juejin、 子供:テキスト(' リクエストデータ」)、 )、 テキスト(showText) ]、 )、 )、 ) ); } ボイド_juejin(){ プリント(' ..................オフ時間極に要求データを起動' showText ); getHttp()を((ヴァル){。 SETSTATE((){=ヴァル[ ' データ' ] .toString(); }); }); } 将来getHttp()非同期{ 試み{ レスポンス応答。 ディオDIO = 新しいディオ(); dio.options.headers = httpHeaders。 応答は = 待つ DIO。取得(" https://time.geekbang.org/serv/v1/column/topList " ); プリント(応答)。 リターンresponse.data。 } キャッチ(E){ 戻りプリント(E); } } }
今、あなたは、通常のデータを取得することができ、プログラムを実行します。
概要:ディオは、データ・インターフェース・他人を取得する方法を学んだ私たちは練習のデモ中に自分自身を作りたいので、これは、要求を鍛造することにより、非常に有用である学びましたが、バックエンドのインターフェイスのために心配する必要はありません。もちろん、インターフェイスメソッドが比較的ジュニアで見るために、我々はこのような専用ソフトウェアインターフェイスを取得するためにバイオリンを使用することができます。