整合營銷服務商

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

          免費咨詢熱線:

          c井POST和GET方式通過服務器地址提交數據

          :POST方式提交:


          1. <strong><span style="font-size:14px;">private static string HttpPostConnectToServer(string serverUrl, string postData)
          2. {
          3. var dataArray = Encoding.UTF8.GetBytes(postData);
          4. //創建請求
          5. var request = (HttpWebRequest)HttpWebRequest.Create(serverUrl);
          6. request.Method = "POST";
          7. request.ContentLength = dataArray.Length;
          8. //設置上傳服務的數據格式
          9. request.ContentType = "application/x-www-form-urlencoded";
          10. //請求的身份驗證信息為默認
          11. request.Credentials = CredentialCache.DefaultCredentials;
          12. //請求超時時間
          13. request.Timeout = 10000;
          14. //創建輸入流
          15. Stream dataStream;
          16. //using (var dataStream = request.GetRequestStream())
          17. //{
          18. // dataStream.Write(dataArray, 0, dataArray.Length);
          19. // dataStream.Close();
          20. //}
          21. try
          22. {
          23. dataStream = request.GetRequestStream();
          24. }
          25. catch (Exception)
          26. {
          27. return null;//連接服務器失敗
          28. }
          29. //發送請求
          30. dataStream.Write(dataArray, 0, dataArray.Length);
          31. dataStream.Close();
          32. //讀取返回消息
          33. string res;
          34. try
          35. {
          36. var response = (HttpWebResponse)request.GetResponse();
          37. var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
          38. res = reader.ReadToEnd();
          39. reader.Close();
          40. }
          41. catch (Exception ex)
          42. {
          43. var result = new ServerResult();
          44. return "{\"error\":\"connectToServer\",\"error_description\":\"" + ex.Message + "\"}";//連接服務器失敗
          45. }
          46. return res;
          47. }</span></strong>
          1. 2:GET方式提交:
          2. <strong><span style="font-size:14px;">private static string HttpGetConnectToServer(string serverUrl, string postData)
          3. {
          4. //創建請求
          5. var request = (HttpWebRequest)HttpWebRequest.Create(serverUrl + "?" + postData);
          6. request.Method = "GET";
          7. //設置上傳服務的數據格式
          8. request.ContentType = "application/x-www-form-urlencoded";
          9. //請求的身份驗證信息為默認
          10. request.Credentials = CredentialCache.DefaultCredentials;
          11. //請求超時時間
          12. request.Timeout = 10000;
          13. //讀取返回消息
          14. string res;
          15. try
          16. {
          17. var response = (HttpWebResponse)request.GetResponse();
          18. var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
          19. res = reader.ReadToEnd();
          20. reader.Close();
          21. }
          22. catch (Exception ex)
          23. {
          24. var result = new ServerResult();
          25. return "{\"error\":\"connectToServer\",\"error_description\":\"" + ex.Message + "\"}";
          26. }
          27. return res;
          28. }</span></strong>
          1. 3:調用方法:
          2. <strong><span style="font-size:14px;">//服務地址
          3. var serverUrl ="https://openapi.baidu.com/rest/2.0/devapi/v1/lightapp/query/isonline";
          4. //上傳的數據
          5. var postData = string.Format("access_token={0}&offline_app_id={1}", token, appId);</span></strong>

          天在使用spring boot自帶的thymeleaf模板時候,想通過form表單傳遞一個自定義數組對象給后端接收。可是一直出現問題,后面經過查閱資料后,發現需要把form表單提交的方式,改成ajax方法提交

          這個是form表單部分,通過foreach循環,得到多個實體對象

          	<form action="http://localhost:8080/test/add" method="post" id="fm">
          		<div class="content">
          			<div class="item" th:each="paper, userStat:${paperList}">
          				<div class="paper">
          					<input type="hidden" name="uid" th:value="${paper.uid}" />
          					<span>試題</span> <textarea type="text" name="content" th:text="${paper.question}"  readonly="true" style="resize:none" ></textarea>
          				</div>
          				
          				<div class="answer">
          					<span>答案</span> <textarea type="text" name="answer" th:text="${paper.content}"  style="resize:none" ></textarea>
          				</div>
          			</div>
          		</div>
          		<div class="submit">
          			<input type="button"  id="submit" value="提交試卷" />
          		</div>		
          	</form>

          下面是把form提交,改成ajax提交方式,手續愛你通過serializeArray()得到序列化數組,然后在對每一條記錄進行處理。

          $(function() {
          	
          	function paperTemplate(uid, question, content){
          	    var paper = new Object();
          	    paper.uid = uid;
          	    paper.question = question;
          	    paper.content = content;
          	    return paper;
          	}
          	
          	$("#submit").click(function() {
          		
          		var paperArray = $('#fm').serializeArray();
          		
          		var paperList = new Array();
          		
          		for(var i = 0; i < paperArray.length / 3; i++) {
          			paperList.push(paperTemplate(paperArray[3*i].value, paperArray[3*i + 1].value, paperArray[3*i + 2].value))	
          		}
          		
          	    $.ajax({  
                      type: "POST",   //提交的方法
                      url:"http://localhost:8080/test/add", //提交的地址  
                      data:JSON.stringify(paperList),// 序列化表單值  
                      async: false,
                      contentType: "application/json;charset=utf-8",//這個參數也是header參數
                      error: function(request) {  //失敗的話
                           alert("Connection error");  
                      },  
                      success: function(data) {  //成功
                           alert(data.data);  //就將返回的數據顯示出來  
                      }  
                   });
                });
          })

          最后,后端代碼為

          	@ApiOperation(value="新增測試", notes="新增測試")
          	@ResponseBody
          	@PostMapping(value="/add")
          	public String add(@RequestBody Paper [] paperList) {
          		
          		for(Paper paper : paperList) {
          			String uid = paper.getUid();			
          			Paper savaPaper = paperService.getById(uid);
          			if (savaPaper != null && paper.getContent() != null) {
          				savaPaper.setContent(paper.getContent());
          				paperService.updateById(savaPaper);
          			}			
          		}
          		log.info("提交成功");
          		return ResultUtil.result(SysConf.SUCCESS, "提交成功");
          	}

          最終通過google瀏覽器network能夠看到,提交的數據

          最后還需要注意的一個問題就是thymeleaf在進行編譯檢測的時候,會很容易編譯出錯,導致網頁不能正常訪問。通過查閱資料,發現了這句話。

          說明:使用springboot的thymeleaf模板時默認會對HTML進行嚴格的檢查,導致當你的標簽沒有閉合時就會通不過。nekohtml這個依賴可以解決這一問題

          1)首先需要引入相關的依賴。

              	<dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-thymeleaf</artifactId>
                  </dependency>
          		
                  <dependency> 
          			<groupId>net.sourceforge.nekohtml</groupId> 
          			<artifactId>nekohtml</artifactId> 
          			<version>1.9.22</version> 
          		</dependency> 

          2)修改application.yml配置文件

          spring:  
           thymeleaf:
              cache: true   #關閉緩存
              mode: LEGACYHTML5

          3) 執行mvn clean install 重新打包啟動就可以解決了

          最近有朋友問如何用winform模擬post請求,然后登錄網站,稍微想了一下,大致就是對http報文的相關信息的封裝,然后請求網站登錄地址的樣子。發現自己的博客中對這部分只是也沒總結,就借著這股風,總結一下http報文的相關知識吧。

          HTTP定義

          超文本傳輸協議 (HTTP-Hypertext transfer protocol) 是一種詳細規定了瀏覽器和萬維網服務器之間互相通信的規則,通過因特網傳送萬維網文檔的數據傳送協議。

          這里對http的具體內容就不再介紹了,主要分析http報文信息。

          http報文分為:請求報文和響應報文。

          HTTP請求報文

          一個Http請求報文由請求行(request line)、請求頭部(header)、空行和請求數據4個部分組成,請求報文個格式如下:

          Post請求

          弄一個簡單的登錄頁面,使用ajax發送post請求,在IE下瀏覽,F12分析一下它的請求報文:

          Accept:瀏覽器可接受的MIME類型。
          Accept-Charset:瀏覽器可接受的字符集。
          Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip。Servlet能夠向支持gzip的瀏覽器返回經gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間。
          Accept-Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。
          Authorization:授權信息,通常出現在對服務器發送的WWW - Authenticate頭的應答中。
          Connection:表示是否需要持久連接。如果Servlet看到這里的值為“Keep - Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,Servlet需要在應答中發送一個 Content-Length頭,最簡單的實現方法是:先把內容寫入ByteArrayOutputStream,然后在正式寫出內容之前計算它的大小。
          Content-Length:表示請求消息正文的長度。
          Cookie:這是最重要的請求頭信息之一。

          From:請求發送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它。
          Host:初始URL中的主機和端口。
          If-Modified-Since:只有當所請求的內容在指定的日期之后又經過修改才返回它,否則返回304“Not Modified”應答。
          Pragma:指定“no-cache”值表示服務器必須返回一個刷新后的文檔,即使它是代理服務器而且已經有了頁面的本地拷貝。
          Referer:包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面。
          User-Agent:瀏覽器類型,如果Servlet返回的內容與瀏覽器類型有關則該值非常有用。
          UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發送的非標準的請求頭,表示屏幕大小、顏色深度、操作系統和CPU類型。

          請求正文

          從這里可以發現,請求正文就是我們要向服務器post提交的數據。

          Get請求

          將ajax的請求方式換成"GET",那么get方式請求報文是怎樣的呢?

          從上圖可以看出post和get請求報文的區別,post提交的數據是在請求正文中,而get提交的數據是在url中。

          Http響應報文

          從上圖可以看出,響應報文和請求報文非常相似,包括:狀態行、消息報文、響應正文。

          在響應報文中第一行中用狀態信息代替了請求信息,狀態行(status)通過提供一個狀態嗎來說明所請求的資源情況。

          狀態行的格式為:

          HTTP-Version Status-Code Reason-Phrase CRLF

          其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態碼;Reason-Phrase表示狀態碼的文本描述。狀態碼由三位數字組成,第一個數字定義了響應的類別,且有5種可能取值:


            • 1xx:指示信息——表示請求已接收,繼續處理。

            • 2xx:成功——表示請求已被成功接收、理解、接受。比如200

            • 3xx:重定向——要完成請求必須進行更進一步的操作。

            • 4xx:客戶端錯誤——請求有語法錯誤或請求無法實現。

            • 5xx:服務端錯誤——服務器未能實現合法的請求。

          常見的狀態碼:


            • 200 OK:客戶端請求成功。

            • 400 Bad Request:客戶端請求有語法錯誤,不能被服務器所理解。

            • 401 Unauthorized:請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用。

            • 403 Forbidden:服務器收到請求,但是拒絕提供服務。

            • 404 Not Found:請求資源不存在。

            • 500 Internal Server Error:服務器發生不可預期的錯誤。

            • 503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間后可能回復正常。

          GET和Post的區別

          GET方式,請求的數據會在URL之后(就是將數據放置在http請求<request-line>中),以問號分割URL和傳輸數據,多個參數使用&連接,如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文或其他字符,則直接將字符串用Base64加密,在url中最常見的:%E4%BD%A0%E5%A5%BD,這種東東%XX中的XX為該符號以16進制表示的ASCII。

          Post方式,把提交的數據防止在http的包體<request-body>中。上文請求正文中的數據就是實際傳輸的數據。

          因此,get提交的數據會在地址欄中顯示出來,而post不會。

          GET:不同瀏覽器和服務器對URL長度有限制。例如IE對url的限制是2083字節。其他瀏覽器如Netscape、FireFox等,理論上沒有長度限制,其限制取決于操作系統的支持。

          因此對于get提交時,傳輸數據就會收到url長度限制。

          POST:由于不是通過url傳值,理論上是不受限的。但實際各個web服務器會規定對post提交數據大小進行限制。Apache、iis6都有各自的配置。

          (以上參考文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html)

          get方式和post方式比較在安全性上較低,所以比較隱私性的東東一般采用post方式提交。誰也不愿意將自己用戶名和密碼在url中顯示出來吧?

          winform登錄模擬post方式登錄

          上面參考網絡資源對http請求與響應報文又學習了一下,現在模擬post方式登錄。get方式大致相似,不再贅述。

          post類

          • 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.IO.Compression; 5 using System.Linq; 6 using System.Net; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace Wolfy.LoginTest11 {12 public class Post13 {14 /// <summary>15 /// 獲得post請求后響應的數據16 /// </summary>17 /// <param name="postUrl">請求地址</param>18 /// <param name="referUrl">請求引用地址</param>19 /// <param name="data">請求帶的數據</param>20 /// <returns>響應內容</returns>21 public string PostLogin(string postUrl, string referUrl, string data)22 {23 string result = "";24 try25 {26 //命名空間System.Net下的HttpWebRequest類27 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl);28 //參照瀏覽器的請求報文 封裝需要的參數 這里參照ie929 //瀏覽器可接受的MIME類型30 request.Accept = "text/plain, */*; q=0.01";31 //包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面32 request.Referer = referUrl;33 //瀏覽器類型,如果Servlet返回的內容與瀏覽器類型有關則該值非常有用34 request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)";35 request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";36 //請求方式37 request.Method = "POST";38 //是否保持常連接39 request.KeepAlive = false;40 request.Headers.Add("Accept-Encoding", "gzip, deflate");41 //表示請求消息正文的長度42 request.ContentLength = data.Length;43 44 Stream postStream = request.GetRequestStream();45 byte[] postData = Encoding.UTF8.GetBytes(data);46 //將傳輸的數據,請求正文寫入請求流47 postStream.Write(postData, 0, postData.Length);48 postStream.Dispose();49 //響應50 HttpWebResponse response = (HttpWebResponse)request.GetResponse();51 //判斷響應的信息是否為壓縮信息 若為壓縮信息解壓后返回52 if (response.ContentEncoding == "gzip")53 {54 MemoryStream ms = new MemoryStream();55 GZipStream zip = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);56 byte[] buffer = new byte[1024];57 int l = zip.Read(buffer, 0, buffer.Length);58 while (l > 0)59 {60 ms.Write(buffer, 0, l);61 l = zip.Read(buffer, 0, buffer.Length);62 }63 ms.Dispose();64 zip.Dispose();65 result = Encoding.UTF8.GetString(ms.ToArray());66 }67 return result;68 }69 catch (Exception)70 {71 72 throw;73 }74 }75 }76 }

            請求中相關屬性的值,你可以在瀏覽器,F12中,將對應的值,復制粘貼就可以,這東西不需要記。這里沒有考慮cookie的,驗證碼的情況。


            測試結果:根據返回值是1(成功),2(失敗)


          主站蜘蛛池模板: 福利一区在线视频| 国产成人一区二区三区电影网站| 一区二区三区视频观看| 国产精品综合AV一区二区国产馆 | 国产一区二区影院| 99精品一区二区免费视频| 亚洲一区二区三区高清视频| 精品视频在线观看你懂的一区| 日韩美女视频一区| 国精产品一区一区三区有限在线 | AV鲁丝一区鲁丝二区鲁丝三区 | 日本免费一区二区久久人人澡| 日韩精品一区二区三区在线观看l 日韩精品一区二区三区毛片 | 国产一区二区三区高清视频 | 高清一区二区三区日本久| 亚洲国产综合精品一区在线播放| 久久精品无码一区二区WWW| 久久久国产一区二区三区| 国产女人乱人伦精品一区二区| 99久久精品国产一区二区成人| 精彩视频一区二区三区| 免费人人潮人人爽一区二区| 国产aⅴ一区二区| 午夜视频久久久久一区 | 精品人妻中文av一区二区三区| 亚洲av午夜福利精品一区人妖| 中文字幕乱码一区二区免费| 亚洲福利精品一区二区三区| 精品亚洲一区二区三区在线观看| 国产福利电影一区二区三区,日韩伦理电影在线福 | 国产一区二区免费在线| 日本精品一区二区三区四区| 一区二区三区精品高清视频免费在线播放| 精品无码一区二区三区在线| 99精品国产一区二区三区2021 | 中文字幕一区视频| 成人无号精品一区二区三区| 视频在线观看一区二区| 中文字幕一区二区三区精华液 | 另类国产精品一区二区| 国产精品一区二区久久沈樵|