views:

4542

answers:

7

I need to "post" data to a url in the middle of a script. I haven't been able to find anything like curl for windows though, suggestions?

For instance...

User fills out form Form submits to process.asp (I want to make the curl request in here, it's for a 3rd party integration and then i'm also going to trigger an email) process.asp finishes and directs user to thank you page.

This is classic ASP obviously which allows this type of form processing behavior.

+2  A: 

In .Net it's System.Net.WebClient or System.Net.HttpWebRequest.

Classic ASP has a completely different api- I'm not sure what you would use instead there.

[edit]
I suspect that if classic asp has any built in support for this, it's in a Scripting object, like so: CreateObject("Scripting.????")

Joel Coehoorn
+1  A: 

If you're stuck with class ASP, you can do it with the commercial ASPHTTP library here:

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

Keith Palmer
A: 

In ASP.NET, it's pretty simple:

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
Frank Krueger
Even that is overdoing it- system.net.webclient will handle 99% of your requests in much less code.
Joel Coehoorn
A: 

You can do it by many way. With WebClient

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

Or you can put the data in a stream to use it in your program:

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

But I do prefer use HttpWebRequest:

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

I prefer the second one because you can have more option for POST/GET or for Cookie.

Daok
A: 

Use the class described here. This is a pretty good method and I use it all the time:

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() ;
     }
}

Use it like:

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

I'm not sure why everybody else is posting ASP.Net solutions when you specifically said you're using ASP "classic."

Something like this should work. I didn't write the code; I found it elsewhere. But the MSXML2.ServerXMLHTTP object is what you want to use if you don't want to purchase something commercial.

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

You might need to add some error-handling code to that for use in a production environment. I believe that object throws errors if it gets a 404 or timeout error. You'll need to "trap" them ASP-style (yuck) by setting On Error Resume Next before the .Send and then examine the ASP error object to see if there was a problem.

Good luck!

John Booty
The question originally had several .Net references that were later edited out.
Joel Coehoorn
The Content-Type is superflous for a GET request, there is no content. The User-Agent is fun but also superflous.
AnthonyWJones
UserAgent is not always superfluous- you may actually get different content in the response depending on it.
Joel Coehoorn
+1  A: 

Most form action pages accept data as a 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)
       postFormData = xhr.ResponseText
    Else
        Err.Raise 1001, "postFormData", "Post to " & url & " failed with " & xhr.Status
    End If
End Function

When creating the data url encoding is needed on the data values. Since ASPs Server.URLEncode method only does path encoding and not component encoding you need to replace out / characters with %2F

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