求助,关于http get方法问题

mseliqin 2008-05-21 11:47:17
关于http get方法问题
网页中有一个连接包含中文,地址如下:"http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1"
在ie中执行正常
通过抓包工具可以看到以下内容:
“Get /userRpm/StatusRpm.htm?connect=\301\254%20\275\323&wan=1 http1.1”

但是现在有一个问题,用c#写了一个自动执行的应用(winform),用的httpwebrequest类,提交的连接确是下面的样子:
“Get /userRpm/StatusRpm.htm?connect=%E8%BF%9E%20%E6%8E%A5&wan=1 http1.1”
我知道是uri编码的问题,换了几种编码,都不是ie中格式,所以不能实现功能。
请高手们指点一下,这是怎么回事,这个问题困扰了我好几天了。
谢谢
...全文
872 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq525931 2008-12-25
  • 打赏
  • 举报
回复
参考:手把手教你HTTP协议之POST方法
www.wantsoft.com/article/45.htm
Miracle 2008-05-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 addisjeams 的回复:]
http://192.168.1.1/userRpm/StatusRpm.htm?connect=%c1%ac+%bd%d3&wan=1
返回结果是这个,没有空格
[/Quote]
兄弟,你13楼的代码,大部分情况下是不能工作的。假设你要parse的Url Query String是这样的(没有经过UrlEncode):

?abc=def&url=http://www.abc.com/路径/page.ext?param=中文

你把它传入你的InitChineseUrl方法看看会发生什么?第一行就出错了——Invalid URI: The URI scheme is not valid.

还是那句话,回答之前,多测试一下自己的代码。

=========

说了半天,我也没回答楼主的问题——我认为\301\254这样的输出与抓包工具有关。
addisjeams 2008-05-24
  • 打赏
  • 举报
回复
http://192.168.1.1/userRpm/StatusRpm.htm?connect=%c1%ac+%bd%d3&wan=1
返回结果是这个,没有空格
addisjeams 2008-05-24
  • 打赏
  • 举报
回复
http://192.168.1.1/userRpm/StatusRpm.htm?connect=%c1%ac+%bd%d3&wan=1
返回结果是这个,没有空格
addisjeams 2008-05-24
  • 打赏
  • 举报
回复
sorry,我的错,想当然去了


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Class1 的摘要说明
/// </summary>
public class Class1
{
public Class1()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public static string InitChineseUrl(string chineseUrl)
{
Uri url = new Uri(chineseUrl);
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(url.Query, System.Text.Encoding.GetEncoding("utf-8"));
string query = "";
for (int i = 0; i < nv.Count; i++)
{
if (query.Trim() == string.Empty)
{
query = "?" + nv.Keys[i] + "=" + HttpUtility.UrlEncode(nv[i], System.Text.Encoding.GetEncoding("GB2312"));
}
else
{
query += "&" + nv.Keys[i] + "=" + HttpUtility.UrlEncode(nv[i], System.Text.Encoding.GetEncoding("GB2312"));
}
}
string u = chineseUrl.Split('?')[0] + query;
return u;
}
}


这个也许能解决战斗
楼主试试
nik_Amis 2008-05-24
  • 打赏
  • 举报
回复
不知所云
wangkun9999 2008-05-23
  • 打赏
  • 举报
回复
用js里面的encodeURI试试
Miracle 2008-05-23
  • 打赏
  • 举报
回复
10楼的哥哥,你能不能先试验一下你的代码再回帖子?你知不知道这样会害很多初学者?
你知道
string temp = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1";
string strurl = System.Web.HttpUtility.UrlEncode(temp);

的执行结果是什么吗?不知道的话我告诉你:

http%3a%2f%2f192.168.1.1%2fuserRpm%2fStatusRpm.htm%3fconnect%3d%e8%bf%9e+%e6%8e%a5%26wan%3d1

你觉得这是正确的吗?打倒信口开河的。
addisjeams 2008-05-23
  • 打赏
  • 举报
回复
楼上的,整个string temp = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1";
string strurl = System.Web.HttpUtility.UrlEncode(temp);
应该不会错的

它只是负责把不是url的合法部分编译成url

楼主我强烈怀疑你错的地方是你的编码其他部分,你调试一下,弄一个临时变量,监视一下


还有啊!
下载网页代码,你不必在乎什么要和ie链接格式相等,你用firefox,它不支持中文名称的,如果url中有中文,firefox是要转换编码的!,关键就是转换编码的方法是否正确!UrlEncode这个应该是这个正确的,你自己好好调试检查......
Miracle 2008-05-23
  • 打赏
  • 举报
回复
哇哈哈,又搞错了,“2楼正确1楼复杂”,真是晕菜啊。
Miracle 2008-05-23
  • 打赏
  • 举报
回复
汗,我自己也犯错了,“3楼正确2楼复杂”应该是“1楼正确2楼复杂”
Miracle 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 addisjeams 的回复:]
楼上回答正解,2楼的搞得复杂了
[/Quote]

你说3楼正确2楼复杂?

string temp = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1";
string strurl = System.Web.HttpUtility.UrlEncode(temp);

正解个屁!整个URL都编码掉,你疯了?哈哈哈
家鸣 2008-05-22
  • 打赏
  • 举报
回复

使用 GET 方式提交中文数据, 编码方式要以目标的网站为标准。 常用的有 gb2312 和 utf8 两种,如:
Encoding mEncoding = Encoding.GetEncoding("gb2312");
string strUrl = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=" + HttpUtility.UrlEncode("连 接", mEncoding);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{

}

mseliqin 2008-05-22
  • 打赏
  • 举报
回复
首先感谢楼上几位的帮助,你们说的我都用了,不行。
网页的编码是gb2312,我提交的“/userRpm/StatusRpm.htm?connect= %E8%BF%9E%20%E6%8E%A5&wan=1”也是这个编码,
但是从ie地址栏直接提交是这个:/userRpm/StatusRpm.htm?connect=\301\254%20\275\323&wan=1
这两个提交信息中的中文编码不一样,我想再问一下,“\301\254”是什么编码?
谢谢
beblue 2008-05-22
  • 打赏
  • 举报
回复
使用 GET 方式提交中文数据, 编码方式要以目标的网站为标准。 常用的有 gb2312 和 utf8 两种,如:
Encoding mEncoding = Encoding.GetEncoding("gb2312");
string strUrl = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=" + HttpUtility.UrlEncode("连 接", mEncoding);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{

}
addisjeams 2008-05-22
  • 打赏
  • 举报
回复
楼上回答正解,2楼的搞得复杂了
whycom 2008-05-22
  • 打赏
  • 举报
回复
string temp = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1";
string strurl = System.Web.HttpUtility.UrlEncode(temp);

111,125

社区成员

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

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

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