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)    收藏  举报

导航