これは複雑な質問です。調査とデバッグに 2 日半以上かかり、現在ここにいます。
目標: 政府の GST/HST 検索 Web サイトからデータを取得します。これは古く (Java アプレットとして使用)、REST API をサポートしていないため、Web サイトに対して 2 つの Web 要求を手動で行う必要があります。(丸一日のデバッグの後、検索を開始する前にまず利用規約に同意する必要があることがわかりました。これは、同意が Cookie に保存されているためです。ウェブサイトへのリンクはこちらです:政府検索ウェブサイト)
問題が発生しました: Flowgear の Web 要求ノードでは「Cookie」ヘッダーを指定できないため、2 つの個別の要求で特定の Cookie を使用するように指示できません。だから私はこれをしなければなりませんでした:
注: 2 つの 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情報が引き継がれていないため)
重要な注意: Postman でこれら 2 つの要求を実行しましたが、正常に動作します。
flowgear を介してこの Web サイトにデータを含む投稿リクエストを送信する方法についてのアイデアは大歓迎です。:(
更新: 2 番目の POST リクエストで、変更するのを忘れていたことに気付きました
using (var stream = request.GetRequestStream())
応答オブジェクト「request2」に一致するように:
using (var stream = request2.GetRequestStream())
Web リクエストが正常に機能するようになりました。解決しました!
ただし、私の質問はまだ残っています: 2 つの個別のリクエストで Cookie またはセッションを共有するにはどうすればよいですか? また、接続ヘッダー プロパティを「Keep-alive」に設定するにはどうすればよいですか?