HttpWebRequest发送post请求时有多个参数如何处理?

y2012 2012-08-11 03:27:46
在网上找了一段winform中发送post请求的代码,但是我要post的参数有多个,我试了下用&,|连接都出错。报远程服务器返回错误:(400)错误的请求。
string strURL = "http://localhost/Play/CH1/Service1.asmx/doSearch";
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(this.textBox1.Text);



//这是我的代码:
string paraUrlCoded = System.Web.HttpUtility.UrlEncode("userCode");
paraUrlCoded += "=" + System.Web.HttpUtility.UrlEncode(this.textBox1.Text);
paraUrlCoded ="&"+ System.Web.HttpUtility.UrlEncode("userName");
paraUrlCoded += "=" + System.Web.HttpUtility.UrlEncode(this.textBox2.Text);

byte[] payload;
//将URL编码后的字符串转化为字节
payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
//设置请求的 ContentLength
request.ContentLength = payload.Length;
//获得请 求流
Stream writer = request.GetRequestStream();
//将请求参数写入流
writer.Write(payload,0,payload.Length);
// 关闭请求流
writer.Close();
System.Net.HttpWebResponse response;
// 获得响应流
response = (System.Net.HttpWebResponse)request.GetResponse();
System.IO.Stream s;
s = response.GetResponseStream();
XmlTextReader Reader = new XmlTextReader(s);
Reader.MoveToContent();
string strValue = Reader.ReadInnerXml();
strValue = strValue.Replace("<","<");
strValue = strValue.Replace(">",">");
MessageBox.Show(strValue);
Reader.Close();
...全文
36940 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
西南黑少 2014-11-12
  • 打赏
  • 举报
回复
楼上的winform代码的列子可行
jk19910410 2014-08-29
  • 打赏
  • 举报
回复
留名回头来看
Inkheart_ly 2014-03-26
  • 打赏
  • 举报
回复
留名回头来看
lylisheng 2013-06-28
  • 打赏
  • 举报
回复
对我这个新手,非常的有帮助,希望以后还能提供一些这样经典的指导给我们,让我们一同成长和进步.谢了!
孟子E章 2012-08-12
  • 打赏
  • 举报
回复
测试编码问题

private void button1_Click(object sender, EventArgs e)
{
//测试编码问题
string p1 = "测试的代码<啊啊啊>";
string p2 = "\"'===&&";
string p3 = "??";

string strURL = "http://localhost:2852/WebSite1/Service1.asmx/doSearch";
System.Net.HttpWebRequest request;
request = (System.Net.HttpWebRequest)HttpWebRequest.Create(strURL);
//Post请求方式
request.Method = "POST";
// 内容类型
request.ContentType = "application/x-www-form-urlencoded";

//这是原始代码:
string paraUrlCoded = "p1=" + Uri.EscapeDataString(p1) + "&p2=" + Uri.EscapeDataString(p2) + "&p3=" + Uri.EscapeDataString(p3);
byte[] payload;
//将URL编码后的字符串转化为字节
payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
//设置请求的 ContentLength
request.ContentLength = payload.Length;
//获得请 求流
Stream writer = request.GetRequestStream();
//将请求参数写入流
writer.Write(payload, 0, payload.Length);
// 关闭请求流
writer.Close();
System.Net.HttpWebResponse response;
// 获得响应流
response = (System.Net.HttpWebResponse)request.GetResponse();
System.IO.Stream s;
s = response.GetResponseStream();
XmlDocument d = new XmlDocument();
d.Load(s);
MessageBox.Show(d.DocumentElement.InnerText);

}
孟子E章 2012-08-12
  • 打赏
  • 举报
回复
下面是我做的一个测试,你可以完全拷贝下来进行测试

asmx代码
<%@ WebService Language="C#" Class="Service1" %>

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService {

[WebMethod]
public string doSearch(String p1,String p2,String p3)
{
return "Hello World" + p1 + p2 + p3;
}
}


winform代码

private void button1_Click(object sender, EventArgs e)
{
string strURL = "http://localhost:2852/WebSite1/Service1.asmx/doSearch";
System.Net.HttpWebRequest request;
request = (System.Net.HttpWebRequest)HttpWebRequest.Create(strURL);
//Post请求方式
request.Method = "POST";
// 内容类型
request.ContentType = "application/x-www-form-urlencoded";

//这是原始代码:
string paraUrlCoded = "p1=x&p2=y&p3=测试的中文";
byte[] payload;
//将URL编码后的字符串转化为字节
payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
//设置请求的 ContentLength
request.ContentLength = payload.Length;
//获得请 求流
Stream writer = request.GetRequestStream();
//将请求参数写入流
writer.Write(payload, 0, payload.Length);
// 关闭请求流
writer.Close();
System.Net.HttpWebResponse response;
// 获得响应流
response = (System.Net.HttpWebResponse)request.GetResponse();
System.IO.Stream s;
s = response.GetResponseStream();
XmlDocument d = new XmlDocument();
d.Load(s);
MessageBox.Show(d.DocumentElement.InnerText);

}
孟子E章 2012-08-12
  • 打赏
  • 举报
回复
param1是不需要加的
结果报错,可能是提供的参数或者编码格式还是不正确

注意参数名称要完全一样
y2012 2012-08-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
是的,格式是
string data = "param1=x1&param2=x2&param3=x3&param4=x5&param6=x7"
[/Quote]
第一个参数param1前面是不是也要加&,我就是像你这样写的,结果报错了。
孟子E章 2012-08-12
  • 打赏
  • 举报
回复
是的,格式是
string data = "param1=x1¶m2=x2¶m3=x3¶m4=x5¶m6=x7"
y2012 2012-08-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
//这是我的代码:

byte[] payload;
StringBuilder sb = new StringBuilder();
sb.Append("&userCode="+this.textBox1.Text);
sb.Append("&userName="+this.textBox2.Text);
//将URL编码后的字符串转化为字节
payload = S……
[/Quote]
每个参数前面都加&?
蝶恋花雨 2012-08-11
  • 打赏
  • 举报
回复
//这是我的代码:

byte[] payload;
StringBuilder sb = new StringBuilder();
sb.Append("&userCode="+this.textBox1.Text);
sb.Append("&userName="+this.textBox2.Text);
//将URL编码后的字符串转化为字节
payload = System.Text.Encoding.UTF8.GetBytes(sb.ToString());

//设置请求的 ContentLength
request.ContentLength = payload.Length;
//获得请 求流
Stream writer = request.GetRequestStream();
//将请求参数写入流
writer.Write(payload,0,payload.Length);
// 关闭请求流
writer.Close();
System.Net.HttpWebResponse response;
// 获得响应流
response = (System.Net.HttpWebResponse)request.GetResponse();
System.IO.Stream s;
s = response.GetResponseStream();
XmlTextReader Reader = new XmlTextReader(s);
Reader.MoveToContent();
string strValue = Reader.ReadInnerXml();
strValue = strValue.Replace("<","<");
strValue = strValue.Replace(">",">");
MessageBox.Show(strValue);
Reader.Close();

标红色 的
蝶恋花雨 2012-08-11
  • 打赏
  • 举报
回复

//这是我的代码:
byte[] payload;
StringBuilder sb = new StringBuilder();
sb.Append("&userCode="+this.textBox1.Text);
sb.Append("&userName="+this.textBox2.Text);
//将URL编码后的字符串转化为字节
payload = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
//设置请求的 ContentLength
request.ContentLength = payload.Length;
//设置请求的 ContentLength 这中间的代码换成我的。
这样就没问题了。

rayyu1989 2012-08-11
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/system.net.webclient.uploadstring(v=vs.80).aspx

WebClient.UploadString 可以满足你的要求

UploadStringAsync为异步请求

111,098

社区成员

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

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

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