zoukankan      html  css  js  c++  java
  • (转)利用http 协议的get 和post

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Collections;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace MyWebServiceTest
    {
    	public class RequestHelper
    	{
    		#region Tip:使用说明
    		//webServices 应该支持Get和Post调用,在web.config应该增加以下代码
    		//<webServices>
    		//  <protocols>
    		//    <add name="HttpGet"/>
    		//    <add name="HttpPost"/>
    		//  </protocols>
    		//</webServices>
    
    		//调用示例:
    		//Hashtable ht = new Hashtable();  //Hashtable 为webservice所需要的参数集
    		//ht.Add("str", "test");
    		//ht.Add("b", "true");
    		//XmlDocument xx = WebSvcCaller.QuerySoapWebService("http://localhost:81/service.asmx", "HelloWorld", ht);
    		//MessageBox.Show(xx.OuterXml);
    		#endregion
    
    		/// <summary>
    		/// 需要WebService支持Post调用
    		/// </summary>
    		public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars)
    		{
    			HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
    			request.Method = "POST";
    			request.ContentType = "application/x-www-form-urlencoded";
    			SetWebRequest(request);
    			byte[] data = EncodePars(Pars);
    			WriteRequestData(request, data);
    			return ReadXmlResponse(request.GetResponse());
    		}
    
    		/// <summary>
    		/// 需要WebService支持Get调用
    		/// </summary>
    		public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
    		{
    			HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
    			request.Method = "GET";
    			request.ContentType = "application/x-www-form-urlencoded";
    			SetWebRequest(request);
    			return ReadXmlResponse(request.GetResponse());
    		}
    
    		/// <summary>
    		/// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
    		/// </summary>
    		public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars)
    		{
    			if (_xmlNamespaces.ContainsKey(URL))
    			{
    				return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
    			}
    			else
    			{
    				return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
    			}
    		}
    
    		private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs)
    		{
    			_xmlNamespaces[URL] = XmlNs;//加入缓存,提高效率
    			HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
    			request.Method = "POST";
    			request.ContentType = "text/xml; charset=utf-8";
    			request.Headers.Add("SOAPAction", """ + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + """);
    			SetWebRequest(request);
    			byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
    			WriteRequestData(request, data);
    			XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();
    			doc = ReadXmlResponse(request.GetResponse());
    
    			XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
    			mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
    			String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
    			doc2.LoadXml("<root>" + RetXml + "</root>");
    			AddDelaration(doc2);
    			return doc2;
    		}
    		private static string GetNamespace(String URL)
    		{
    			HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
    			SetWebRequest(request);
    			WebResponse response = request.GetResponse();
    			StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
    			XmlDocument doc = new XmlDocument();
    			doc.LoadXml(sr.ReadToEnd());
    			sr.Close();
    			return doc.SelectSingleNode("//@targetNamespace").Value;
    		}
    
    		private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
    		{
    			XmlDocument doc = new XmlDocument();
    			doc.LoadXml("<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"></soap:Envelope>");
    			AddDelaration(doc);
    			//XmlElement soapBody = doc.createElement_x_x("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
    			XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
    			//XmlElement soapMethod = doc.createElement_x_x(MethodName);
    			XmlElement soapMethod = doc.CreateElement(MethodName);
    			soapMethod.SetAttribute("xmlns", XmlNs);
    			foreach (string k in Pars.Keys)
    			{
    				//XmlElement soapPar = doc.createElement_x_x(k);
    				XmlElement soapPar = doc.CreateElement(k);
    				soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
    				soapMethod.AppendChild(soapPar);
    			}
    			soapBody.AppendChild(soapMethod);
    			doc.DocumentElement.AppendChild(soapBody);
    			return Encoding.UTF8.GetBytes(doc.OuterXml);
    		}
    		private static string ObjectToSoapXml(object o)
    		{
    			XmlSerializer mySerializer = new XmlSerializer(o.GetType());
    			MemoryStream ms = new MemoryStream();
    			mySerializer.Serialize(ms, o);
    			XmlDocument doc = new XmlDocument();
    			doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
    			if (doc.DocumentElement != null)
    			{
    				return doc.DocumentElement.InnerXml;
    			}
    			else
    			{
    				return o.ToString();
    			}
    		}
    
    		/// <summary>
    		/// 设置凭证与超时时间
    		/// </summary>
    		/// <param name="request"></param>
    		private static void SetWebRequest(HttpWebRequest request)
    		{
    			request.Credentials = CredentialCache.DefaultCredentials;
    			request.Timeout = 10000;
    		}
    
    		private static void WriteRequestData(HttpWebRequest request, byte[] data)
    		{
    			request.ContentLength = data.Length;
    			Stream writer = request.GetRequestStream();
    			writer.Write(data, 0, data.Length);
    			writer.Close();
    		}
    
    		private static byte[] EncodePars(Hashtable Pars)
    		{
    			return Encoding.UTF8.GetBytes(ParsToString(Pars));
    		}
    
    		private static String ParsToString(Hashtable Pars)
    		{
    			StringBuilder sb = new StringBuilder();
    			foreach (string k in Pars.Keys)
    			{
    				if (sb.Length > 0)
    				{
    					sb.Append("&");
    				}
    				//sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
    			}
    			return sb.ToString();
    		}
    
    		private static XmlDocument ReadXmlResponse(WebResponse response)
    		{
    			StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
    			String retXml = sr.ReadToEnd();
    			sr.Close();
    			XmlDocument doc = new XmlDocument();
    			doc.LoadXml(retXml);
    			return doc;
    		}
    
    		private static void AddDelaration(XmlDocument doc)
    		{
    			XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
    			doc.InsertBefore(decl, doc.DocumentElement);
    		}
    
    		private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
    	}
    }
    

      

  • 相关阅读:
    【转】如何使用分区助手完美迁移系统到SSD固态硬盘?
    mysql 使用正则表达式查询
    【转】ajax发送请求时候为什么会报拒绝设置不安全的header
    【转】如何修改 video 样式
    flashfxp软件设置并关联默认编辑器
    【转】Windows中设置Fiddler抓HTTPS请求的解决办法 Unable to configure Windows to Trust the Fiddler Root certificate .
    【转】观看视频时启用硬件加速有什么用?如果关闭硬件加速又有什么区别呢?
    【转】C盘不能扩展卷怎么回事 C盘扩展卷灰色的解决办法
    97. Interleaving String
    93. Restore IP Addresses
  • 原文地址:https://www.cnblogs.com/xj2015/p/5594120.html
Copyright © 2011-2022 走看看