这是我今天下午碰到的案例,一个退订页面的post请求,请求头信息都很明确,but看看下面这个请求体,除了最后一个key是我的页面控件名称,其他的几个ViewState相关都是what呢?(ViewState原理参考http://www.cnblogs.com/wwan/archive/2010/11/18/1880357.html),下面是怎么处理这种情况的Post请求的办法。
1. 拿到接口地址,参数,拼串发送Get请求,拿到响应体(如下图,看高亮)
2. 从响应体里提取我们想要的ViewState相关,并保持在相应的字符串里面
3. 拼出来我们想要的请求体,对刚才的地址重新发送Post请求
亲测,可以解决问题。
请求头 Content-Type:Content-Type: application/x-www-form-urlencoded
public static string unsubResponse(string UnsubURL) { try { // Get the ViewState and EventValidation HttpWebRequest request = WebRequest.Create(UnsubURL) as HttpWebRequest; request.Method = "GET"; request.KeepAlive = false; // Get the response HttpWebResponse response = request.GetResponse() as HttpWebResponse; Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); string srcString = reader.ReadToEnd(); //Get the __VIEWSTATE string viewStateFlag = "id="__VIEWSTATE" value=""; int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length; int j = srcString.IndexOf(""", i); string viewState = srcString.Substring(i, j - i); // Get the __VIEWSTATEGENERATOR string viewStateGeneratorFlag = "id="__VIEWSTATEGENERATOR" value=""; i = srcString.IndexOf(viewStateGeneratorFlag) + viewStateGeneratorFlag.Length; j = srcString.IndexOf(""", i); string viewStateGenerator = srcString.Substring(i, j - i); // Get the __EVENTVALIDATION string EventValidationFlag = "id="__EVENTVALIDATION" value=""; i = srcString.IndexOf(EventValidationFlag) + EventValidationFlag.Length; j = srcString.IndexOf(""", i); string eventValidation = srcString.Substring(i, j - i); // Compose the URL viewState = Uri.EscapeDataString(viewState); viewStateGenerator = Uri.EscapeDataString(viewStateGenerator); eventValidation = Uri.EscapeDataString(eventValidation); string unsubButton = Uri.EscapeDataString("Unsubscribe"); string formatString = "__VIEWSTATE={0}&__VIEWSTATEGENERATOR={1}&__EVENTVALIDATION={2}&ButtonUnsubscribe={3}"; string postString = string.Format(formatString, viewState, viewStateGenerator, eventValidation, unsubButton); // Change to byte[] byte[] postData = Encoding.ASCII.GetBytes(postString); // Compose the new request request = WebRequest.Create(UnsubURL) as HttpWebRequest; request.Method = "POST"; request.KeepAlive = false; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postData.Length; Stream outputStream = request.GetRequestStream(); outputStream.Write(postData, 0, postData.Length); outputStream.Close(); // Get the new response response = request.GetResponse() as HttpWebResponse; responseStream = response.GetResponseStream(); reader = new StreamReader(responseStream); srcString = reader.ReadToEnd(); return (srcString); } catch (WebException we) { Console.WriteLine("Communication error," + we.Message + " please check your connectivity and try again.", "Error"); } catch { Console.WriteLine("Unknow error.", "Error"); } return (null); }