Как мне отправить данные на удаленный URL в Classic ASP? - PullRequest
19 голосов
/ 19 декабря 2008

Мне нужно POST данных для URL в середине скрипта.

  1. Пользователь заполняет форму:
  2. Форма отправляется на process.asp: мне нужно POST данных для интеграции с третьей стороной на этом этапе.
  3. process.asp заканчивает и направляет пользователя на страницу благодарности.

Ответы [ 8 ]

30 голосов
/ 19 декабря 2008

Я не уверен, почему все остальные публикуют решения ASP.Net, когда вы специально сказали, что используете ASP "classic".

Нечто подобное должно работать. Я не писал код; Я нашел это в другом месте. Но объект 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 или тайм-аут. Вам нужно «перехватить» их в стиле ASP (yuck), установив On Error Resume Next перед .Send, а затем исследовать объект ошибки ASP, чтобы выяснить, не было ли проблемы.

Удачи!

5 голосов
/ 20 декабря 2008

Большинство страниц действий формы принимают данные как 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-адресов для значений данных. Поскольку метод ASPs Server.URLEncode выполняет только кодирование пути, а не компонентное кодирование, необходимо заменить символы / на% 2F

Function URLEncodeComponent(value)
    URLEncodeComponent = Server.URLEncode(value)
    URLEncodeComponent = Replace(URLEncodeComponent, "/", "%2F")
End Function
2 голосов
/ 19 декабря 2008

Если вы застряли с классом ASP, вы можете сделать это с коммерческой библиотекой ASPHTTP здесь:

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

2 голосов
/ 19 декабря 2008

В .Net это System.Net.WebClient или System.Net.HttpWebRequest.

Классический ASP имеет совершенно другой интерфейс. Я не уверен, что бы вы использовали вместо этого.

[править]
Я подозреваю, что , если classic asp имеет какую-либо встроенную поддержку для этого, он находится в объекте Scripting, например:

1 голос
/ 19 апреля 2011

ОК, все ответы были очень сложными, и я знаю, что вы уже выбрали решение, но я чувствую, что простая команда Server.Transfer () могла бы сделать именно то, что вам нужно.

В конце вашего сценария вместо Response.Redirect (url) на новую страницу - просто выполните Server.Transfer (url), и он передаст всю вашу коллекцию запросов на следующую страницу.

Прочтите об этом здесь (support.microsoft.com).

Есть несколько уловок (то есть, он сохраняет тот же URL в браузере, поэтому может выполнять трюки с помощью кнопки «Назад» и т. Д.), Но в остальном все довольно просто.

0 голосов
/ 19 декабря 2008

Используйте класс, описанный здесь. Это довольно хороший метод, и я все время им пользуюсь:

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 голосов
/ 19 декабря 2008

Вы можете сделать это разными способами. С 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.

0 голосов
/ 19 декабря 2008

В 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...