在用C#调用接口的时候,遇到须要经过调用登陆接口才能调用其余的接口,由于在其余的接口须要在登陆的状态下保存Cookie值才能有权限调用,json
因此首先须要经过调用登陆接口来保存cookie值,再进行其余接口的调用浏览器
1.经过Get方式服务器
#region get方式 public string HttpGet(string url) { Encoding encoding = Encoding.UTF8; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "application/json"; request.Headers["Accept-Encoding"] = "gzip,deflase"; request.AutomaticDecompression = DecompressionMethods.GZip; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // HttpCookie cookies = new HttpCookie("admin"); //若是有须要经过登陆实现保存cookie值的话能够加一部分 // cookies.Value = Convert.ToString(response.Headers["Set-Cookie"]); // 经过响应请求读取带cookie的http数据 // cookies.Expires = DateTime.Now.AddDays(1); // HttpContext.Current.Response.Cookies.Add(cookies); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } #endregion
可是并非全部的get请求都须要添加这个heard的内容,有些加了这个可能出现乱码的状况,因此不要设置Accept-Encoding的Headercookie
此处之因此加此header,是由于看到网页分析工具中所获得的浏览器浏览该网页,对应的http的header的内容中,就是这样设置的。app
因此,代码中,也是模拟浏览器去访问网页,就设置了对应的Accept-Encoding为gzip,deflate了工具
普通浏览器访问网页,之因此添加:"Accept-Encoding" = "gzip,deflate"post
那是由于,浏览器对于从服务器中返回的对应的gzip压缩的网页,会自动解压缩,因此,其request的时候,添加对应的头,代表本身接受压缩后的数据。测试
同时添加了 request.AutomaticDecompression = DecompressionMethods.GZip;这一句,即可以得到正确的数据。编码
若是你获取网页内容太大的话,那么仍是能够用这个办法的,这样就可让HttpWebRequest自动帮你实现对应的解压缩了,能够减小数据数据传输量,节省时间,提升效率。url
2.经过post方式
public string HttpPost2(string url, string body) { //把用户传过来的数据转成“UTF-8”的字节流 Encoding encoding = Encoding.UTF8; //先根据用户请求的uri构造请求地址 //建立Web访问对象 HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); request.Method = "POST"; // request.Accept = "application/json"; request.ContentType = "application/json; charset=UTF-8"; request.Headers["Accept-Encoding"] = "gzip, deflate"; request.AutomaticDecompression = DecompressionMethods.GZip; //HttpCookie Cookie = System.Web.HttpContext.Current.Request.Cookies["admin"]; //如果须要登陆事后再能访问获取url的数据,须要在请求头中设置cookie值 //if (Cookie != null) // request.Headers.Add("Cookie", Cookie.Value.ToString()); byte[] buffer = encoding.GetBytes(body); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); //经过Web访问对象获取响应内容 HttpWebResponse response = (HttpWebResponse) request.GetResponse(); //经过响应内容流建立StreamReader对象,由于StreamReader更高级更快 using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd();//利用StreamReader就能够从响应内容从头读到尾 } }
3.经过put请求
#region Put请求 public string Put(string data, string uri) {//建立Web访问对象 HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(uri); //把用户传过来的数据转成“UTF-8”的字节流 byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data); Request.Method = "PUT"; Request.ContentLength = buf.Length; Request.ContentType = "application/json"; Request.MaximumAutomaticRedirections = 1; Request.AllowAutoRedirect = true; //发送请求 Stream stream = Request.GetRequestStream(); stream.Write(buf, 0, buf.Length); stream.Close(); //获取接口返回值 //经过Web访问对象获取响应内容 HttpWebResponse Response = (HttpWebResponse)Request.GetResponse(); //经过响应内容流建立StreamReader对象,由于StreamReader更高级更快 StreamReader reader = new StreamReader(Response.GetResponseStream(), Encoding.UTF8); //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//若是有编码问题就用这个方法 string returnXml = reader.ReadToEnd();//利用StreamReader就能够从响应内容从头读到尾 reader.Close(); Response.Close(); return returnXml; } #endregion
4.经过Delete请求
#region Delete请求 public string Delete(string data, string uri) { //建立Web访问对象 HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(uri); //把用户传过来的数据转成“UTF-8”的字节流 byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data); Request.Method = "DELETE"; Request.ContentLength = buf.Length; Request.ContentType = "application/json"; Request.MaximumAutomaticRedirections = 1; Request.AllowAutoRedirect = true; //发送请求 Stream stream = Request.GetRequestStream(); stream.Write(buf, 0, buf.Length); stream.Close(); //获取接口返回值 //经过Web访问对象获取响应内容 HttpWebResponse Response = (HttpWebResponse)Request.GetResponse(); //经过响应内容流建立StreamReader对象,由于StreamReader更高级更快 StreamReader reader = new StreamReader(Response.GetResponseStream(), Encoding.UTF8); //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//若是有编码问题就用这个方法 string returnXml = reader.ReadToEnd();//利用StreamReader就能够从响应内容从头读到尾 reader.Close(); Response.Close(); return returnXml; } #endregion
不一样的场景需求,使用不一样的方式,应用在不一样的场景 。
经过这几种组合方式 ,能够调用http接口,完成调用和测试。