整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Jsx(javascript xml)

          Jsx(javascript xml)

          eact定義的一種類似于XML的JS擴展語法,用來簡化創建虛擬DOM

          <!DOCTYPE html>
          <html lang="en">
              <head>
                  <meta charset="UTF-8">
                  <meta name="viewport" content="width=device-width, initial-scale=1.0">
                  <title>jsx</title>
                  <style>
                      .title{
                          background-color: orange:
                          width: 200px;
                      }
                  </style><!--定義個樣式,也可以寫在CSS文件里,引入進來-->
              </head>
          
              <body>
                  <div id="test"></div>
                  <script type="text/javascript" src="../js/react.development.js"></script>
                  <script type="text/javascript" src="../js/react-dom.development.js"></script>
                  <script type="text/javascript" src="../js/babel.min.js"></script>
              </body>
              <script type="text/babel">
                  const myid="lOVE you"
                  const mydata="hellO jsx"
                  const VDOM=( // <!--h2標簽引入樣式,用className,span標簽引入內聯樣式的時候,不是用雙引號,而是雙花括號,-->
                  <div>
                      <h2 className="title" id={myid.toLowerCase()}> 
                          <span style={{color:'red',fontSize:'29px'}}>{mydata.toLowerCase()}</span>
                      </h2>)// <!--標簽中混入JS表達式時要用花括號{},如這里mydata取值 -->
                      //jsx中只能有一個根標簽,比如這里的h2,可以在h2的外面包一層div,就可以寫兩個h2
                      <h2 className="title" id={myid.toUpperCase()}> 
                          <span style={{color:'red',fontSize:'29px'}}>{mydata.toLowerCase()}</span>
                      </h2>)
                      //標簽首字母若是小寫字母,則將該標簽轉為html中同名元素,若html中無該標簽對應的同名元素,則報錯
                      //標簽首字母若是大寫字母,react就去渲染對應的組件,若組件沒有定義,則報錯
                  </div>
          
                  ReactDOM.render(VDOM,document.getElementById('test'))
              </script>
          </html>
          

          一個jsx的小練習

           <script type="text/babel">
                  const data=['A','B','C']
                  const VDOM=(
                      <div>   //js表達式會產生一個值。js語句(代碼),有if,for,switch判斷,
                          <h1>jsx框架</h1>
                          <ul>
                            {
                              data.map((item,index)=>{
                                  return <li key={index}>{item}</li>
                              }) //item拿到data里面對應的值,map遍歷的第二個值是索引值,
                            }
                          </ul>
                      </div>
                  )
                  ReactDOM.render(VDOM,document.getElementById('test'))
              </script>

          對應的網頁如下:

          模塊是向外提供特定功能的js程序,一般就是一個js文件。

          組件比模塊更高一級,比如實現一個網頁的頭部的html,字體,css,js,圖像這些元素組合在一起,就形成了頭部這個組件。

          組件分為函數式組件和類式組件:

          函數式組件:

          <script type="text/babel">
          function MyComponent(){
          return <h2>show the function component</h2>
          }
          ReactDOM.render(<MyComponent/>,document.getElementById('test'))
          //<MyComponent/>要寫上標簽,函數定義首字母需要大寫
          </script>

          執行了ReactDOM.render(<MyComponent/>。。之后,React解析組件標簽,找到MyComponent組件,發現組件是使用函數定義的,隨后調用該函數,將返回的虛擬DOM轉為真是DOM,隨后呈現在頁面中。

          類式組件:

          HTML 頁面中顯示 XML 數據

          在下面的實例中,我們打開一個 XML 文件("cd_catalog.xml"),然后遍歷每個 CD 元素,并顯示HTML 表格中的 ARTIST 元素和 TITLE 元素的值:

          實例

          <html>

          <body>

          <script>

          if (window.XMLHttpRequest)

          {// code for IE7+, Firefox, Chrome, Opera, Safari

          xmlhttp=new XMLHttpRequest();

          }

          else

          {// code for IE6, IE5

          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

          }

          xmlhttp.open("GET","cd_catalog.xml",false);

          xmlhttp.send();

          xmlDoc=xmlhttp.responseXML;

          document.write("<table border='1'>");

          var x=xmlDoc.getElementsByTagName("CD");

          for (i=0;i<x.length;i++)

          {

          document.write("<tr><td>");

          document.write(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);

          document.write("</td><td>");

          document.write(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);

          document.write("</td></tr>");

          }

          document.write("</table>");

          </script>

          </body>

          </html>

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          ttpServer 靜態下載

          先來看一段代碼,啟動一個靜態的http服務

          import CBHttp.code
          
          function main(parm)
          {
              var httpServer=new HttpServer();
              httpServer.startServer();
          	
              while(1)  //主線程不能退出
              {
                  Sleep(1000);
              }
          }
          

          服務啟動好了,假設我們的項目根目錄是E:\cbrotherwork\httpserver,那么我們的服務根路徑就默認是E:\cbrotherwork\httpserver\webroot

          我們新建txt文件E:\cbrotherwork\httpserver\webroot1.txt,在文本里輸入內容Hello HttpServer!。

          然后我們打開本機瀏覽器輸入:http://127.0.0.1:8000/111.txt,你發現你在網頁上訪問到了111.txt

          主流的文件格式都支持下載

          MIME控制

          靜態下載的過程中,有時需要控制可下載的文件格式,那么就要手動調配MIME

          import CBHttp.code
          
          function main(parm)
          {
              var httpServer=new HttpServer();
          	
              httpServer.addMIME("mystyle","text/html");  //添加后綴名為.mystyle,mime為text/html
              httpServer.addMIME("c");  			//添加后綴名為.c,mime類型讓系統自動識別
              httpServer.removeMIME("gif");  		//刪除gif
          	
              var mimiemap=httpServer.getMIME();  	//獲取目前支持的mime類型
          	
              mimiemap.begin();
              do
              {
                  print mimiemap.getKey() + ":" + mimiemap.getValue();
              }
              while(mimiemap.next());		
          	
              httpServer.startServer();
          	
              while(1)
              {
                  Sleep(1000);
              }
          }
          

          運行結果:

          rar:application/octet-stream
          bmp:image/bmp
          xml:application/xml
          html:text/html
          c:text/plain
          js:application/x-javascript
          txt:text/plain
          ico:image/x-icon
          zip:application/zip
          jpg:image/jpeg
          mystyle:text/html
          7z:application/octet-stream
          json:application/json
          swf:application/x-shockwave-flash
          css:text/css
          png:image/png
          

          HttpServer 動態接口

          我們通常需要在用戶調用一個接口時通過一些條件來返回不同的內容,下面我們再通過一段代碼看一下

          import CBHttp.code
          
          class HelloAction
          {
              function DoAction(request,respon)				//這個函數寫法是固定的,request表示客戶端請求信息,respon是回復給客戶機的信息
              {
                  var myTime=new Time();
                  respon.write("now time is:" + myTime.strftime("%Y/%m/%d %H:%M:%S"));
                  respon.flush();
              }	
          }
          
          function main(parm)
          {
              var httpServer=new HttpServer();
              httpServer.addAction("hello.cb",new HelloAction());		//我們注冊接口hello.cb,響應類是HelloAction
              httpServer.startServer();
          	
              while(1)	//主線程不能退出
              {
                  Sleep(1000);
              }
          }
          

          然后我們瀏覽器輸入:http://127.0.0.1:8000/hello.cb,每次訪問返回的都是當前時間。

          接口名字可以是任意字符串,官方建議用統一的后綴,方便跟其他web服務器協作。

          HttpServer 接口

          函數

          描述

          用法

          addAction(name,actobj)

          添加http響應接口,name為接口名字,actobj為響應的Action對象

          httpServer.addAction("hello.cb",actobj)

          startServer(port,listen_ip)

          啟動服務
          port: 監聽端口,默認8000
          listen_ip:監聽IP,不傳值默認為0.0.0.0表示監聽IPV4所有IP
          傳值為字符串"::"表示監聽IPV6全部IP
          傳值為字符串"*"表示監聽IPV6IPV4的全部IP

          httpServer.startServer(port,listen_ip)

          stopServer()

          停止服務

          httpServer.stopServer()

          setRoot(path)

          設置服務器跟目錄,path: 根目錄絕對路徑

          httpServer.setRoot(path)

          setThreadCount(cnt)

          設置響應線程數量,默認10個
          設置大了并發量大但是消耗資源多

          httpServer.setThreadCount(50)

          setNormalAction(actName)

          設置默認響應接口
          訪問
          http://x.x.x.x/后面不帶路徑時默認執行到的界面

          httpServer.setNormalAction("hello.cb")
          httpServer.setNormalAction("hello.html")

          set404Action(actName)

          設置錯誤響應接口,不設置CBrother有默認頁面

          httpServer.set404Action("404.cb")

          setOutTime(t)

          設置請求超時時間,默認10秒,單位為秒

          httpServer.setOutTime(3)

          setMaxReqDataLen(len)

          設置客戶機發送的最大請求數據長度,默認500K,參數單位為(字節)

          httpServer.setMaxReqDataLen(1024 * 1024)

          openLog()

          打開日志,在webroot平級建立log目錄默認關閉,建議打開

          httpServer.openLog()

          closeFileService()

          關閉文件下載服務錄

          httpServer.closeFileService()

          setHttpsCertFile(CRT_PATH,KEY_PATH)

          設置https證書
          如果設置了證書,服務將為https協議,
          CRT_PATH: crt證書路徑
          key: 證書路徑證書與Nginx所需證書相同

          httpServer.setHttpsCertFile("e:/a.crt","e:/a.key")

          setWebSocketModule(name,wsmodule)

          設置websocket模塊來支持websocket協議
          name: 接口名字
          wsmodule:websocket模塊對象

          httpServer.setWebSocketModule(name,wsmodule)

          getMIME()

          獲取服務目前支持的mime格式,返回一個map對象,key為擴展,value為類型

          var map=httpServer.getMIME()

          addMIME(ext,type)

          添加mime類型,ext: 擴展名
          type:類型,type不傳值系統會自動識別

          httpServer.addMIME("txt");
          httpServer.addMIME("mystyle","text/plain");

          removeMIME(ext)

          移除mime類型,ext為擴展名

          httpServer.removeMIME("txt");

          除了stopServer,其他接口都應該在startServer之前調用。

          HttpServer 響應Action類

          響應類必須要有function DoAction(request,respon)函數,如果沒有會注冊失敗。

          這個方法會被多線程調用,如果要訪問公共資源需要加鎖。

          ·request記錄了客戶端請求的信息

          函數

          描述

          用法

          getUrl()

          獲取請求的路徑

          var url=request.getUrl()

          getProperty(name)

          獲取HTTP頭里的參數

          var v=request.getProperty("Content-Type")

          getAllProperty()

          獲取HTTP頭里的所有的參數,返回一個Map對象

          var proMap=request.getAllProperty()

          getParm(name)

          獲取請求鏈接?后面的參數,127.0.0.1?k=v&k1=1

          var v=request.getParm("k")

          getParmInt(name)

          獲取請求鏈接?后面的參數,強轉整形

          var v=request.getParmInt("k1")

          getAllParm()

          獲取請求鏈接?后面的所有參數,返回一個Map對象

          var parmMap=request.getAllParm()

          getData()

          獲取請求post的數據

          var data=request.getData()

          getRemoteIP()

          獲取客戶機IP

          var ip=request.getRemoteIP()

          getMethod()

          獲取請求類型,"GET""POST"

          var method=request.getMethod()

          getCookieCount()

          獲取cookie數量

          var cnt=request.getCookieCount()

          getCookie(index)

          根據索引獲取cookie,返回cookie對象

          var cookie=request.getCookie(0)

          getCookie(cookieName)

          根據名字獲取cookie,如果有重名的cookie返回第一個

          var cookie=request.getCookie("userName")

          getFormData()

          獲取form表單數據,當客戶端以form表單格式提交才返回FormData對象,否則返回null

          var formdata=request.getFormData()

          isKeepAlive()

          客戶端請求是否為保持連接狀態,true為保持連接,false為立即關閉

          var isKeep=request.isKeepAlive()

          isHttps()

          客戶端請求是否為httpstruehttps,falsehttp

          var isKeep=request.isHttps()

          ·respon是返回給客戶端的信息

          函數

          描述

          用法

          addProperty(key,value)

          添加http頭數據,必須為字符串

          respon.addProperty("Access-Control-Allow-Origin","*")

          addCookie(cookie)

          添加cookie

          respon.addCookie(new Cookie("aaa","bbb"))

          setStatus(status)

          設置返回http狀態

          respon.setStatus(200)

          write(data)

          寫入要返回數據

          respon.write("hello")

          flush()

          發送數據

          respon.flush()

          Cookie 類

          在日常開發中,服務器需要通過cookie來判別客戶機身份,CBrother提供了Cookie類來描述http頭中的Set-CookieCookie字段

          函數

          描述

          用法

          setName(name)

          設置cookie的名稱

          myCookie.setName("aaa")

          setValue(v,pwd)

          設置cookie的字段,pwd不傳為明文,傳入密碼會增加一個簽名

          myCookie.setValue("bbb")
          myCookie.setValue("bbb","pwdstr")

          getName()

          獲取cookie的名稱

          var name=myCookie.getName()

          getValue(pwd)

          獲取cookie的字段,pwd不傳返回原文,傳入密碼會檢查簽名

          var cookie=myCookie.getValue()
          var cookie=myCookie.setValue("pwdstr")

          setPath(path)

          設置cookie的有效路徑,不設置默認為'/'

          myCookie.setPath("/aa/cc/")

          setDomain(domain)

          設置cookie的域,默認為空

          myCookie.setDomain("cbrother.net")

          setExpires(timeSeconds)

          設置cookie有效時間,單位為秒,設置為0表示刪除cookie,默認瀏覽器關閉失效

          myCookie.setExpires(300)

          setHttpOnly(boolValue)

          cookieHttpOnly標簽,默認false

          myCookie.setHttpOnly(true)

          getPath()

          獲取cookie的有效路徑

          var path=myCookie.getPath()

          getDomain()

          獲取cookie的域

          var domain=myCookie.getDomain()

          getExpires()

          獲取cookie有效時間

          var t=myCookie.getExpires()

          getHttpOnly()

          獲取cookieHttpOnly標簽

          var httponly=myCookie.getHttpOnly()

          其中帶密碼的setValue方法會用密碼和原始明文算一個md5值作為cookie簽名,這樣保證了cookie不可被偽造,一般可以用于登陸狀態驗證。當然,在一些安全性要求比較高的場景,開發者也可以自己實現安全級別更高的cookie加密驗證方式。

          通過一個段代碼來學習一下Cookie的用法:

          class CookieAction
          {
              function DoAction(request,respon)
              {
                  var cookieCnt=request.getCookieCount();  //獲取客戶機Cookie數量
                  if(cookieCnt > 0)
                  {
                      for(var i=0 ; i < cookieCnt ; i++)  //遍歷的方式可以獲取所有的Cookie,包括名字相同的Cookie
                      {
                          //客戶機已經有cookie
                          var cookie=request.getCookie(i);
                          if(cookie.getName()=="pwdCookie")
                          {
                              print cookie.getValue();
                              print cookie.getValue("pwd222");  //帶密碼的cookie
                          }
                          else
                          {
                              print cookie.getValue();  //明文cookie
                          }
                      }
          			
                      var pwdCookie request.getCookie("pwdCookie");  //根據名字獲取Cookie,如果有同名Cookie則只返回第一個
                      print pwdCookie.getValue("pwd222");			
                  }
                  else
                  {
                      //客戶機沒有cookie
                      var cookie=new Cookie("normalCookie","3333");
                      respon.addCookie(cookie);  //添加明文cookie
          			
                      cookie=new Cookie();
                      cookie.setName("pwdCookie");
                      cookie.setValue("3333","pwd222");
                      respon.addCookie(cookie);  //添加帶密碼的cookie
                  }
          		
                  var myTime=new Time();
                  respon.write("now time is:" + myTime.strftime("%Y/%m/%d %H:%M:%S"));
                  respon.flush();
              }	
          }
          

          表單FormData 類

          CBrother提供了FormData類來描述form表單數據

          函數

          描述

          用法

          getType()

          獲取表單enctype類型,FORM_WWW_URLENCODED表示application/x-www-form-urlencoded,FORM_MULTI_PART表示multipart/form-data。在lib/htppdef里定義

          var t=form.getType()

          getTextCnt()

          獲取type不為"file"input數量

          var cnt=form.getTextCnt()

          getText(index)

          根據坐標獲取inputvaluetypefile獲取不到

          var value=form.getText(0)

          getText(name)

          根據name獲取inputvaluetypefile獲取不到

          var value=form.getText("txt1")

          getTextName(index)

          根據坐標獲取inputname,typefile獲取不到

          var name=form.getTextName(0)

          getMultiPartCnt()

          formenctypeFORM_MULTI_PART時候,獲取input數量

          var cnt=form.getMultiPartCnt()

          getMultiPart(index)

          根據坐標獲取input數據,返回Multipart對象

          var data=form.getMultiPart(0)

          getMultiPart(name)

          根據name獲取input數據,返回Multipart對象

          var data=form.getMultiPart("file")

          addText(name,str)

          添加一個文本類型的input數據,name為名稱,str為內容.根HttpClientRequest向其他服務器發起請求的時候使用

          form.addText("111","111")

          addFile(name,filename,data,mime)

          添加一個文件類型的input數據,name為名稱,filename為文件名,data為文件內容stringByteArray對象,mime為文件mime類型,不傳值會自動識別

          form.addFile("file1","222.txt","222")

          比如web前端提交的form表單結構如下:

          <form method="post" action="form.cb" >
          	<input type="text" name="txt1">
          	<input type="text" name="txt2">
          	<input type="password" name="userpass"
          	<input type="radio" name="sex" value="man" checked>man
          	<input type="radio" name="sex" value="woman">woman
          	<input type="file" name="file" value="hiddenvalue" multiple="multiple"/>
          	<input type="submit" value="提交(提交按鈕)">
          </form>
          

          網頁展示效果如下:

          因為這個表單沒有指定enctype,所以Content-Typeapplication/x-www-form-urlencoded,我們日常使用到的大部分表單都是這種格式。當前端post提交后服務器使用如下方式獲取表單數據

          class FormAction
          {
              function DoAction(request,respon)
              {
                  print request.getData();  //打印發送的數據
                  print "**********************分割線*******************************";
                  
                  var formdata=request.getFormData();
                  if(formdata==null)
                  {
                      return;	//只有Content-Type為application/x-www-form-urlencoded或者multipart/form-data時候才會返回FormData對象,否則返回null
                  }
          		
                  var type=formdata.getType();
                  if(type==FORM_WWW_URLENCODED)	//Content-Type為application/x-www-form-urlencoded類型的表單
                  {
                      var textCnt=formdata.getTextCnt();
                      for(var i=0 ; i < textCnt ; i++)
                      {
                          print formdata.getTextName(i) + ":" + formdata.getText(i);
                      }
                  }
              }	
          }
          

          服務器輸出結果:

          txt1=111&txt2=222&userpass=333&sex=man&file=111.txt
          **********************分割線*******************************
          txt1:111
          txt2:222
          userpass:333
          sex:man
          file:111.txt
          

          Multipart 類

          這里需要學習一下form添加enctype=multipart/form-data時提交的報文格式

          Multipart類來描述form表單在multipart/form-data數據類型下的一個input數據,這個類型的表單一般用在上傳文件

          函數

          描述

          用法

          getParm(name)

          獲取Multipart段落內的參數

          var parm=mulpart.getParm("name")

          getData(isByte)

          獲取Multipart的數據,isByte不傳值,默認返回字符串,傳true返回ByteArray對象

          var data=mulpart.getData()
          var bytearry=mulpart.getData(true)

          getDataLen()

          獲取數據長度

          var len=mulpart.getDataLen()

          isFile()

          如果是文件類型,返回true

          var isfile=mulpart.isFile()

          getFileCount()

          獲取這個input上傳了幾個文件

          var cnt=mulpart.getFileCount()

          getFile(index)

          獲取文件對應數據,返回一個Multipart對象

          var filedata=mulpart.getFile(0)

          比如web前端提交的form表單結構如下:(只是添加了一個enctype="multipart/form-data")

          <form method="post" action="form.cb"  enctype="multipart/form-data">
          	<input type="text" name="txt1">
          	<input type="text" name="txt2">
          	<input type="password" name="userpass"
          	<input type="radio" name="sex" value="man" checked>man
          	<input type="radio" name="sex" value="woman">woman
          	<input type="file" name="file" value="hiddenvalue" multiple="multiple"/>
          	<input type="submit" value="提交(提交按鈕)">
          </form>
          

          網頁展示效果沒有變化如下:

          添加了enctype,Content-Type變成multipart/form-data,服務器使用如下方式獲取表單數據

          class FormAction
          {
              function DoAction(request,respon)
              {
                  print request.getData();  //打印發送的數據
                  print "**********************分割線*******************************";
                  
                  var formdata=request.getFormData();
                  if(formdata==null)
                  {
                      return;	//只有Content-Type為application/x-www-form-urlencoded或者multipart/form-data時候才會返回FormData對象,否則返回null
                  }
          		
                  var type=formdata.getType();
                  if(type==FORM_MULTI_PART)	//Content-Type為multipart/form-data類型的表單
                  {
                      var formcnt=formdata.getMultiPartCnt();
                      for(var i=0 ; i < formcnt ; i++)
                      {
                          var muldata=formdata.getMultiPart(i);				
                          if(muldata.isFile())  //如果是上傳的文件
                          {
                              for(var j=0 ; j < muldata.getFileCount() ; j++)
                              {
                                  //上傳的文件可以在這里通過File對象把數據保存到文件里,CBrother目錄下sample/http/httpserver_form.cb里面有例子,這里只是把數據打印出來
                                  var filedata=muldata.getFile(j);
                                  print filedata.getParm("name") + " " + filedata.getParm("filename") + ": size=" + filedata.getDataLen() + " value=" + filedata.getData();
                              }
                          }
                          else
                          {
                              print muldata.getParm("name") + ":" + muldata.getData();
                          }
                      }
                  }
              }	
          }
          

          服務器運行結果如下:

          ------WebKitFormBoundaryw7KfcBx8f23zh8d4
          Content-Disposition: form-data; name="txt1"
          
          111
          ------WebKitFormBoundaryw7KfcBx8f23zh8d4
          Content-Disposition: form-data; name="txt2"
          
          222
          ------WebKitFormBoundaryw7KfcBx8f23zh8d4
          Content-Disposition: form-data; name="userpass"
          
          
          ------WebKitFormBoundaryw7KfcBx8f23zh8d4
          Content-Disposition: form-data; name="sex"
          
          man
          ------WebKitFormBoundaryw7KfcBx8f23zh8d4
          Content-Disposition: form-data; name="file"; filename="111.txt"
          Content-Type: text/plain
          
          i'am 111.txt file value!
          ------WebKitFormBoundaryw7KfcBx8f23zh8d4--
          **********************分割線*******************************
          txt1:111
          txt2:222
          userpass:
          sex:man
          file 111.txt: size=24 value=i'am 111.txt file value!
          

          HttpClientRequest 主動發起請求

          在開發過程中,我們經常會遇到與第三方服務器通信,這時候就需要主動請求第三方服務器接口,CBrother提供了HttpClientRequest來主動訪問別人提供的httphttps接口

          var myReq=new HttpClientRequest();
          

          函數

          描述

          用法

          setMethod(method)

          設置請求方式,"GET"或者"POST",類型字符串

          myReq.setMethod("POST")

          setUrl(url)

          設置請求地址,參數地址全路徑

          myReq.setUrl("http://127.0.0.1/hello.cb")
          myReq.setUrl("https://www.baidu.com")

          addProperty(key,value)

          添加http頭,必須都為字符串

          myReq.addProperty("HOST","127.0.0.1")

          getProperty(key)

          獲取HTTP頭里的參數,返回值為字符串

          var v=myReq.getProperty("Content-Type")

          getAllProperty()

          獲取HTTP頭里的所有的參數,返回一個Map對象

          var proMap=myReq.getAllProperty()

          addParm(key,value)

          在鏈接上添加參數,必須都為字符串。會在鏈接地址后面追加?k1=v1&k2=v2

          myReq.addParm("11","121")

          getParm(key)

          獲取已經添加的參數

          var v=myReq.getParm("k")

          getAllParm()

          獲取已經添加的參數,返回一個Map對象

          var parmMap=myReq.getAllParm()

          addData(data)

          添加要提交的數據,data為要提交的數據,必須都為字符串

          myReq.addData("11221122")

          flush()

          發起請求,返回HttpClientResponse對象

          var response=myReq.flush()

          setOutTime(seconds)

          設置超時時間,單位為秒

          myReq.setOutTime(5)

          setKeepAlive(isKeep)

          設置是否保持與服務器連接,不設置默認false不保持

          myReq.setKeepAlive(true)

          reset(clearHead=true)

          還原成一個新的請求對象,僅保留網絡連接。開啟keepalive以此來復用網絡,clearHead傳值為false則不清理已經添加的http

          myReq.reset()

          close()

          如果開啟了keepalive,則主動關閉與服務器鏈接,不開啟沒意義

          myReq.close()

          addFormData(enctype)

          本次請求添加form表單數據
          enctypeFORM_WWW_URLENCODED或者FORM_MULTI_PART,定義在lib/httpdef里,
          返回FormDatad對象

          var formdata=myReq.addFormData(FORM_WWW_URLENCODED)
          var formdata=myReq.addFormData(FORM_MULTI_PART)

          addCookie(cookie)

          添加一個cookie

          myReq.addCookie(new Cookie("aaa","bbb"))

          getCookieCount()

          獲取添加cookie數量

          var cnt=myReq.getCookieCount()

          getCookie(index)

          根據索引獲取cookie

          var cookie=myReq.getCookie(index)

          getCookie(cookieName)

          根據名字獲取cookie

          var cookie=myReq.getCookie("cookieName")

          setProxy(proxyType,ip,port,acc,pwd)

          設置代理,proxyType為"http","https","socket5"中的一種。ip,port為代理服務器IP,如果服務器需要驗證用戶名,最后兩個參數需要寫帳號密碼

          myReq.setProxy("socket5","111.111.111.111",4646)
          myReq.setProxy("https","111.111.111.111",4646,"user","123")

          HttpClientResponse為主動請求后返回的結果,HttpClientRequest的flush方法會返回一個HttpClientResponse對象

          var myReq=new HttpClientRequest();
          myReq.setMethod("GET");
          myReq.setUrl("https://www.baidu.com");
          var myResponse=myReq.flush();
          

          函數

          描述

          用法

          getStatus()

          獲取狀態碼

          var staus=myResponse.getStatus()

          getProperty(name)

          獲取HTTP頭里的參數,返回值為字符串

          var v=myResponse.getProperty("Content-Type")

          getAllProperty()

          獲取HTTP頭里的所有的參數,返回一個Map對象

          var proMap=myResponse.getAllProperty()

          getData()

          獲取返回的數據

          var data=myResponse.getData()

          getCookieCount()

          獲取cookie數量

          var cnt=myResponse.getCookieCount()

          getCookie(index)

          根據索引獲取cookie對象

          var cookie=myResponse.getCookie(0)

          getCookie(cookieName)

          根據名字獲取cookie對象

          var cookie=myResponse.getCookie("cookieName")

          例子:

          import CBHttp.code
          
          function main(parm)
          {
              var myReq=new HttpClientRequest();
              myReq.setMethod("GET");
              myReq.setUrl("https://www.baidu.com");
              var myRes=myReq.flush();
              print myRes.getStatus();
              print myRes.getData();
          }
          

          結果:

          200
          <html>
          <head>
                  <script>
                          location.replace(location.href.replace("https://","http://"));
                  </script>
          </head>
          <body>
                  <noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
          </body>
          </html>
          

          在開發過程中,為了降低服務器壓力,經常需要用到keepalive來保持連接多次請求,看下面的例子:

          import CBHttp.code
          import lib/httpdef
          
          function main(parm)
          {
              var myReq=new HttpClientRequest();
              myReq.setMethod(HTTP_GET);
              myReq.setUrl("http://www.cbrother.net");
              myReq.setKeepAlive(true);		//開啟keepalive,如果沒有這一句默認是請求完畢后自動關閉連接
              var myRes=myReq.flush();
              print myRes.getStatus();
              print myRes.getData();
          	
              myReq.reset();		//重置請求對象,僅保留網絡連接,如果因為超時連接被服務器主動關閉,那么第二次請求會重新創建連接
          	
              myReq.setMethod(HTTP_GET);
              myReq.setUrl("http://www.cbrother.net/doc.html");
              var myRes=myReq.flush();			//第二次請求沒有開啟keepalive,所以這句執行完后連接就會關閉了
              print myRes.getStatus();
              print myRes.getData();		
          }
          

          客戶端使用Cookie例子:

          function main(parm)
          {
              var myReq=new HttpClientRequest();
              myReq.setMethod("GET");
              myReq.setUrl("https://www.baidu.com");
              myReq.addCookie(new Cookie("aaa","bbb"));  //本次請求添加cookie
              var myRes=myReq.flush();
          	
              var cookieCnt=myRes.getCookieCount();  //服務器返回的cookie信息
              for(var i=0 ; i < cookieCnt ; i++)
              {
                  var cookie=request.getCookie(i);
          		
                  print cookie.getName();
                  print cookie.getValue();
              }
          }
          

          客戶端模擬form表單的例子:

          import lib/httpdef
          
          function main(parm)
          {
              var clientReq=new HttpClientRequest();
              clientReq.setMethod(HTTP_POST);
              clientReq.setUrl("http://127.0.0.1:8003/form.cb");
              var formdata=clientReq.addFormData(FORM_MULTI_PART); //也可以用FORM_WWW_URLENCODED,FORM_WWW_URLENCODED類型不支持上傳文件
              formdata.addText("111","111");
              formdata.addText("222","222");
              formdata.addFile("file","111.txt","222");
              formdata.addFile("file","222.txt","34567");
              clientReq.flush();	
          }
          

          HttpServer同一個端口支持多個不同內容的網站

          如果需要在一臺服務上同時布置多個網站,則需要在調用HttpServer下面幾個接口時第二個參數傳入網站的域名即可

          函數

          描述

          用法

          setRoot(path,domain)

          設置域名跟目錄

          httpServer.setRoot(path,"www.cbrother.net")

          setNormalAction(actName,domain)

          設置域名默認響應接口

          httpServer.setNormalAction("hello.cb","www.cbrother.net")

          set404Action(actName,domain)

          設置域名錯誤界面接口,不設置有默認頁面

          httpServer.set404Action("404.cb","www.cbrother.net")

          setHttpsCertFile(CRT_PATH,KEY_PATH,domain)

          設置https證書,如果設置了證書,該域名才可支持https協議


          主站蜘蛛池模板: 亚洲一区二区在线免费观看| 精品中文字幕一区二区三区四区| 黑巨人与欧美精品一区| 一区二区三区四区视频| 成人精品一区二区电影| 日韩人妻精品一区二区三区视频 | 亚洲一区二区三区深夜天堂| 色多多免费视频观看区一区 | 国产午夜三级一区二区三| 老熟妇仑乱一区二区视頻| 国产一区二区三区在线影院| 在线精品一区二区三区电影| 无码av人妻一区二区三区四区 | 欧洲精品一区二区三区| 无码人妻精品一区二区三区久久 | 日韩国产精品无码一区二区三区| 国产精品自在拍一区二区不卡 | 91精品一区二区综合在线| 日韩AV无码一区二区三区不卡毛片| 痴汉中文字幕视频一区| 国产精品无码一区二区在线观| 亚洲一区二区三区久久久久| 一区二区在线观看视频| 一区二区三区四区免费视频| 无码国产精品一区二区免费式芒果 | 精品免费国产一区二区三区| 无码中文字幕一区二区三区| 怡红院美国分院一区二区 | 久久一区二区精品综合| av无码人妻一区二区三区牛牛| 伦理一区二区三区| 亚洲AV乱码一区二区三区林ゆな | 亚洲毛片不卡av在线播放一区| 国产一区二区三区在线观看免费 | 久久久无码精品国产一区 | 高清国产AV一区二区三区| 农村乱人伦一区二区| 国产乱码精品一区二区三区四川人 | 国产主播一区二区三区在线观看| 国产在线观看精品一区二区三区91| 国产一区二区三区美女 |