Как данные POST для удаленного URL-адреса в классическом ASP?
Мне нужно POST
данные к URL-адресу в середине script.
- Пользователь заполняет форму:
- Форма отправляется в
process.asp
: мне нужно POST
данные для интеграции сторонних разработчиков на этом этапе.
-
process.asp
завершает и направляет пользователя, чтобы поблагодарить вас.
Ответы
Ответ 1
Я не уверен, почему все остальные публикуют решения 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, чтобы увидеть, была ли проблема.
Удачи!
Ответ 2
Большинство страниц действия формы принимают данные как 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
Ответ 3
В .Net это System.Net.WebClient или System.Net.HttpWebRequest.
Классический ASP имеет совершенно другую api-, я не уверен, что вы использовали бы там.
[править]
Я подозреваю, что если у классического asp есть встроенная поддержка этого, он в объекте Scripting, например: CreateObject("Scripting.????")
Ответ 4
Если вы застряли в классе ASP, вы можете сделать это с помощью коммерческой ASPHTTP-библиотеки здесь:
http://www.serverobjects.com/comp/asphttp3.htm
Ответ 5
ОК все ответы были очень сложными, и я знаю, что вы уже выбрали решение, но мне кажется, что простая команда Server.Transfer() могла бы сделать именно то, что вам нужно.
В конце вашего script вместо Response.Redirect(url) на новую страницу просто выполните Server.Transfer(url), и он передаст всю вашу коллекцию запросов на следующую страницу.
Прочитайте об этом здесь (support.microsoft.com).
Есть некоторые уловы (т.е. он сохраняет один и тот же URL-адрес в браузере, чтобы он мог воспроизводить трюки с помощью кнопки "Назад" и т.д.), но в остальном это довольно просто.
Ответ 6
В 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
Ответ 7
Вы можете сделать это по-разному. С помощью 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.
Ответ 8
Используйте класс, описанный здесь. Это довольно хороший метод, и я использую его все время:
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() ;