如何在一个 session (JSESSIONID)/cookie 中发出两个 POST 请求
How to make two POST Requests in one session (JSESSIONID)/cookie
好吧,这是一个复杂的问题。经过 2 天半的研究和调试,我现在在这里。
目标:
从政府 GST/HST 查询网站获取数据。由于它很旧(用作 Java 小程序)并且没有 REST API 支持,我必须手动向网站发出 2 个 Web 请求。 (经过一整天的调试,我发现在开始搜索之前我必须先接受条款和条件,因为接受存储在 cookie 中。link 网站位于:Government Search Website)
遇到的问题:
Flowgear 的 Web 请求节点不允许您指定 'Cookie' header 因此我无法告诉它在两个单独的请求上使用特定的 cookie。所以我不得不这样做:
注意:
我正在尝试对两个 POST 请求使用相同的 Cookie,以便为特定的 session.
获取正确的数据
当前问题:
我收到此错误:"Script execution error: Cannot send a content-body with this verb-type."
代码:
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;
}
}
}
调试:
如果我删除 'Part 2' 下除 return 语句之外的所有内容,第一个 POST 工作正常。
在此之前,我在自己的脚本节点中有第 2 部分,它 return 成功地编辑了数据,但搜索结果丢失了。 (因为 session info/cookie 信息没有保留)
重要说明:我已经在 Postman 上完成了这两个请求,并且在那里成功运行。
如有任何关于如何通过 flowgear 向本网站提交 post 数据请求的想法,我们将不胜感激。 :(
更新:对于第二个 POST 请求,我意识到我忘了更改
using (var stream = request.GetRequestStream())
匹配响应 object 'request2':
using (var stream = request2.GetRequestStream())
网络请求现在成功了!已解决!
但是,我的问题仍然存在:如何让两个单独的请求共享一个 cookie 或 session 以及如何将连接 header 属性 设置为 'Keep-alive'?
尝试为 Web 请求创建连接并为 session 键 属性 提供一个值。然后在两个请求上使用相同的连接,这会导致它们共享相同的 cookie jar。您不需要手动尝试注入 headers.
请注意,cookie jar 的范围仅限于 Flowgear 站点,并且 in-memory 因此您可以在不同的工作流程中处理这两个请求。例如。一个在 parent 中,一个在子工作流程中。
好吧,这是一个复杂的问题。经过 2 天半的研究和调试,我现在在这里。
目标: 从政府 GST/HST 查询网站获取数据。由于它很旧(用作 Java 小程序)并且没有 REST API 支持,我必须手动向网站发出 2 个 Web 请求。 (经过一整天的调试,我发现在开始搜索之前我必须先接受条款和条件,因为接受存储在 cookie 中。link 网站位于:Government Search Website)
遇到的问题:
Flowgear 的 Web 请求节点不允许您指定 'Cookie' header 因此我无法告诉它在两个单独的请求上使用特定的 cookie。所以我不得不这样做:
注意: 我正在尝试对两个 POST 请求使用相同的 Cookie,以便为特定的 session.
获取正确的数据当前问题: 我收到此错误:"Script execution error: Cannot send a content-body with this verb-type."
代码:
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;
}
}
}
调试: 如果我删除 'Part 2' 下除 return 语句之外的所有内容,第一个 POST 工作正常。 在此之前,我在自己的脚本节点中有第 2 部分,它 return 成功地编辑了数据,但搜索结果丢失了。 (因为 session info/cookie 信息没有保留)
重要说明:我已经在 Postman 上完成了这两个请求,并且在那里成功运行。
如有任何关于如何通过 flowgear 向本网站提交 post 数据请求的想法,我们将不胜感激。 :(
更新:对于第二个 POST 请求,我意识到我忘了更改
using (var stream = request.GetRequestStream())
匹配响应 object 'request2':
using (var stream = request2.GetRequestStream())
网络请求现在成功了!已解决!
但是,我的问题仍然存在:如何让两个单独的请求共享一个 cookie 或 session 以及如何将连接 header 属性 设置为 'Keep-alive'?
尝试为 Web 请求创建连接并为 session 键 属性 提供一个值。然后在两个请求上使用相同的连接,这会导致它们共享相同的 cookie jar。您不需要手动尝试注入 headers.
请注意,cookie jar 的范围仅限于 Flowgear 站点,并且 in-memory 因此您可以在不同的工作流程中处理这两个请求。例如。一个在 parent 中,一个在子工作流程中。