题
我必须将一些参数 POST 到我的网络之外的 URL,而另一边的开发人员要求我不要使用 HTTP 参数:相反,我必须将我的键值发布在 HTTP 标头.
事实是我不太明白他们的意思:我尝试使用类似于 ajax 的帖子,带有 XmlHttp 对象,并且我尝试在标题中写入类似的内容
Request.Headers.Add(key,value);
但我不能(框架例外);我尝试了另一种方式,使用 Response 对象,例如
Response.AppendHeader("key", "value");
然后重定向到页面...但这也行不通。
我想,很明显我被困在那里了,有什么帮助吗?
编辑 我忘了告诉你,我的环境是.Net 2.0,c#,在Win server 2003上。我得到的例外是
System.PlatformNotSupportedException was unhandled by user code
Message="Operation is not supported on this platform."
Source="System.Web"
这看起来像是我尝试 Request.Add 引起的,微软一年前发布了一些不允许这样做的安全修复程序。
解决方案
就像 @lassevk 所说,重定向不起作用。
您应该使用 WebRequest 类从您的页面或应用程序执行 HTTP POST。有一个例子 这里.
其他提示
您尝试过 WebClient 类吗?一个例子可能看起来像:
WebClient client = new WebClient();
NameValueCollection data = new NameValueCollection();
data["var1"] = "var1";
client.UploadValues("http://somewhere.com/api", "POST", data);
看一下 HttpWebRequest。您应该能够使用 HttpWebRequest.Method = "POST" 构造对相关 URL 的请求。
您应该发布更多信息。
例如,这是 C# 吗?看起来是这样,但我可能是错的。
另外,你说你遇到了异常,异常类型和消息是什么?
在任何情况下,您都无法重定向到 POST 页面,您需要从浏览器提交它,而不是从服务器重定向提交,所以如果您想自动执行此操作,我猜您需要生成一个 html 页面一个表单标签,带有一些隐藏的输入字段,然后使用 javascript 提交。
我认为他们的意思是他们不希望您使用 URL 参数 (GET)。如果你使用http headers,它就不再是真正通过POST查询了。
什么语言/框架?
使用 Python 和 httplib2,您应该能够执行以下操作:
http = httplib2.Http()
http.request(url, 'POST', headers={'key': 'value'}, body=urllib.urlencode(''))
我相信 Request 对象只会接受一组特定的预定义标头。
还有一个枚举也列出了所有受支持的 HTTP 标头。
但我一时想不起来……我一会儿就查一下...
我使用 XmlHttpRequest 选项使用 2 个示例页面测试了您的场景。使用 XmlHttpRequest 在发布到的 aspx 页面中可以使用自定义标头。
创建以下 2 个页面。确保 aspx 页面位于解决方案中,以便您可以在调试器中运行,设置断点并检查 Request.Header 集合。
<html>
<头>
< script language="javascript">
function SendRequest()
{
var r = new XMLHttpRequest();
r.open('get', 'http://localhost/TestSite/CheckHeader.aspx');
r.setRequestHeader('X-Test', 'one');
r.setRequestHeader('X-Test', 'two');
r.send(null);
}
< script / >
u003C/head>nu003Cbody>nu003Cform>nu003Cinput type="button" value="Click Me" OnClick="SendRequest();" />nu003C/form>nu003C/body>nu003C/html>
检查标题.aspx
使用系统;
使用系统.Web;
使用 System.Web.UI;
公共部分类 CheckHeader :系统.Web.UI.页面
{
protected void Page_Load(object sender, EventArgs e)
{
string value = string.Empty;
foreach (string key in Request.Headers)
value = Request.Headers[key].ToString();
}
}
男人..这个html编辑器太烂了..或者我不知道如何使用它......
我昨天遇到的异常是由于我愚蠢地尝试在已构建的页面的标题上写入而引起的。
当我开始按照此处指示的方法之一创建请求时,我可以编写标头。
现在我正在使用 WebRequest 对象,如@sectrean 所示的示例中, 这里.
非常感谢大家。StackOverflow 很棒:-)