好了,所以这是一个复杂的问题。已经过了两天半的研究和调试,我现在在这里。如何做两个POST请求在一个会话(JSESSIONID)/饼干
目标: 从政府GST/HST查找网站获取数据。由于它是旧的(作为Java小程序使用)并且没有REST API支持,所以我必须手动对网站执行2个Web请求。 (经过调试的整个一天,我发现,我不得不开始搜索,因为,接受存储在cookie之前先接受条款和conds链接的网址为:Government Search Website)
问题遇到: Flowgear的Web请求节点不允许您指定“Cookie”标头,因此我无法告诉它在两个单独的请求中使用特定的Cookie。所以我必须这样做:
注意: 我想在两个POST请求上使用相同的Cookie,所以我得到适当的数据返回该特定的会话。
当前问题: 我收到此错误:“脚本执行错误:无法发送与此谓词类型的内容主体。”
代码:
using System;
using System.IO;
using System.Collections.Generic;
using System.Xml;
using System.Linq;
using System.Xml.Linq;
using System.Net;
using System.Text;
namespace CSharpScript
{
public partial class Processor
{
public object Process()
{
var request = (HttpWebRequest)WebRequest.Create("https://www.businessregistration-inscriptionentreprise.gc.ca/ebci/brom/registry/registryservlet");
var postData = "iagree=yes";
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
request.KeepAlive = true;
request.Host = "www.businessregistration-inscriptionentreprise.gc.ca";
Uri target = new Uri("https://www.businessregistration-inscriptionentreprise.gc.ca/ebci/brom/registry/registryservlet");
CookieContainer reqCookies = new CookieContainer();
request.CookieContainer = reqCookies;
request.CookieContainer.Add(new Cookie("id","YxmlT6nC0FPUakMqOF7S5ZGM-URCkTR-sjddOY02Gz2XfOodrOia!1465666898"){ Domain = target.Host });
//request.Headers["Cookie"] = "YxmlT6nC0FPUakMqOF7S5ZGM-URCkTR-sjddOY02Gz2XfOodrOia!1465666898";
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
//Part 2
var request2 = (HttpWebRequest)WebRequest.Create("https://www.businessregistration-inscriptionentreprise.gc.ca/ebci/brom/registry/registryPromptSubmit.do");
var postData2 = "businessName=COMPANYNAMEASSTRINGGOESHERE";
postData2 += "&businessNumber=SOMENUMBERGOESHERE";
postData2 += "&requestDate=2014-09-02";
var data2 = Encoding.ASCII.GetBytes(postData2);
request2.Method = "POST";
request2.ContentType = "application/x-www-form-urlencoded";
request2.ContentLength = data2.Length;
request2.KeepAlive = true;
request2.Host = "www.businessregistration-inscriptionentreprise.gc.ca";
//Uri target = new Uri("https://www.businessregistration-inscriptionentreprise.gc.ca/ebci/brom/registry/registryservlet");
request2.CookieContainer = reqCookies;
//request.Headers["Cookie"] = "YxmlT6nC0FPUakMqOF7S5ZGM-URCkTR-sjddOY02Gz2XfOodrOia!1465666898";
using (var stream = request.GetRequestStream())
{
stream.Write(data2, 0, data2.Length);
}
var response2 = (HttpWebResponse)request2.GetResponse();
responseString = new StreamReader(response2.GetResponseStream()).ReadToEnd();
return responseString;
}
}
}
调试: 如果我除了return语句下的 '第2部分' 删除一切,第一个POST正常工作。 在此之前,我在自己的脚本节点有2个部分,并成功返回的数据,但搜索结果中失踪。 (由于会话信息/ cookie的信息不结转)
重要提示:我已经做邮差这些确切的两个请求和它的作品成功地在那里。
如何提交数据POST请求到这个网站通过flowgear任何想法,将不胜感激。 :(
更新:对于第二个POST请求我才意识到自己忘了改
using (var stream = request.GetRequestStream())
相匹配的响应对象“请求2”:
using (var stream = request2.GetRequestStream())
的Web请求成功现在的工作解决!
但是,我的问题仍然存在:我如何使两个单独的请求共享cookie或会话,以及如何将Connection标题属性设置为'Keep-alive'?
我似乎无法找到Web Request节点中的sessionKey属性,并且您是什么意思在两个请求上使用相同的连接?在为连接属性建立一个新的连接并设置为同一个? – ykadaru
该属性位于连接而不是节点本身。看看http://developers.flowgear.net/kb/Node:Web_Request – Daniel
啊好吧!谢谢,这有很大帮助。 – ykadaru