1. 程式人生 > >C#中Post請求的兩種方式發送參數鏈和Body的

C#中Post請求的兩種方式發送參數鏈和Body的

連接 png ets return div 參數 try 發現 create

POST請求 有兩種方式 一種是組裝key=value這種參數對的方式 一種是直接把一個字符串發送過去 作為body的方式

我們在postman中可以看到

技術分享圖片sfdsafd

sdfsdfds

public class KeyWordController : BaseController
{
private string listClassUrl = "http://192.168.1.171:8789/keywords/list_class";

public ActionResult List()
{
//這種方式是通過參數鍵值對的方式發送過去
//var para = new Dictionary<string, string>();
//para.Add("lang", "1");
//return Json(Post(listClassUrl, para));

//這種方式是整個json或者字符串發送過去
var json = @"{""lang"":1}";
return Json(Post(listClassUrl, json),JsonRequestBehavior.AllowGet);
}

/// <summary>
/// 指定Post地址使用Get 方式獲取全部字符串
/// </summary>
/// <param name="url">請求後臺地址</param>
/// <returns></returns>
private string Post(string url, Dictionary<string, string> dic)
{
string result = string.Empty;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";

#region 添加Post 參數
StringBuilder builder = new StringBuilder();
int i = 0;
foreach (var item in dic)
{
if (i > 0)
builder.Append("&");
builder.AppendFormat("{0}={1}", item.Key, item.Value);
i++;
}
byte[] data = Encoding.UTF8.GetBytes(builder.ToString());
req.ContentLength = data.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
#endregion

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream stream = resp.GetResponseStream();
//獲取響應內容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();
}
return result;
}

/// <summary>
/// POST整個字符串到URL地址中
/// </summary>
/// <param name="Url"></param>
/// <param name="jsonParas"></param>
/// <returns></returns>
public string Post(string Url, string jsonParas)
{
string strURL = Url;

//創建一個HTTP請求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
//Post請求方式
request.Method = "POST";
//內容類型
//request.ContentType = "application/x-www-form-urlencoded";

//設置參數,並進行URL編碼

string paraUrlCoded = jsonParas;//System.Web.HttpUtility.UrlEncode(jsonParas);

byte[] payload;
//將Json字符串轉化為字節
payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
//設置請求的ContentLength
request.ContentLength = payload.Length;
//發送請求,獲得請求流

Stream writer;
try
{
writer = request.GetRequestStream();//獲取用於寫入請求數據的Stream對象
}
catch (Exception)
{
writer = null;
Console.Write("連接服務器失敗!");
}
//將請求參數寫入流
writer.Write(payload, 0, payload.Length);
writer.Close();//關閉請求流

//String strValue = "";//strValue為http響應所返回的字符流
HttpWebResponse response;
try
{
//獲得響應流
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
response = ex.Response as HttpWebResponse;
}

Stream s = response.GetResponseStream();

Stream postData = Request.InputStream;
StreamReader sRead = new StreamReader(s);
string postContent = sRead.ReadToEnd();
sRead.Close();

return postContent;//返回Json數據
}

POST方式提交數據,一種眾所周知的方式:

html頁面中使用form表單提交,接收方式,使用Request.Form[""]或Request.QueryString[""]來獲取。

這裏介紹另外一種POST方式和接收方式,就是將整個數據作為加入到數據流中提交和接收

接收方式:

Stream s = System.Web.HttpContext.Current.Request.InputStream;
byte[] b = new byte[s.Length];
s.Read(b, 0, (int)s.Length);
return Encoding.UTF8.GetString(b);

只需要從input Stream中讀取byte數據,然後轉為string,再解析即可。如果要回復響應消息只需要用:Response.Write() 輸出即可(和普通的頁面輸出一樣)。

今天在手機App測試接口的時候發現一個通過POST方式的接口 獲取body中的參數一直為空,但是在數據量小的時候卻可以獲取到數據,開始懷疑是不是POST的長度有限制,然後在web.config中修改了一下maxRequestLength,如下

1 2 3 <system.web> <httpRuntime targetFramework="4.5" maxRequestLength=
"20480" /> </system.web>

然後發現 獲取的值還是為空,然後在調試的過程中發現當數據量多的時候Request.InputStream的Position居然是在結束位置,如下圖

技術分享圖片

從上圖可以看出,因為Request.InputStream肯定是被讀過了所以Position會在結束位置,一般Positon都是0。所以獲取body中的參數一直為空,知道原因後在讀取流之前把Position設置為0就可以了

1 2 3 4 5 6 7 8 var stream = HttpContext.Current.Request.InputStream; stream.Position = 0; using (var streamReader = new StreamReader(stream, Encoding.UTF8)) { requestData = streamReader.ReadToEndAsync().Result; requestData = ("appKey" + appKey + requestData + "timestamp" + timestamp).ToUpper(); stream.Position = 0; }

C#中Post請求的兩種方式發送參數鏈和Body的