web-dev-qa-db-ja.com

Classic ASPのリモートURLにPOSTデータを送信するにはどうすればよいですか?

スクリプトの途中でデータをURLにPOSTする必要があります。

  1. ユーザーがフォームに記入します。
  2. フォームはprocess.aspに送信されます:この時点で、サードパーティの統合にPOSTデータを送信する必要があります。
  3. process.aspが終了し、ユーザーにありがとうページを表示します。
19
nrhammond

ASP "classic"を使用していると具体的に言ったのに、なぜ他の人がASP.Netソリューションを投稿しているのかわかりません。

このようなものが機能するはずです。私はコードを書きませんでした。他の場所で見つけました。ただし、MSXML2.ServerXMLHTTPオブジェクトは、商用のものを購入したくない場合に使用したいものです。

function getHTML (strUrl)
    Set xmlHttp = Server.Createobject("MSXML2.ServerXMLHTTP")
    xmlHttp.Open "GET", strUrl, False
    xmlHttp.setRequestHeader "User-Agent", "asp httprequest"
    xmlHttp.setRequestHeader "content-type", "application/x-www-form-urlencoded"
    xmlHttp.Send
    getHTML = xmlHttp.responseText
    xmlHttp.abort()
    set xmlHttp = Nothing   
end function 

実稼働環境で使用するために、エラー処理コードを追加する必要がある場合があります。オブジェクトが404またはタイムアウトエラーを受け取った場合、オブジェクトはエラーをスローすると思います。 .Sendの前にOnError Resume Nextを設定して、ASPスタイル(yuck)でそれらを「トラップ」する必要があります。次に、ASPエラーオブジェクトを調べて、問題があったかどうかを確認します。

幸運を!

30
John Rose

ほとんどのフォームアクションページは、データをPOSTとして受け入れます。

Function postFormData(url, data)
    Dim xhr : Set xhr = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
    xhr.open "POST", url, false
    xhr.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    xhr.send Data
    If xhr.Status = 200 Then
       postFormData = xhr.ResponseText
    Else
        Err.Raise 1001, "postFormData", "Post to " & url & " failed with " & xhr.Status
    End If
End Function

データを作成するときは、データ値にURLエンコードが必要です。 ASPのServer.URLEncodeメソッドはパスエンコードのみを実行し、コンポーネントエンコードは実行しないため、/文字を%2Fに置き換える必要があります。

Function URLEncodeComponent(value)
    URLEncodeComponent = Server.URLEncode(value)
    URLEncodeComponent = Replace(URLEncodeComponent, "/", "%2F")
End Function
5
AnthonyWJones

.Netでは、System.Net.WebClientまたはSystem.Net.HttpWebRequestです。

クラシックASPのAPIはまったく異なります-代わりに何を使用するかわかりません。

[編集]
ifクラシックaspにはこれに対するサポートが組み込まれていると思われます。これは、次のようにスクリプトオブジェクト内にあります。CreateObject("Scripting.????")

2
Joel Coehoorn

クラスASPで立ち往生している場合は、ここで商用ASPHTTPライブラリを使用してそれを行うことができます。

http://www.serverobjects.com/comp/asphttp3.htm

2

OK、すべての答えは非常に複雑で、すでに解決策を選択していることは知っていますが、単純なServer.Transfer()コマンドで正確に実行できたと思います何が必要。

スクリプトの最後で、Response.Redirect(url)の代わりに新しいページに移動します。Server.Transfer(url)を実行するだけで、Requestコレクション全体が次のページに渡されます。

それについて読んでください ここ (support.Microsoft.com)。

いくつかの落とし穴があります(つまり、ブラウザに同じURLを保持するため、戻るボタンなどでトリックを再生できます)が、それ以外の点では非常に簡単です。

1
MikeMurko

ASP.NETでは、非常に簡単です。

HttpWebRequest r =
  (HttpWebRequest)WebRequest.Create("http://www.google.com");
r.Method = "POST";
using (Stream stream = myRequest.GetRequestStream()) {
    // Write data to stream
}
WebResponse resp = r.GetResponse();
// Do soemthing with the resp
0
Frank Krueger

あなたは多くの方法でそれを行うことができます。 WebClientを使用

 WebClient Client = new WebClient ();
 Client.DownloadFile("http://www.stackoverflow.com/myfile.html", "myfile.html");

または、データをストリームに入れて、プログラムで使用することもできます。

WebClient Client = new WebClient ();
Stream strm = Client.OpenRead ("http://www.stackoverflow.com/myfile.htm");

しかし、私はHttpWebRequestを使用することを好みます:

HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create("http://www.stackoverflow.com/myfile.html");
StreamWriter myWriter = new StreamWriter(objRequest.GetRequestStream());

POST/GETまたはCookieのオプションを増やすことができるため、2番目のものをお勧めします。

0

ここで説明するクラスを使用します。これはかなり良い方法であり、私はいつもそれを使用しています:

http://www.jigar.net/articles/viewhtmlcontent78.aspx

public class  RemotePost{
     private  System.Collections.Specialized.NameValueCollection Inputs 
     = new  System.Collections.Specialized.NameValueCollection() ;

    public string  Url  =  "" ;
    public string  Method  =  "post" ;
    public string  FormName  =  "form1" ;

    public void  Add( string  name, string value ){
        Inputs.Add(name, value ) ;
     }

     public void  Post(){
        System.Web.HttpContext.Current.Response.Clear() ;

         System.Web.HttpContext.Current.Response.Write( "<html><head>" ) ;

         System.Web.HttpContext.Current.Response.Write( string .Format( "</head><body onload=\"document.{0}.submit()\">" ,FormName)) ;

         System.Web.HttpContext.Current.Response.Write( string .Format( "<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >" ,

        FormName,Method,Url)) ;
            for ( int  i = 0 ; i< Inputs.Keys.Count ; i++){
            System.Web.HttpContext.Current.Response.Write( string .Format( "<input name=\"{0}\" type=\"hidden\" value=\"{1}\">" ,Inputs.Keys[i],Inputs[Inputs.Keys[i]])) ;
         }
        System.Web.HttpContext.Current.Response.Write( "</form>" ) ;
         System.Web.HttpContext.Current.Response.Write( "</body></html>" ) ;
         System.Web.HttpContext.Current.Response.End() ;
     }
} 

次のように使用します。

RemotePost myremotepost  =  new  RemotePost() ;
myremotepost.Url  =  "http://www.jigar.net/demo/HttpRequestDemoServer.aspx" ;
myremotepost.Add( "field1" , "Huckleberry" ) ;
myremotepost.Add( "field2" , "Finn" ) ;
myremotepost.Post() ; 
0
BobbyShaftoe