C# wnform 請求http ( get , post 兩種方式 )


1.Get請求

string strURL = "http://localhost/WinformSubmit.php?tel=11111&name=張三";
System.Net.HttpWebRequest request;
// 創建一個HTTP請求
request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
//request.Method="get";
System.Net.HttpWebResponse response;
response = (System.Net.HttpWebResponse)request.GetResponse();
System.IO.StreamReader myreader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);
string responseText = myreader.ReadToEnd();
myreader.Close();
MessageBox.Show(responseText);

2.Post請求

string strURL = "http://localhost/WinformSubmit.php";
System.Net.HttpWebRequest request;
request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
//Post請求方式
request.Method = "POST";
// 內容類型
request.ContentType = "application/x-www-form-urlencoded";
// 參數經過URL編碼
string paraUrlCoded = System.Web.HttpUtility.UrlEncode("keyword");
paraUrlCoded += "=" + System.Web.HttpUtility.UrlEncode("多月");
byte[] payload;
//將URL編碼后的字符串轉化為字節
payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
//設置請求的 ContentLength
request.ContentLength = payload.Length;
//獲得請 求流
System.IO.Stream writer = request.GetRequestStream();
//將請求參數寫入流
writer.Write(payload, 0, payload.Length);
// 關閉請求流
writer.Close();
System.Net.HttpWebResponse response;
// 獲得響應流
response = (System.Net.HttpWebResponse)request.GetResponse();
System.IO.StreamReader myreader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);
string responseText = myreader.ReadToEnd();
myreader.Close();
MessageBox.Show(responseText);

注:System.Web.HttpUtility.UrlEncode("多月"); 需要引用 System.web.dll

 

WinformSubmit.php 代碼如下:

 C# Code 
 
<? php

header ( "content-Type: text/html; charset=Utf-8");
echo mb_convert_encoding ("123abc娃哈哈""UTF-8""GBK");

echo "\n------\n";

foreach ($_POST as $key => $value)
{
    echo $key . '--' .$value ."\n";
}

echo "\n-------\n";

foreach ($_GET as $key => $value)
{
    echo $key . '--' .$value ."\n";
}

? >

 

 

=====================================================

搞了2天,終於弄懂了一些Post的一些基礎,在這里分享下,也給自己留個備忘

項目分成兩個 web(ASP.Net)用戶處理請求,客戶端(wpf/winform)發送請求

1.web項目

有兩個頁面

SendPost.aspx(單純發送數據給客戶端)

代碼:

public partial class SendPost : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.RequestType == "POST")
{
  //聲明一個XMLDoc文檔對象,LOAD()xml字符串
  XmlDocument doc = new XmlDocument();
  doc.LoadXml("<entity><version>1.2.0_2012_12_05</version></entity>");
  //把XML發送出去
  Response.Write(doc.InnerXml);
  Response.End();
}
}
}

Accept.aspx(接收數據並反饋發送會客戶端)

protected void Page_Load(object sender, EventArgs e)
{
if (Request.RequestType == "POST")
{
  //接收並讀取POST過來的XML文件流
  StreamReader reader = new StreamReader(Request.InputStream);
  String xmlData = reader.ReadToEnd();
  //把數據重新返回給客戶端
  Response.Write(xmlData);
  Response.End();
}
}

2.客戶端項目:

一個處理Post類

public class PostHelp
{
public string GetWebContent(string url)
{
Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
// 要注意的這是這個編碼方式,還有內容的Xml內容的編碼方式
Encoding encoding = Encoding.GetEncoding("UTF-8");
byte[] data = encoding.GetBytes(url);

// 准備請求,設置參數
request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "text/xml";
//request.ContentLength = data.Length;

outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Flush();
outstream.Close();
//發送請求並獲取相應回應數據

response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才開始向目標網頁發送Post請求
instream = response.GetResponseStream();

sr = new StreamReader(instream, encoding);
//返回結果網頁(html)代碼

string content = sr.ReadToEnd();
return content;
}
public string PostXml(string url, string strPost)
{
string result = "";

StreamWriter myWriter = null;
HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
objRequest.Method = "POST";
//objRequest.ContentLength = strPost.Length;
objRequest.ContentType = "text/xml";//提交xml
//objRequest.ContentType = "application/x-www-form-urlencoded";//提交表單
try
{
myWriter = new StreamWriter(objRequest.GetRequestStream());
myWriter.Write(strPost);
}
catch (Exception e)
{
return e.Message;
}
finally
{
myWriter.Close();
}

HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
{
result = sr.ReadToEnd();
sr.Close();
}
return result;
}
}

一個XML處理類

public class XMLHelp
{
private XDocument _document;

public XDocument Document
{
get { return _document; }
set { _document = value; }
}
private string _fPath = "";

public string FPath
{
get { return _fPath; }
set { _fPath = value; }
}

/// <summary>
/// 初始化數據文件,當數據文件不存在時則創建。
/// </summary>
public void Initialize()
{
if (!File.Exists(this._fPath))
{
this._document = new XDocument(
new XElement("entity", string.Empty)
);
this._document.Save(this._fPath);
}
else
this._document = XDocument.Load(this._fPath);
}


public void Initialize(string xmlData)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlData);

this._document = XmlDocumentExtensions.ToXDocument(doc, LoadOptions.None);
}
/// <summary>
/// 清空用戶信息
/// </summary>
public void ClearGuest()
{
XElement root = this._document.Root;
if (root.HasElements)
{
XElement entity = root.Element("entity");
entity.RemoveAll();
}
else
root.Add(new XElement("entity", string.Empty));
}


///LYJ 修改
/// <summary>
/// 提交並最終保存數據到文件。
/// </summary>

public void Commit()
{
try
{
this._document.Save(this._fPath);
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
}

/// <summary>
/// 更新
/// </summary>
public void UpdateQrState(string PId, string state)
{
XElement root = this._document.Root;
XElement entity = root.Element("entity");

IEnumerable<XElement> elements = entity.Elements().Where(p =>
p.Attribute("PId").Value == PId);
if (elements.Count() == 0)
return;
else
{
XElement guest = elements.First();
guest.Attribute("FQdState").Value = state;
guest.Attribute("FQdTime").Value = DateTime.Now.ToString();
Commit();
}
}

public IEnumerable<XElement> GetXElement()
{
XElement root = this._document.Root;
IEnumerable<XElement> elements = root.Elements();
return elements;
}

 

public DataTable GetEntityTable()
{
DataTable dtData = new DataTable();
XElement root = this._document.Root;
IEnumerable<XElement> elements = root.Elements();

foreach (XElement item in elements)
{
dtData.Columns.Add(item.Name.LocalName);
}
DataRow dr = dtData.NewRow();
int i = 0;
foreach (XElement item in elements)
{
dr[i] = item.Value;
i = i + 1;
}
dtData.Rows.Add(dr);
return dtData;
}

}

因為我這里用的是Linq操作XML所以多一個轉換XML類

public static class XmlDocumentExtensions
{
public static XDocument ToXDocument(this XmlDocument document)
{
return document.ToXDocument(LoadOptions.None);
}

public static XDocument ToXDocument(this XmlDocument document, LoadOptions options)
{
using (XmlNodeReader reader = new XmlNodeReader(document))
{
return XDocument.Load(reader, options);
}
}
}

客戶端加個按鈕,按鈕代碼

private void button5_Click(object sender, RoutedEventArgs e)
{
PostHelp ph = new PostHelp();
//請求,拿到數據
string value = ph.GetWebContent("http://192.168.52.24:802/SendPost.aspx");
//保存數據
XMLHelp xh = new XMLHelp();
xh.Document = XDocument.Parse(value);
xh.FPath = Environment.CurrentDirectory + "\\xml\\a.xml";
xh.Commit();
//重新把數據拿出來,發送
string a = xh.Document.ToString();
string text = ph.PostXml("http://192.168.52.24:802/Accept.aspx", a);
//根據得到數據顯示
this.textBlock1.Text = text;
//把數據轉換成DataTable,輸出要的結果集
DataTable dt = xh.GetEntityTable();
MessageBox.Show(dt.Rows[0][0].ToString());

}

代碼很多,思路雖然有寫在注釋里,但是還是不夠清楚,我這里重新說一下

1.首先是Post請求發送原理,客戶端請求一個request,並把內容加到request中,發送到指定路徑的頁面,頁面得到請求,返回數據,客戶端再基於剛剛的request去GetResponse()得到返回數據

2.另外一個是XML的操作,包括讀取xml,把xml轉成字符串用於發送,得到返回內容,保存到本地xml,再讀取本地的xml,輸出xml里面的值

這里再提一下:想調試web,必須用vs自帶的IIS虛擬器,在web項目設置個斷點,然后運行,客戶端請求的request的時候,web就會自動斷到斷點,就可以調試啦。

不過用vs自帶的虛擬器,會經常出現連接已斷開的問題,等你調試好后,直接放到IIS中,或者不用vs自帶的IIS虛擬器,直接設置項目指定到IIS位置,這種錯誤就不會出現了!

這東西看簡單,其實真的還是用了很多自己的時間,轉載的童鞋,記得保留我的連接http://www.cnblogs.com/linyijia/archive/2013/03/08/2950210.html,不做純粹的伸手黨哦!

 

===============================================

C#后台Post提交XML 及接收該XML的方法 http://www.cnblogs.com/hucaihao/p/3614503.html

 C# Code 
 
//發送XML

public void Send (object sender, System.EventArgs e)
{
    string WebUrl = "http://localhost:4035/GetXML/GetDataSet";//換成接收方的URL
    RequestUrl (WebUrl, GetXml() );
}
public void RequestUrl (string url, string data) //發送方法
{
    var request = WebRequest.Create (url);
    request.Method = "post";
    request.ContentType = "text/xml";
    request.Headers.Add ("charset:utf-8");
    var encoding = Encoding.GetEncoding ("utf-8");
    if (data != null)
    {
        byte[] buffer = encoding.GetBytes (data);
        request.ContentLength = buffer.Length;
        request.GetRequestStream().Write (buffer, 0, buffer.Length);
    }
    else
    {
        //request.ContentLength = 0;
    }
    //using (HttpWebResponse wr = request.GetResponse() as HttpWebResponse)
    //{
    //    using (StreamReader reader = new StreamReader(wr.GetResponseStream(), encoding))
    //    {
    //        return reader.ReadToEnd();
    //    }
    //}
}

public string GetXml() //要發送的XML
{
    StringBuilder strBuilder = new StringBuilder();
    strBuilder.Append ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    strBuilder.Append ("<root>");
    strBuilder.Append ("<customer_id>123</customer_id>");
    strBuilder.Append ("<terminal_code>10444441</terminal_code>");
    strBuilder.Append ("<customer_mobile>13464537875</customer_mobile>");
    strBuilder.Append ("<customer_name>張三豐</customer_name>");
    strBuilder.Append ("<relationship>母子</relationship>");
    strBuilder.Append ("<baby_name>張國立</baby_name>");
    strBuilder.Append ("<baby_sex>1</baby_sex>");
    strBuilder.Append ("<baby_birthday>2012-06-08</baby_birthday>");
    strBuilder.Append ("<province>浙江</province>");
    strBuilder.Append ("<region>杭州</region>");
    strBuilder.Append ("<county>建德</county>");
    strBuilder.Append ("<address>西湖區文三路158號</address>");
    strBuilder.Append ("<feedback>1</feedback>");
    strBuilder.Append ("</root>");
    return strBuilder.ToString();
}

//接收XML

public void GetDataSet (string text)
{
    try
    {
        Stream inputstream = Request.InputStream;
        byte[] b = new byte[inputstream.Length];
        inputstream.Read (b, 0, (int) inputstream.Length);
        string inputstr = UTF8Encoding.UTF8.GetString (b);
        XmlDocument d = new XmlDocument();
        d.LoadXml (inputstr);
    }
    catch
    {

    }
}

 

========================================

C#中使用POST發送XML

 C# Code 
 
/// C#  POST 發送XML
/// </summary>
/// <param name="url">目標Url</param>
/// <param name="strPost">要Post的字符串(數據)</param>
/// <returns>服務器響應</returns>
private string PostXml (string url, string strPost)
{
    string result = string.Empty;
    //Our postvars
    //ASCIIEncoding.ASCII.GetBytes(string str)
    //就是把字符串str按照簡體中文(ASCIIEncoding.ASCII)的編碼方式,
    //編碼成 Bytes類型的字節流數組;
    // 要注意的這是這個編碼方式,還有內容的Xml內容的編碼方式,如果沒有注意對應會出現文末的錯誤
    byte[] buffer = Encoding.UTF8.GetBytes (strPost);
    StreamWriter myWriter = null;
    //根據url創建HttpWebRequest對象
    //Initialisation, we use localhost, change if appliable
    HttpWebRequest objRequest = (HttpWebRequest) WebRequest.Create (url);
    //Our method is post, otherwise the buffer (postvars) would be useless
    objRequest.Method = "POST";
    //The length of the buffer (postvars) is used as contentlength.
    //Set the content length of the string being posted.
    objRequest.ContentLength = buffer.Length;
    //We use form contentType, for the postvars.
    //Set the content type of the data being posted.
    objRequest.ContentType = "text/xml";//提交xml
    //objRequest.ContentType = "application/x-www-form-urlencoded";//提交表單
    try
    {
        //We open a stream for writing the postvars
        myWriter = new StreamWriter (objRequest.GetRequestStream() );
        //Now we write, and afterwards, we close. Closing is always important!
        myWriter.Write (strPost);
    }
    catch (Exception e)
    {
        return e.Message;
    }
    finally
    {
        myWriter.Close();
    }
    //讀取服務器返回信息
    //Get the response handle, we have no true response yet!
    //本文URL:http://www.bianceng.cn/Programming/csharp/201410/45576.htm
    HttpWebResponse objResponse = (HttpWebResponse) objRequest.GetResponse();
    //using作為語句,用於定義一個范圍,在此范圍的末尾將釋放對象
    using (StreamReader sr = new StreamReader (objResponse.GetResponseStream() ) )
    {
        //ReadToEnd適用於小文件的讀取,一次性的返回整個文件
        result = sr.ReadToEnd();
        sr.Close();
    }
    return result;
}

背景:

我發送的是encoding='UTF-8'格式的xml字符串,但一開始我使用的是

Encoding.Unicode.GetBytes(strPost)或者Default、ASCII均會提示錯誤。

修改字符編碼格式后,成功!所以要根據發送的格式選取合適的方法。

注意:

該函數可以發送xml到用友那邊,但返回信息中中文字符為亂碼。

這個函數也可以實現同樣的功能卻避免了亂碼問題

詳細過程及代碼如下:

1、創建httpWebRequest對象,HttpWebRequest不能直接通過new來創建,只能通過WebRequest.Create(url)的方式來獲得。 WebRequest是獲得一些應用層協議對象的一個統一的入口(工廠模式),它根據參數的協議來確定最終創建的對象類型。

2、初始化HttpWebRequest對象,這個過程提供一些http請求常用的標頭屬性:agentstring,contenttype等,其中agentstring比較有意思,它是用來識別你用的瀏覽器名字的,通過設置這個屬性你可以欺騙服務器你是一個IE,firefox甚至是mac里面的safari。很多認真設計的網站都會根據這個值來返回對不同瀏覽器特別優化的代碼。

3、附加要POST給服務器的數據到HttpWebRequest對象,附加POST數據的過程比較特殊,它並沒有提供一個屬性給用戶存取,需要寫入HttpWebRequest對象提供的一個stream里面。

4、讀取服務器的返回信息,讀取服務器返回的時候,要注意返回數據的encoding,如果我們提供的解碼類型不對,會造成亂碼,比較常見的是utf-8和gb2312。通常,網站會把它編碼的方式放在http header里面,如果沒有,我們只能通過對返回二進制值的統計方法來確定它的編碼方式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM