前兩天突然有個需求需要用到跨域提交數據。之前也在網上找到了好多的代碼例子看了的。常用的是jsonp去實現跨域,但是jsonp值支持get方式提交。這樣就造成了問題,後來我同事告訴我可以用服務端去做也就是webRequest去實現。我自己研究了一下,實現了之後 來寫一篇文章總結一下我的經驗。
希望也可以和你們分享一下。
首先是html頁面的數據傳輸,這個提交的方式我就不用講了,ajax 表單 都可以。重點在後台代碼怎麼去把數據傳輸到另外一個站點。
1 public ActionResult OpenReadWithHttps(string username, string email, string sex) 2 { 3 string url = "https://***********************"; //這裡是你請求的地址 或者說是提供給你的接口,同時還又會提交的格式。 4 var jss = new JavaScriptSerializer();//這個可以理解為把model變為一個json字符串 6 var model = new UserModel(); 7 //實例化model 給model賦值,然後去調用。 9 model.Username = username;11 model.Email = email;13 model.Sex = sex; 19 string temp = HttpPost(url, jss.Serialize(model)); 22 return Json(temp, JsonRequestBehavior.AllowGet); 23 }
接下的這段代碼才是重點。。
private string HttpPost(string Url, string postDataStr) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "POST"; request.ContentType = "application/json";
//request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr); //var str = Encoding.GetEncoding("UTF-8"); //request.ContentLength = str.GetByteCount(postDataStr);
Stream myRequestStream = request.GetRequestStream(); StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("UTF-8")); myStreamWriter.Write(postDataStr); myStreamWriter.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; }
上面的這個方法就是把你的參數用webRequest的方式傳輸給對應的接口。
這個方法呢 我剛開始用的是gbk2312的格式去提交到接口。提交後我這邊返回的是成功了。但是接口那邊保存的漢字就是一堆亂碼。。然後就改成UTF-8
改成UTF-8之後問題就來了,我這邊的數據就傳輸不過去了。。當時就跪在這裡了。到網上找了半天 也沒找到自己想要的答案。然後我就嘗試的注釋的那三行轉化格式的代碼(就上面那個方法注釋的).
沒想到 注釋之後居然成功了。。果然運氣也是實力的一部分。。然後又去找為何把值轉換之後會出錯。。答案就是 字符串轉換的時候長度居然會丟失。會丟失。。丟失。。失。。也就是會比未轉換之前少幾個字節。。於是就提交不了了。。。
其實這個做一遍之後感覺還是聽簡單的。跨域提交請求感覺逼格有點高 其實就那樣。
(希望這篇文章對你們有幫助)