关于C#通过HttpWebRequest调用web api 接口post 传参的问题

chuanzhang5687 2013-11-07 11:18:43
场景是 winform程序通过HttpWebRequest 调用web Api 接口
其中参数没传过去,有做过这东西的,给点建议。
下面贴代码;


 /// <summary>  
/// 创建POST方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <returns></returns>
public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";

request.Headers.Add("X_REG_CODE", "288a633ccc1");
request.Headers.Add("X_MACHINE_ID", "a306b7c51254cfc5e22c7ac0702cdf87");
request.Headers.Add("X_REG_SECRET", "de308301cf381bd4a37a184854035475d4c64946");
request.Headers.Add("X_STORE", "0001");
request.Headers.Add("X_BAY", "0001-01");
request.Headers.Add("X-Requested-With", "XMLHttpRequest");
request.ContentType = "application/x-www-form-urlencoded";
request.Headers.Add("Accept-Language", "zh-CN");
request.Headers.Add("Accept-Encoding", "gzip, deflate");
request.Accept = "*/*";

if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}

if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
// if (cookies != null)
// {
request.CookieContainer = new CookieContainer();
// request.CookieContainer.Add(cookies);
// }
//如果需要POST数据
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 = requestEncoding.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
HttpWebResponse res;
try
{
res = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
res = (HttpWebResponse)ex.Response;
}

return res;
}


下面是调用代码

   public string GetCookies()
{


string url = "http://localhost:17766/Account/LogOn";

IDictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("StoreCode", "0001");
parameters.Add("UserName", "T00000");
parameters.Add("Password", "123456");



//string postData = "StoreCode=0001&UserName=T00000&Password=123456";

//HttpWebResponseUtility.PostData(postData, url, null);



Encoding encoding = Encoding.GetEncoding("gb2312");

HttpWebResponse response = HttpWebResponseUtility.CreatePostHttpResponse(url, parameters, null, null, encoding, null);



String xml = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();

return xml;

}
...全文
45217 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzin6 2014-06-23
  • 打赏
  • 举报
回复
仔细看看学习下
vicent3 2014-03-31
  • 打赏
  • 举报
回复
CheckValidationResult??
vicent3 2014-03-31
  • 打赏
  • 举报
回复
DefaultUserAgent??
小托尼 2013-11-07
  • 打赏
  • 举报
回复
你网页访问的时候,post的应该是一个字符串,用fiddler抓取发送内容看一下实际发送的内容是啥,顺便检查一下Header对不对 string postdata = "email=" + email + "&password=" + passwd + "&origURL=" + "http://www.renren.com/SysHome.dom" + "&domain=renren.com";
feiyun0112 2013-11-07
  • 打赏
  • 举报
回复
用nuget 安装 Web API 客户端库
chuanzhang5687 2013-11-07
  • 打赏
  • 举报
回复
引用 1 楼 feiyun0112 的回复:
建议用Microsoft.AspNet.WebApi.Client调用web Api 接口 http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client ***************************************************************************** 签名档: http://feiyun0112.cnblogs.com/
版主,前提是winform程序,你这个例子 我之前就看过了,行不通, winform 项目里面不提供HttpClient ,WebClient
feiyun0112 2013-11-07
  • 打赏
  • 举报
回复
建议用Microsoft.AspNet.WebApi.Client调用web Api 接口

http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
chuanzhang5687 2013-11-07
  • 打赏
  • 举报
回复
引用 7 楼 iamwangshao 的回复:
用CookieContainer收集,登录之后转到其它页面,带上这个CookieContainer对象。。 CookieContainer cc = new CookieContainer(); request.CookieContainer = cc; 这样就不要自己提取, 每次都会自动收集cookie
恩,已经搞定了。
   res = (HttpWebResponse)request.GetResponse();

                //
                res.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
这段第一行代码出错了,如果强制转换,cookie会丢失的。
小托尼 2013-11-07
  • 打赏
  • 举报
回复
用CookieContainer收集,登录之后转到其它页面,带上这个CookieContainer对象。。 CookieContainer cc = new CookieContainer(); request.CookieContainer = cc; 这样就不要自己提取, 每次都会自动收集cookie
chuanzhang5687 2013-11-07
  • 打赏
  • 举报
回复
POST /Account/LogOn HTTP/1.1

X_REG_CODE: 288a633ccc1

X_MACHINE_ID: a306b7c51254cfc5e22c7ac0702cdf87

X_REG_SECRET: de308301cf381bd4a37a184854035475d4c64946

X_STORE: 0001

X_BAY: 0001-01

X-Requested-With: XMLHttpRequest

Content-Type: application/x-www-form-urlencoded

Accept-Language: zh-CN

Accept-Encoding: gzip, deflate

Accept: */*

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

Host: xxx.xxx.xxx.xxx:89

Content-Length: 46

Expect: 100-continue

Connection: Keep-Alive



HTTP/1.1 100 Continue



StoreCode=0001&UserName=T00000&Password=123456HTTP/1.1 302 Found

Cache-Control: private

Content-Type: text/html; charset=utf-8

Location: /?storeCode=0001

Server: Microsoft-IIS/7.5

Set-Cookie: ASP.NET_SessionId=vzj2u2b3ipilsl01d14sigqd; path=/; HttpOnly

X-AspNetMvc-Version: 4.0

X-AspNet-Version: 4.0.30319

Set-Cookie: .STOREOSSAUTH=9FC4913C5831E0780D421D192BE596770E766ECEB4916F007C4674688BA4C9063224186DBA25F25CB621C522C3F71A96332E38CB97AD525FF1B16E1BA331CB496FCA3847F867F51BFDEDAC94BD0980E7FC086631E731B66838B5127589A5DD56DF4C0EA2BCCC9A9E416A7ED7E7A3EC2B4E68730AC7CC9200A882E801AA65453C30E4963C02FC06AA80CE7B44E5E6840CA8645FEB12D494D6B5A8853795824CFBEDDB190A164B17281438A247EC24C5035B7E9AE9D2107E3908EC456A4CA763EBDA786FF4D28219C2D76CA0231385E830; path=/

Set-Cookie: X_STORE_OS_COOKIE_STORE_CODE=0001; expires=Fri, 07-Nov-2014 05:24:34 GMT; path=/

X-Powered-By: ASP.NET

Date: Thu, 07 Nov 2013 05:24:34 GMT

Content-Length: 133



<html><head><title>Object moved</title></head><body>

<h2>Object moved to <a href="/?storeCode=0001">here</a>.</h2>

</body></html>

GET /?storeCode=0001 HTTP/1.1

X_REG_CODE: 288a633ccc1

X_MACHINE_ID: a306b7c51254cfc5e22c7ac0702cdf87

X_REG_SECRET: de308301cf381bd4a37a184854035475d4c64946

X_STORE: 0001

X_BAY: 0001-01

X-Requested-With: XMLHttpRequest

Content-Type: application/x-www-form-urlencoded

Accept-Language: zh-CN

Accept-Encoding: gzip, deflate

Accept: */*

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

Host: xxx.xxx.xxx.xxx:89

Cookie: ASP.NET_SessionId=vzj2u2b3ipilsl01d14sigqd; .STOREOSSAUTH=9FC4913C5831E0780D421D192BE596770E766ECEB4916F007C4674688BA4C9063224186DBA25F25CB621C522C3F71A96332E38CB97AD525FF1B16E1BA331CB496FCA3847F867F51BFDEDAC94BD0980E7FC086631E731B66838B5127589A5DD56DF4C0EA2BCCC9A9E416A7ED7E7A3EC2B4E68730AC7CC9200A882E801AA65453C30E4963C02FC06AA80CE7B44E5E6840CA8645FEB12D494D6B5A8853795824CFBEDDB190A164B17281438A247EC24C5035B7E9AE9D2107E3908EC456A4CA763EBDA786FF4D28219C2D76CA0231385E830; X_STORE_OS_COOKIE_STORE_CODE=0001



HTTP/1.1 302 Found

Cache-Control: private

Content-Type: text/html; charset=utf-8

Location: /Venus/index.html?pageSize=20&contextPath=/&data=/odata

Server: Microsoft-IIS/7.5

X-AspNetMvc-Version: 4.0

X-AspNet-Version: 4.0.30319

Set-Cookie: X_STORE_OS_COOKIE_STORE_CODE=0001; expires=Fri, 07-Nov-2014 05:24:34 GMT; path=/

X-Powered-By: ASP.NET

Date: Thu, 07 Nov 2013 05:24:34 GMT

Content-Length: 180



<html><head><title>Object moved</title></head><body>

<h2>Object moved to <a href="/Venus/index.html?pageSize=20&contextPath=/&data=/odata">here</a>.</h2>

</body></html>

GET /Venus/index.html?pageSize=20&contextPath=/&data=/odata HTTP/1.1

X_REG_CODE: 288a633ccc1

X_MACHINE_ID: a306b7c51254cfc5e22c7ac0702cdf87

X_REG_SECRET: de308301cf381bd4a37a184854035475d4c64946

X_STORE: 0001

X_BAY: 0001-01

X-Requested-With: XMLHttpRequest

Content-Type: application/x-www-form-urlencoded

Accept-Language: zh-CN

Accept-Encoding: gzip, deflate

Accept: */*

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

Host: xxx.xxx.xxx.xxx:89

Cookie: ASP.NET_SessionId=vzj2u2b3ipilsl01d14sigqd; .STOREOSSAUTH=9FC4913C5831E0780D421D192BE596770E766ECEB4916F007C4674688BA4C9063224186DBA25F25CB621C522C3F71A96332E38CB97AD525FF1B16E1BA331CB496FCA3847F867F51BFDEDAC94BD0980E7FC086631E731B66838B5127589A5DD56DF4C0EA2BCCC9A9E416A7ED7E7A3EC2B4E68730AC7CC9200A882E801AA65453C30E4963C02FC06AA80CE7B44E5E6840CA8645FEB12D494D6B5A8853795824CFBEDDB190A164B17281438A247EC24C5035B7E9AE9D2107E3908EC456A4CA763EBDA786FF4D28219C2D76CA0231385E830; X_STORE_OS_COOKIE_STORE_CODE=0001

捕捉了一下,传过去了,捕捉到的里面的东西 有我想要了

求告知,红色的cookie怎么获取
chuanzhang5687 2013-11-07
  • 打赏
  • 举报
回复
引用 3 楼 feiyun0112 的回复:
用nuget 安装 Web API 客户端库
这种方案不行,因为我的程序最终是要发布到 windows mobile 系统里面。 所以还是得通过HttpWebRequest 这种方式。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧