CURL使用方法詳解

来源:http://www.cnblogs.com/ariclee/archive/2016/10/24/5993222.html
-Advertisement-
Play Games

php採集神器CURL使用方法詳解 php採集神器CURL使用方法詳解 作者:佚名 更新時間:2016-10-21 作者:佚名 更新時間:2016-10-21 作者:佚名 更新時間:2016-10-21 對於做過數據採集的人來說,cURL一定不會陌生。雖然在PHP中有file_get_content ...


php採集神器CURL使用方法詳解

作者:佚名  更新時間:2016-10-21  

對於做過數據採集的人來說,cURL一定不會陌生。雖然在PHP中有file_get_contents函數可以獲取遠程鏈接的數據,但是它的可控制性太差了,對於各種複雜情況的採集情景,file_get_contents顯得有點無能為力。因此,本文將為你介紹採集神器cURL的使用。

先給大家補充一下file_get_contents函數可以獲取遠程鏈接數據的方法。

<?php
$url = "http://git.oschina.net/yunluo/API/raw/master/notice.txt";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$notice = curl_exec($ch);
echo $notice;
?>

這段代碼會直接使用curl顯示文件內容,但是問題來了,因為curl是php的擴展,有的主機為了安全會金庸curl的,寧外php本地調試的時候也是關閉curl的,所以會發生報錯,所以這段代碼是不可取的,所以雲落對他重新改寫了

<?php
  if (function_exists('curl_init')) {
    $url = "http://git.oschina.net/yunluo/API/raw/master/notice.txt";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    $dxycontent = curl_exec($ch);
    echo $dxycontent;
  } else {
    echo '汗!貌似您的伺服器尚未開啟curl擴展,無法收到來自雲落的通知,請聯繫您的主機商開啟,本地調試請無視';
  }
?>

修改後的版本是對curl擴展做一個判斷,看看伺服器到底有木有打開curl擴展,如果打開了,就直接顯示文件,如果沒打開就顯示一段提示文字。
雖然修複了問題,但是又有一個問題來了,我只是顯示一段文字而已,我也不是是用什麼做什麼大事的,所以我為什麼要寫那麼多的代碼呢??
經過一些瞎掰的檢測,發現file_get_contents獲取遠程文件內容的速度不比curl慢,在一些文件較少的情況下可能還比curl擴展要快得多,所以我又重寫了代碼

<?php echo file_get_contents( "http://git.oschina.net/yunluo/API/raw/master/notice.txt" ); ?>

工具
火狐瀏覽器(FireFox) + Firebug
“工欲善其事,必先利其器。” 在分析案例之前,先讓我們學習一下如何利用神器Firebug獲取我們必要的信息。
使用F12打開Firebug,我們可以得到如圖(一)界面:

1、箭頭圖標是“元素選擇”工具,單擊一次會高亮圖標,同時,滑鼠在頁面內的移動會同時在HTML菜單中選定相應的內容,此時單擊內容則表示選定了該元素,圖標高亮取消。如圖(二)所示:
Firebug查看元素

2、控制台
JS裡面的console.log系列函數的列印就是在這裡輸出。
3、HTML
HTML內容,註意這裡看到的不一定是採集要解析的內容,採集時候對內容的分析,一律以查看源碼(Ctrl+U)為準,這裡只是能快速定位元素的結構,然後再選擇一個比較特殊的參照,在源碼中定位相應的位置。
比如,你在HTML裡面看到一個標簽是<div id="demo" class="demo">Demo</div>,但是你查看源碼時候看到的內容可能是<div class="demo" id="demo">Demo</div>,如果你對採集內容按照前者去做正則匹配,那麼你會得不到結果。
4、CSS
這裡是CSS文件內容
5、腳本
這裡是Javascript文件內容
6、DOM
Dom節點內容
7、網路
每一個請求鏈接的數據,這裡是我們採集要關註和分析的地方,它能夠顯示每一個請求的參數、請求頭、Cookie數據等。在頁面提交會刷新的情況下,需要使用保持,使得頁面請求內容在刷新後仍然留著控制臺中,如圖(三)所示:

另外,火狐還有一款 Tamper data 擴展也能得到請求數據,必要時可以安裝使用。
8、Cookies
Cookie數據

在圖(一)中還看到下麵有很多可選的小菜單項,其中保持是我們要關註的,當選擇它的時候,即使提交表單刷新了頁面,下麵內容區域的數據還是會保留,這個對於分析提交數據特別關鍵。

總結
我們在分析採集請求的時候,主要關心“網路”菜單里的請求數據,必要時候使用“保持”以查看刷新頁面的請求數據,請求前可以使用“清除”先清除下麵的內容。

案例解析
一、簡單的採集
這裡所指的簡單採集,是指一個單一頁面GET請求的採集,它簡單得即使通過file_get_contents函數也能輕鬆獲得頁面返回結果。

代碼片段之file_get_contents

<?php
  $url = 'http://demo.zjmainstay.cn/php/curl/simple.html';
  $content = file_get_contents($url);
  echo $content;

代碼片段之cURL

<?php
  $url = 'http://demo.zjmainstay.cn/php/curl/simple.html';
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回數據不直接輸出
  $content = curl_exec($ch);          //執行並存儲結果
  curl_close($ch);
  
  echo $content;
  

二、需要參數的採集
這種情況,頁面請求需要傳入一些參數,可以是GET請求,也可以是POST請求。這種情況的採集,使用file_get_contents外帶一些參數還是可以實現的,但是這裡我們將不再展示。

代碼片段之cURL GET
這種請求,我們可以選擇搜索引擎作為演示,比如我百度搜索一個詞語“PHP cURL”,在輸入回車後,我們會得到一個類似http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=&tn=baidu&bar=&wd=PHP%20cURL的鏈接,註意這裡的鏈接可能不同瀏覽器、不同入口方式訪問得到不一樣結果,因此不必介意鏈接是否一樣。通過輸入多個關鍵詞並觀察鏈接,我們可以確定 wd 參數就是我們要傳入的動態參數,而其他參數則可以不變,因此得到我們下麵的採集代碼。

<?php
  $keyword  = 'PHP cURL';
  $url    = 'http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=&tn=baidu&bar=&wd=' . urlencode($keyword);
  
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回數據不直接輸出
  $content = curl_exec($ch);          //執行並存儲結果
  curl_close($ch);
  
  echo $content;

有些時候,一些參數並不是必須的,這時候我們可以刪掉它,比如上面的鏈接可以只保留http://www.baidu.com/s?ie=utf-8&wd=PHP%20cURL,ie=utf-8 這個參數可能影響結果的編碼,所以暫且留著它。就這樣簡單的代碼,我們就可以採集到百度搜索的結果了。

代碼片段之cURL POST
對於POST類型的請求,我們平時並不少見,比如有些搜索就是使用POST方式提交,這時候我們就需要使用POST類型來提交參數了。這個在PHP cURL裡面有相應的參數:CURLOPT_POST 和 CURLOPT_POSTFIELDS , CURLOPT_POST 的設置可以指定當前提交是否為POST方式,CURLOPT_POSTFIELDS則用於設定提交的參數,可以是參數串,也可以是參數數組,比如:

curl_setopt($ch, CURLOPT_POSTFIELDS, 'ie=utf-8&wd=PHP%20cURL');

或

curl_setopt($ch, CURLOPT_POSTFIELDS, array(
  'ie'  => 'utf-8',
  'wd'  => 'PHP%20cURL',
));

下麵是我做的一個POST模擬搜索PHP POST 搜索,後端是使用了前面的百度關鍵詞搜索,基本原理就是,客戶端提交一個關鍵詞到我伺服器,我伺服器使用該關鍵詞請求百度的搜索,然後得到結果,返回到客戶端。
如圖(四)是利用Firebug對請求數據的分析,得到我們需要提交的請求鏈接和請求參數:

然後下麵是我們的代碼:

<?php
  $keyword  = 'PHP cURL';
  //參數方法一
  // $post    = 'wd=' . urlencode($keyword);
  
  //參數方法二
  $post    = array(
    'wd'    => urlencode($keyword),
  );
  $url    = 'http://demo.zjmainstay.cn/php/curl/search.php';
  
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回數據不直接輸出
  curl_setopt($ch, CURLOPT_POST, 1);      //發送POST類型數據
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //POST數據,$post可以是數組,也可以是拼接
  $content = curl_exec($ch);          //執行並存儲結果
  curl_close($ch);
  
  var_dump($content);

三、需要Referer的採集
對於一些程式,它可能判斷來源網址,如果發現referer不是自己的網站,則拒絕訪問,這時候,我們就需要添加CURLOPT_REFERER參數,模擬來路,使得程式能夠正常採集。

 

<?php
  $keyword  = 'PHP cURL';
  //參數方法一
  // $post    = 'wd=' . urlencode($keyword);
  
  //參數方法二
  $post    = array(
    'wd'    => urlencode($keyword),
  );
  $url    = 'http://demo.zjmainstay.cn/php/curl/search_refer.php';
  $refer   = 'http://demo.zjmainstay.cn/';  //來路地址
  
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回數據不直接輸出
  curl_setopt($ch, CURLOPT_REFERER, $refer);  //來路模擬
  curl_setopt($ch, CURLOPT_POST, 1);      //發送POST類型數據
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //POST數據,$post可以是數組,也可以是拼接
  $content = curl_exec($ch);          //執行並存儲結果
  curl_close($ch);
  
  var_dump($content);

search_refer.php的源碼如下,做了簡單的Referer判斷攔截:

<?php
  if(empty($_POST['wd'])) {
    exit('Deny empty params.');
  }
  
  //Referer判斷
  if(stripos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) === false) {
    exit('Deny');
  }
  
  $keyword  = addslashes(trim(strip_tags($_POST['wd'])));
  $url    = 'http://www.baidu.com/s?ie=utf-8&wd=' . urlencode($keyword);
  
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回數據不直接輸出
  $content = curl_exec($ch);          //執行並存儲結果
  curl_close($ch);
  
  echo $content; 

四、需要cookie支持的採集
對於模擬登錄的應用,單單提交參數和模擬來路並不能解決問題,這時候我們就需要保存或者提交相應的Cookie參數,這個在PHP cURL裡面也提供了相應的參數:
CURLOPT_COOKIE: 直接使用字元串方式提交cookie參數
CURLOPT_COOKIEFILE: 使用文件方式提交cookie參數
CURLOPT_COOKIEJAR: 保存提交後反饋的cookie數據

下麵是PHP100的模擬登錄示例:

 

<?php 
header("content-Type: text/html; charset=UTF-8");
$cookie_file = tempnam('./temp', 'cookie');
$login_url="http://bbs.php100.com/login.php";
$post_fields="cktime=36000&step=2&pwuser=username&pwpwd=password";

//提交登錄表單請求
$ch=curl_init($login_url);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_fields);
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file); //存儲提交後得到的cookie數據
curl_exec($ch);
curl_close($ch);

//登錄成功後,獲取bbs首頁數據
$url="http://bbs.php100.com/index.php";
$ch=curl_init($url);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_COOKIEFILE,$cookie_file); //使用提交後得到的cookie數據做參數
$contents=curl_exec($ch);
curl_close($ch);
//轉碼顯示
echo iconv('gbk', 'UTF-8', $contents);

五、壓縮網頁採集(gzip)
有些沒有接觸過壓縮頁面的朋友估計會在這裡被坑死,因為他們會發現採集回來的內容是亂碼,並且無論使用iconv還是強大的mb_convert_encoding都無法還原數據,然後又沒有概念,各種抓狂卻找不到方法,哈哈,我曾經也是這樣~
如圖(五)是亂碼表現形式:

還好最後功夫不負有心人,還是找到了,它就是CURLOPT_ENCODING參數。
比如,採集搜狐的新聞時候就遇到gzip壓縮問題,下麵是示例:

<?php
  $url = 'http://news.sohu.com/';
  
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回數據不直接輸出
  curl_setopt($ch, CURLOPT_ENCODING, "gzip"); //指定gzip壓縮
  $content = curl_exec($ch); //執行並存儲結果
  curl_close($ch);
  echo $content;

手冊說明:支持的編碼有"identity","deflate"和"gzip"。如果為空字元串"",請求頭會發送所有支持的編碼類型。
後面一句表明,使用curl_setopt($ch, CURLOPT_ENCODING, "");也是可以的,但是不能不加這個參數。

六、SSL鏈接的採集
有些請求鏈接是https類型的,這時候使用cURL採集可能會失敗,這時候,我們可以使用 var_dump(curl_error($ch));的方法列印錯誤提示,然後根據錯誤提示查找相應的解決方案。比如SSL錯誤常見提示:SSL certificate problem: unable to get local issuer certificate,這時候,我們就需要利用參數:CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 來禁用SSL證書的驗證,我嘗試過只使用CURLOPT_SSL_VERIFYPEER參數禁用失敗,所以大家最好同時使用兩個參數。
下麵是代碼示例:

 

<?php
  $searchStr = 'RC376981638HK';
  $post  = 'accion=LocalizaUno&numero='.$searchStr.'&ecorreo=&numeros=';

  $url  = 'https://aplicacionesweb.correos.es/localizadorenvios/track.asp';

  $ch         = curl_init($url);       //初始化curl
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    //返回數據不直接輸出
  curl_setopt($ch, CURLOPT_POST, 1);         //發送POST類型數據
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);    //POST數據,$post可以是數組,也可以是拼接參數串
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  //SSL 報錯時使用
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  //SSL 報錯時使用
  $contents = curl_exec($ch);               //執行並存儲結果
  // var_dump(curl_error($ch));            //獲取失敗是使用(採集錯誤提示)
  curl_close($ch);
  echo $contents;

七、代理採集
大家都知道,國記憶體在萬惡的牆,所以,假如我們需要獲取某些被牆數據時,就需要用到國外代理伺服器;又或者我們需要採集大量數據時,需要不斷切換IP,也會用到代理。
使用代理在PHP cURL裡面有幾個相對應的參數:CURLOPT_PROXY、CURLOPT_PROXYPORT 和 CURLOPT_PROXYUSERPWD,還有另外幾個,這裡不列舉。
CURLOPT_PROXY 指定代理IP參數
CURLOPT_PROXYPORT 指定代理埠參數
CURLOPT_PROXYUSERPWD 指定需要驗證的代理的賬號密碼,"[username]:[password]"格式的字元串

關於代理賬號獲取,大家自己發揮,我這裡提供網上搜索到的一個列表:cURL 高匿代理

下麵是代理採集示例:

 

<?php
  $url = 'http://demo.zjmainstay.cn/php/curl/dump_ip.php?t=' . time();
  
  echo "本地IP:" . file_get_contents($url) . "\n偽造IP:";
  
  $ip   = '183.224.1.116';
  $port  = '80';
  
  //偽造請求頭參數,如果是高匿代理這裡不需要提供
  $header = array(
    'X-FORWARDED-FOR: ' . $ip,
    'CLIENT-IP: ' . $ip,
  );
  
  $ch         = curl_init($url); //初始化curl
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  curl_setopt($ch, CURLOPT_PROXY, $ip);
  curl_setopt($ch, CURLOPT_PROXYPORT, $port);

  $content = curl_exec($ch); //執行並存儲結果
  curl_close($ch);
  
  echo $content;

八、 多線程採集
對於大量採集工作,為了提高採集效率,使用PHP cURL提供的多線程採集是必不可少的。手冊上提供的多線程採集例子好像都不太好用,我剛開始也從裡面測試了幾個例子,但是發現都是執行卡死,根本無法執行完成,前幾天突然又測試了一下,然後發現curl_multi_info_read函數下麵的Example #1是可以執行的,它的內容在$res上,但是沒有列印出來,而且雅虎的請求比較慢,會卡住,前面兩個鏈接都能正常返回。
不過,還好當時的例子不好用,然後我經過搜索找到了一個很厲害的項目,CurlMulti ,它對PHP cURL Multi 進行了一個良性擴展的封裝,能夠很好地提供採集支持。
關於CurlMulti的使用我就不多介紹,官網上面提供了demo,使用過程有技術難題可以直接加入Q群討論,作者@Ares 和其他的採集大牛都會提供技術解答幫助。
下麵是PHP cURL Multi的一個簡單示例:

 

<?php
$urls = array(
  "http://demo.zjmainstay.cn/php/curl/curl_multi_1.php",
  "http://demo.zjmainstay.cn/php/curl/curl_multi_2.php",
);

$mh = curl_multi_init();

foreach ($urls as $i => $url) {
  $conn[$i] = curl_init($url);
  curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1); //不直接輸出結果
  curl_multi_add_handle($mh, $conn[$i]);
}

$active = null;
$res = array();
do {
  $status = curl_multi_exec($mh, $active);
  $info = curl_multi_info_read($mh);
  if (false !== $info) {
    //採集信息處理
    $res[] = array(
      'content'  => curl_multi_getcontent($info['handle']),
      'info'   => $info,
    );
    curl_close($info['handle']);
  }
} while ($status === CURLM_CALL_MULTI_PERFORM || $active);

curl_multi_close($mh);

var_dump($res);

九、302跳轉(301跳轉)
對於一些應用,比如模擬登錄,如果遇上302跳轉,會導致cookie丟失而使得模擬登錄失敗,請求現象如圖(六)所示:

這個時候,可以使用:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

關於CURLOPT_FOLLOWLOCATION,手冊說明是:

啟用時會將伺服器伺服器返回的"Location: "放在header中遞歸的返回給伺服器,使用CURLOPT_MAXREDIRS可以限定遞歸返回的數量。
我個人理解,通俗點講就是後面的跳轉會繼續跟蹤訪問,而且cookie在header裡面被保留了下來。

十、模擬上傳文件
在PHP手冊的curl_setopt函數中,關於CURLOPT_POSTFIELDS有如下描述:

全部數據使用HTTP協議中的"POST"操作來發送。要發送文件,在文件名前面加上@首碼並使用完整路徑。這個參數可以通過urlencoded後的字元串類似'para1=val1¶2=val2&...'或使用一個以欄位名為鍵值,欄位數據為值的數組。如果value是一個數組,Content-Type頭將會被設置成multipart/form-data。

對於上傳文件,這句話包含兩個信息:

1. 要上傳文件,post的數據參數必須使用數組,使得Content-Type頭將會被設置成multipart/form-data。
2. 要上傳文件,在文件名前面加上@首碼並使用完整路徑。
因此,模擬文件上傳可以按照如下實現:

//上傳D盤下的test.jpg文件,文件必須存在,否則curl處理失敗且沒有任何提示
$data = array('name' => 'Foo', 'file' => '@d:/test.jpg');

$ch = curl_init('http://localhost/upload.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);

本地測試的時候,在upload.php文件中列印出\\(_POST和\$_FILES即可驗證是否上傳成功,如下: ``` <?php print_r(\)_POST);
print_r($_FILES);

輸出結果類似:

Array ( [name] => Foo ) Array ( [file] => Array ( [name] => test.jpg [type] => application/octet-stream [tmp_name] => D:\xampp\tmp\php2EA0.tmp [error] => 0 [size] => 139999 ) )

關於CURLOPT_POSTFIELDS的賦值,另外補充一句描述:
傳遞一個數組到CURLOPT_POSTFIELDS,cURL會把數據編碼成 multipart/form-data,而然傳遞一個URL-encoded字元串時,數據會被編碼成 application/x-www-form-urlencoded。

即:

curl_setopt(\(ch, CURLOPT_POSTFIELDS, 'param1=val1¶m2=val2&...'); 和 curl_setopt(\)ch, CURLOPT_POSTFIELDS, array('param1' => 'val1', 'param2' => 'val2', ...));

這樣一個功能強大的採集神器cURL的使用方法為大家介紹到這,希望對大家的學習有所幫助。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ASP.NET Aries JSAPI 文檔說明:AR.Form、AR.Combobox ...
  • ASP.NET Aries JSAPI 文檔說明:AR.Utility ...
  • 最近新學的,C#中得三層架構 ————2016-10-23 表示層 業務邏輯層(BLL) 數據訪問層(DAL) 關聯:產生依賴關係 描述:三層體繫結構就是在客戶端和資料庫之間加一個中間層,通常情況下客戶端不能直接和資料庫進行交互,而是通過中間層和數據層進行交互的。 【表示層】 主要負責完成用戶和系統 ...
  • 在C#中,用於存儲的結構較多,如:DataTable,DataSet,List,Dictionary,Stack等結構,各種結構採用的存儲的方式存在差異,效率也必然各有優缺點。現在介紹一種後進先出的數據結構。 談到存儲結構,我們在項目中使用的較多。對於Task存儲結構,棧與隊列是類似的結構,在使用的 ...
  • C#學習中的一些演算法排序,不完整, @^_^@ 2016-10-23 ****************************************************************************************** 1.冒泡排序 是將對數組相鄰的元素進行比較,將最 ...
  • 文檔目錄 本節內容: 簡介 關於ISettingStore 定義設置 setting scope(設置範圍) 重寫設置定義 獲取設置值 服務端 客戶端 修改設置 關於緩存 關於ISettingStore setting scope(設置範圍) 重寫設置定義 服務端 客戶端 簡介 每個應用必需存儲一些 ...
  • 在Common中新建一個CookieHelper,全局調用 ...
  • 隨著項目深入,需要移植到安卓上,問題來了,QML安卓適配! 幸好PC端程式和手機屏幕長寬比例相似。雖然單位像素,尺寸不同,通過比例縮放,可以實現組件PC和安卓通用代碼。 第一步:定義全局的轉換函數(300,500是你的PC端設計尺寸) 第二步:將所有相關尺寸的都通過上面的轉換函數計算新值 第三步:對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...