C#中使用web API post
以下为本人到目前为止对Post使用的一些了解:
.net 4.5以上版本(可能服务端也要使用4.5以上的版本)
用到的名称空间:
using System.Net.Http; using System.Data;
实现:public async void send(string strSend)
{ //转码,byte[] change = Encoding.UTF8.GetBytes(str);也可以 Encoding charset = Encoding.GetEncoding("utf-8"); byte[] change = charset.GetBytes(strSend); string sendUtf = charset.GetString(change); var handler = new HttpClientHandler(); try { using (var http = new HttpClient(handler)) {
//将要发送的内容放入Dictionary中,通过函数转换为content var content = new FormUrlEncodedContent(new Dictionary<string, string>() { {"iNum","1"}, {"sName",sendUtf} });
//异步 var response = await http.PostAsync(url, content); response.EnsureSuccessStatusCode(); System.Windows.Forms.MessageBox.Show(await response.Content.ReadAsStringAsync()); } } catch(Exception e) { System.Windows.Forms.MessageBox.Show(e.Message); } }
此方法已验证,但是可能存在问题,会进一步完善。
因为.net 4.5一下没有System.Net.Http程序集,所以vs2012以下并不能使用HttpClient,但是从网上查阅发现可以使用HttpWebRequest和HttpWebResponse来实现,如下:
使用的名称空间:
using System.Net;
using System.Text.RegularExpressions;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
实现:
public HttpWebResponse send(string strSend) { HttpWebRequest request = null; ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.UserAgent = DefaultUserAgent; Encoding charset = Encoding.GetEncoding("utf-8"); byte[] change = charset.GetBytes(strSend); string sendUtf = charset.GetString(change); IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("iNum", "1"); parameters.Add("sName", sendUtf); if (!(parameters == null || parameters.Count == 0)) { StringBuilder buffer = new StringBuilder(); int i = 0; foreach (string key in parameters.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, parameters[key]); } else { buffer.AppendFormat("{0}={1}", key, parameters[key]); } i++; } byte[] data = charset.GetBytes(buffer.ToString()); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } return request.GetResponse as HttpWebResponse; } } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //总是接受 }
这种方法因为服务端的原因并未验证。
以于2016-04-28验证,通过两种方法的使用,因为对HttpClient的了解较少,所以感觉使用HttpWebResponse更通用,复用性更高一些。下面贴出我自己写的
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Net; 7 using System.IO; 8 using System.Web; 9 using System.Runtime.InteropServices; 10 11 namespace Check0421 12 { 13 14 class HttpRequst 15 { 16 [DllImport("wininet.dll")] 17 private extern static bool InternetGetConnectedState(int Description, int ReservedValue); 18 public string GetHttpResponse(Dictionary<string,string> dicList,Encoding charset,string url) 19 { 20 if (!IsConnectInternet()) 21 { 22 System.Windows.Forms.MessageBox.Show("网络连接不可用..."); 23 return ""; 24 } 25 HttpWebRequest request = null; 26 request = WebRequest.Create(url) as HttpWebRequest; 27 request.Method = "POST"; 28 request.ContentType = "application/x-www-form-urlencoded"; 29 request.Timeout = 20000; 30 31 using(Stream sm=request.GetRequestStream()) 32 { 33 byte[] bySend = SendString(dicList, charset); 34 sm.Write(bySend, 0, bySend.Length); 35 } 36 HttpWebResponse response = request.GetResponse() as HttpWebResponse; 37 Stream st = response.GetResponseStream(); 38 StreamReader sr = new StreamReader(st); 39 string str=sr.ReadToEnd(); 40 return str; 41 } 42 private byte[] SendString(Dictionary<string,string> dicList, Encoding charset) 43 { 44 45 string send = ""; 46 foreach(var item in dicList) 47 { 48 byte[] byk=charset.GetBytes(item.Key); 49 string strCodek=charset.GetString(byk); 50 byte[] byv = charset.GetBytes(item.Value); 51 string strCodev = charset.GetString(byv); 52 send += strCodek + "=" + strCodev + "&"; 53 } 54 send = send.Substring(0, send.LastIndexOf('&')); 55 return charset.GetBytes(send); 56 } 57 private bool IsConnectInternet() 58 { 59 int Description = 0; 60 return InternetGetConnectedState(Description, 0); 61 } 62 63 } 64 }
自己的理解不够深,正在学习,如有问题,敬请指出。
本文引用了:http://www.cnblogs.com/lori/的内容,如有侵权纯属无意,请联系我删除。
感谢各位博主的文章让我学习到使用方法,如有侵权纯属无意,请联系我删除。
posted on 2016-03-23 17:31 sunshinfight 阅读(449) 评论(0) 收藏 举报
浙公网安备 33010602011771号