2016-05-12 65 views
1

好了,所以这是一个复杂的问题。已经过了两天半的研究和调试,我现在在这里。如何做两个POST请求在一个会话(JSESSIONID)/饼干

目标: 从政府GST/HST查找网站获取数据。由于它是旧的(作为Java小程序使用)并且没有REST API支持,所以我必须手动对网站执行2个Web请求。 (经过调试的整个一天,我发现,我不得不开始搜索,因为,接受存储在cookie之前先接受条款和conds链接的网址为:Government Search Website

问题遇到: Flowgear的Web请求节点不允许您指定“Cookie”标头,因此我无法告诉它在两个单独的请求中使用特定的Cookie。所以我必须这样做:Workflow

注意: 我想在两个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'?

回答

0

尝试创建的Web请求的连接,并提供会话密钥属性的值。然后在两个请求上使用相同的连接,这会导致它们共享同一个cookie jar。您不需要手动尝试注入标题。

请注意,Cookie jar的作用域为Flowgear站点,并且位于内存中,因此您可以在不同的工作流程中拥有这两个请求。例如。一个在父母,一个在子工作流程中。

+0

我似乎无法找到Web Request节点中的sessionKey属性,并且您是什么意思在两个请求上使用相同的连接?在为连接属性建立一个新的连接并设置为同一个? – ykadaru

+0

该属性位于连接而不是节点本身。看看http://developers.flowgear.net/kb/Node:Web_Request – Daniel

+0

啊好吧!谢谢,这有很大帮助。 – ykadaru