前两天突然有个需求需要用到跨域提交数据。之前也在网上找到了好多的代码例子看了的。常用的是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之后问题就来了,我这边的数据就传输不过去了。。当时就跪在这里了。到网上找了半天 也没找到自己想要的答案。然后我就尝试的注释的那三行转化格式的代码(就上面那个方法注释的).
没想到 注释之后居然成功了。。果然运气也是实力的一部分。。然后又去找为何把值转换之后会出错。。答案就是 字符串转换的时候长度居然会丢失。会丢失。。丢失。。失。。也就是会比未转换之前少几个字节。。于是就提交不了了。。。
其实这个做一遍之后感觉还是听简单的。跨域提交请求感觉逼格有点高 其实就那样。
(希望这篇文章对你们有帮助)