2008-12-19 31 views
17

Tôi cần phải POST dữ liệu vào url ở giữa tập lệnh.Làm cách nào để đăng dữ liệu lên URL từ xa trong ASP cổ điển?

  1. tài điền dạng:
  2. Mẫu nộp để process.asp: Tôi cần phải POST dữ liệu vào một hội nhập 3rd Party vào thời điểm này.
  3. process.asp hoàn tất và hướng người dùng đến trang cảm ơn.
+0

. Net cũng cho phép loại xử lý đó. Chỉ cần đặt mã processing.asp của bạn trong sự kiện Nhấp chuột cho nút hoặc điều khiển siêu kết nối hoặc thậm chí gọi nó từ sự kiện Tải nếu gửi biểu mẫu IsPostBack và _all_ sẽ gây ra điều này. –

+0

Điều này đã được gắn thẻ là .NET trong 20 phút đầu tiên ... –

Trả lời

26

Tôi không chắc chắn lý do tại sao tất cả mọi người khác đang đăng ASP.Net các giải pháp khi bạn nói cụ thể bạn đang sử dụng ASP "cổ điển".

Điều gì đó như thế này sẽ hoạt động. Tôi không viết mã; Tôi tìm thấy nó ở nơi khác. Nhưng đối tượng MSXML2.ServerXMLHTTP là những gì bạn muốn sử dụng nếu bạn không muốn mua một thứ gì đó thương mại.

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 

Bạn có thể cần thêm một số mã xử lý lỗi vào mã để sử dụng trong môi trường sản xuất. Tôi tin rằng đối tượng ném lỗi nếu nó nhận được lỗi 404 hoặc hết thời gian chờ. Bạn sẽ cần phải "bẫy" chúng theo kiểu ASP (yuck) bằng cách thiết lập On Error Resume Next trước .Send và sau đó kiểm tra đối tượng lỗi ASP để xem có vấn đề gì không.

Chúc may mắn!

+0

Câu hỏi ban đầu có một số tham chiếu .Net sau này được chỉnh sửa. –

+0

Loại nội dung là siêu dữ liệu cho yêu cầu GET, không có nội dung. Tác nhân người dùng rất thú vị nhưng cũng rất đáng sợ. – AnthonyWJones

+3

UserAgent không phải luôn luôn thừa - bạn thực sự có thể nhận được nội dung khác nhau trong phản hồi tùy thuộc vào nó. –

2

Trong .Net là System.Net.WebClient hoặc System.Net.HttpWebRequest.

ASP cổ điển có api hoàn toàn khác - Tôi không chắc chắn bạn sẽ sử dụng cái gì thay vào đó.

[sửa]
Tôi nghi ngờ rằng nếu asp cổ điển đã có xây dựng trong hỗ trợ cho việc này, đó là trong một đối tượng Scripting, như vậy: CreateObject("Scripting.????")

0

Trong ASP.NET, nó khá đơn giản:

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

Thậm chí điều đó còn làm quá mức nó- system.net.webclient sẽ xử lý 99% yêu cầu của bạn bằng mã ít hơn nhiều. –

0

Bạn có thể làm điều đó bằng nhiều cách. Với WebClient

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

Hoặc bạn có thể đặt các dữ liệu trong một dòng suối để sử dụng nó trong chương trình của bạn:

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

Nhưng tôi thích sử dụng HttpWebRequest:

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

tôi thích thứ hai một vì bạn có thể có thêm tùy chọn cho POST/GET hoặc cho Cookie.

0

Sử dụng lớp được mô tả tại đây. Đây là một phương pháp khá tốt và tôi sử dụng nó mọi lúc:

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

sử dụng nó như:

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

Hầu hết các trang hành động biểu mẫu chấp nhận dữ liệu dưới dạng 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 

Khi tạo mã hóa url dữ liệu là cần thiết trên giá trị dữ liệu. Kể từ khi phương pháp ASP Server.URLEncode chỉ thực hiện mã hóa đường dẫn và mã hóa không thành phần bạn cần phải thay thế ra/vào nhân vật với% 2F

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

OK tất cả các câu trả lời là rất phức tạp và tôi biết bạn đã chọn một giải pháp - nhưng tôi cảm thấy như lệnh Server.Transfer() đơn giản có thể thực hiện chính xác những gì bạn cần.

Ở cuối tập lệnh thay vì Response.Redirect (url) đến trang mới - chỉ cần thực hiện Server.Transfer (url) và nó sẽ chuyển toàn bộ bộ sưu tập Yêu cầu của bạn qua trang tiếp theo.

Đọc về nó here (support.microsoft.com).

Có một số sản phẩm khai thác (tức là nó giữ cùng một URL trên trình duyệt để nó có thể chơi các thủ thuật với nút quay lại và như vậy) nhưng nếu không nó sẽ khá đơn giản.

Các vấn đề liên quan