码迷,mamicode.com
首页 > Windows法式榜样 > 详细

C#中Post请求的两种方法发送参数链和Body的

时间:2018-10-09 23:57:03      浏览:4882      评论:0      收藏:0      [点我收藏+]

标签:sfds   writer   vat   padding   接口   ima   tput   get   param   

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的

标签:sfds   writer   vat   padding   接口   ima   tput   get   param   

原文地址:https://www.cnblogs.com/Alex80/p/9763731.html

(0)
(0)
   
告发
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权一切 京ICP备13008772号-2
迷上了代码!