C# 以 HTTP/SSL(双向) 方式请求 Java Jersey 发布的 Restful 资源与TCPSocket客户端
2011-11-22 15:49
441 查看
由于项目需要,现在要用C#以HTTP方式请求Java Jersey发布的 Restful资源。自己写了一个工具类,开源一下。
高手请飘过。请不要做非人类的事情,转载请留名!
app.config
高手请飘过。请不要做非人类的事情,转载请留名!
using System; using System.IO; using System.Net; using System.Net.Security; using System.Net.Sockets; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Configuration; namespace EriloanUtilLibrary.Http { /// <summary> /// HTTP工具类 /// </summary> public class HttpTools { /// <summary> /// 证书路径 /// </summary> public String certFilePath { get; set; } /// <summary> /// 证书口令 /// </summary> public String certFilePwd { get; set; } /// <summary> /// API地址 /// </summary> public String apiUrl { get; set; } /// <summary> /// API密钥 /// </summary> public String apiKey { get; set; } /// <summary> /// Socket服务器地址 /// </summary> public String socketServerIP { get; set; } /// <summary> /// Socket服务器端口 /// </summary> public Int32 socketServerPort { get; set; } /// <summary> /// 默认的构造函数 /// </summary> public HttpTools() { this.certFilePath = ConfigurationManager.AppSettings["certFilePath"]; this.certFilePwd = ConfigurationManager.AppSettings["certFilePwd"]; this.apiUrl = ConfigurationManager.AppSettings["apiUrl"]; this.apiKey = ConfigurationManager.AppSettings["apiKey"]; this.socketServerIP = ConfigurationManager.AppSettings["socketServerIP"]; this.socketServerPort = Int32.Parse(ConfigurationManager.AppSettings["socketServerPort"]); } /// <summary> /// 带参数据的构造函数 /// </summary> /// <param name="certFilePath"></param> /// <param name="certFilePwd"></param> /// <param name="apiUrl"></param> /// <param name="apiKey"></param> /// <param name="socketServerIP"></param> /// <param name="socketServerPort"></param> public HttpTools(String certFilePath, String certFilePwd, String apiUrl, String apiKey, String socketServerIP, Int32 socketServerPort) { this.certFilePath = certFilePath; this.certFilePwd = certFilePwd; this.apiUrl = apiUrl; this.apiKey = apiKey; this.socketServerIP = socketServerIP; this.socketServerPort = socketServerPort; } /// <summary> /// 以GET方式请求HTTP /// </summary> /// <param name="url"></param> /// <param name="isLoadCert"></param> /// <returns></returns> public String CreateHttpGet(String url, bool isLoadCert) { HttpWebRequest request = CreateHttpRequest(url, @"GET", isLoadCert); return CreateHttpResponse(request); } /// <summary> /// 以Post方式请求HTTP /// </summary> /// <param name="url"></param> /// <param name="sendMsg"></param> /// <param name="isLoadCert"></param> /// <returns></returns> public String CreateHttpPost(String url, String sendMsg, bool isLoadCert) { HttpWebRequest request = CreateHttpRequest(url, @"POST", isLoadCert); if (null != sendMsg && !"".Equals(sendMsg)) { AddHttpRequestParams(request, sendMsg); } return CreateHttpResponse(request); } /// <summary> /// 以PUT方式请求HTTP /// </summary> /// <param name="url"></param> /// <param name="sendMsg"></param> /// <param name="isLoadCert"></param> /// <returns></returns> public String CreateHttpPut(String url, String sendMsg, bool isLoadCert) { HttpWebRequest request = CreateHttpRequest(url, @"PUT", isLoadCert); if (null != sendMsg && !"".Equals(sendMsg)) { AddHttpRequestParams(request, sendMsg); } return CreateHttpResponse(request); } /// <summary> /// 以DELETE方式请求HTTP /// </summary> /// <param name="url"></param> /// <param name="sendMsg"></param> /// <param name="isLoadCert"></param> /// <returns></returns> public String CreateHttpDelete(String url, String sendMsg, bool isLoadCert) { HttpWebRequest request = CreateHttpRequest(url, @"DELETE", isLoadCert); if (null != sendMsg && !"".Equals(sendMsg)) { AddHttpRequestParams(request, sendMsg); } return CreateHttpResponse(request); } /// <summary> /// 为HttpRequest添加参数 /// </summary> /// <param name="request"></param> /// <param name="sendData"></param> private void AddHttpRequestParams(HttpWebRequest request, String sendData) { byte[] data = Encoding.UTF8.GetBytes(sendData); request.ContentLength = data.Length; Stream requestStream = null; using (requestStream = request.GetRequestStream()) { requestStream.Write(data, 0, data.Length); } requestStream.Close(); } /// <summary> /// 创建HttpResponse /// </summary> /// <param name="request"></param> /// <returns></returns> private String CreateHttpResponse(HttpWebRequest request) { String str; HttpWebResponse response = null; Stream responseStream = null; StreamReader responseReader = null; try { using (response = (HttpWebResponse)request.GetResponse()) { responseStream = response.GetResponseStream(); responseReader = new StreamReader(responseStream, Encoding.UTF8); StringBuilder sb = new StringBuilder(); sb.Append(responseReader.ReadToEnd()); str = sb.ToString(); } } catch (Exception e) { str = "{\"rescode\":\"0\",\"resmsg\":\"通信失败。原因:" + e.Message + "\"}"; } finally { if (null != response) { responseReader.Close(); responseStream.Close(); response.Close(); } } return str; } /// <summary> /// 创建HttpWebRequest /// </summary> /// <returns></returns> private HttpWebRequest CreateHttpRequest(String url, String method, bool isLoadCert) { HttpWebRequest request = null; try { request = (HttpWebRequest)WebRequest.Create(apiUrl + url); if (isLoadCert) { X509Certificate2 cert = CreateX509Certificate2(); request.ClientCertificates.Add(cert); } request.KeepAlive = true; request.ContentType = "application/json"; request.Headers.Add("x-appKey", apiKey); request.Method = method; } catch (Exception) { //Console.WriteLine("创建HttpRequest失败。原因:" + e.Message); request = null; } return request; } /// <summary> /// 以TCPSocket方式请求数据 /// </summary> /// <param name="sendMsg"></param> /// <returns></returns> public String CreateSocket(String sendMsg) { String rcMsg = null; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.socketServerIP), this.socketServerPort); byte[] data = new byte[1024 * 1024 * 100]; int recv = 0; Socket socketClient = null; try { socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketClient.Connect(ipep); socketClient.Send(Encoding.UTF8.GetBytes(sendMsg)); while (true) { data = new byte[1024 * 1024 * 100]; recv = socketClient.Receive(data, data.Length, 0); if (recv <= 0) { break; } rcMsg += Encoding.UTF8.GetString(data, 0, recv).Trim(); } socketClient.Shutdown(SocketShutdown.Both); } catch (SocketException e) { rcMsg = "无法创建Socket。" + e.Message; } finally { socketClient.Close(); } return rcMsg; } /// <summary> /// 创建X509证书 /// </summary> /// <returns></returns> private X509Certificate2 CreateX509Certificate2() { X509Certificate2 cert = null; try { cert = new X509Certificate2(certFilePath, certFilePwd); ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ServerCertificateValidationCallback); } catch (Exception) { //Console.WriteLine("创建X509Certificate2失败。原因:" + e.Message); cert = null; } return cert; } /// <summary> /// 证书验证回调函数 /// </summary> /// <param name="obj"></param> /// <param name="cer"></param> /// <param name="chain"></param> /// <param name="error"></param> /// <returns></returns> public bool ServerCertificateValidationCallback(object obj, X509Certificate cer, X509Chain chain, System.Net.Security.SslPolicyErrors error) { return true; } } }
app.config
<appSettings> <add key="certFilePath" value="D:\192_168_201_8.pfx" /> <add key="certFilePwd" value="eriloan" /> <add key="apiUrl" value="https://192.168.201.8:8443/eriloan_com/api/v1/" /> <add key="apiKey" value="newlinetech" /> <add key="socketServerIP" value="192.168.1.198" /> <add key="socketServerPort" value="10000" /> </appSettings>
相关文章推荐
- java最简单的方式实现http get请求 gbk转utf8 javaweb发布到服务器
- Java HTTP方式请求ASP.NET(C#)WebService
- C#模拟发送http get、post请求的方式
- 在ISA2006以SSL-TO-HTTP方式发布内部的WEB服务器(二) 推荐
- 【java程序员理解HTTP】【6】实践--java 中几种模拟 http 请求的方式
- C# wnform 请求http ( get , post 两种方式 )
- java ssl双向验证httpclient客户端请求工具类
- C# java 中对http post传参数请求
- Android 中的两种请求网络资源的方式:HttpClient和HttpURLConnection
- Java http处理get请求,参数中带特殊字符处理方式
- java发送post和get请求(1)---HttpURLConnection方式
- WCF服务使用(IIS+Http)和(Winform宿主+Tcp)两种方式进行发布
- nginx配置将http请求转发支持ssl双向认证https请求的正向代理
- java程序访问不可信(自颁发证书)ssl http 资源
- asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端
- [厉害了,我的JAVA基础](八)HTTP请求的GET与POST方式的区别
- java发送http的两种请求方式——get、post
- 【Android】【嘿!Java】Android工程、Java工程中通过HttpClient请求网络数据的不同方式
- nginx配置将http请求转发支持ssl双向认证https请求的正向代理