C# 以 HTTP/SSL(双向) 方式请求 Java Jersey 发布的 Restful 资源与TCPSocket客户端

由于项目需要,现在要用C#以HTTP方式请求Java Jersey发布的 Restful资源。自己写了一个工具类,开源一下。

高手请飘过。请不要做非人类的事情,转载请留名!

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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值