我有一個用戶提交訂單的頁面,在他們提交後,我想要一個url(http://externalsite.com?id=12345&sessionid=abc123
)而不實際將其重定向到外部頁面。如何模擬對網址的訪問?
有沒有辦法做到這一點?
我有一個用戶提交訂單的頁面,在他們提交後,我想要一個url(http://externalsite.com?id=12345&sessionid=abc123
)而不實際將其重定向到外部頁面。如何模擬對網址的訪問?
有沒有辦法做到這一點?
當然,從服務器端代碼中使用HttpWebRequest
。這裏有一個例子:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
"http://externalsite.com?id=12345&sessionid=abc123");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
// Process the response text if you need to...
}
您可以使用WebClient類問題在您的服務器端代碼Asp.Net的HTTP請求。然後,你可以做任何你喜歡的結果html。
如果您需要http://externalsite.com/
用戶的cookie(登錄信息和其他用戶設定),您可以嵌入一個<iframe>
或僞造的圖像或使用從用戶的瀏覽器的AJAX請求。
使用的<iframe>
:
使用 「僞造」 的形象要求(如果你可以忽略任何可能的圖像類型的問題):
<img src="http://externalsite.com?id=12345&sessionid=abc123" width="1" height="1" />
最簡單的形式使用jQuery's cross-browser ajax support:
$.ajax({
url: "http://externalsite.com?id=12345&sessionid=abc123"
});
您還可以將其他格式應用於hi去iframe或圖像,或者當它達到擊中其他服務器的目的時,使用javascript刪除它。
結合上面的兩個答案,來自voithos和Joel Purra,我建議你考慮第三種方案。以下是我對每個人的評估:
1)更有把握的方法是將服務器端作爲您的操作處理程序的一部分,以便實際提交用戶信息。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
"http://externalsite.com?id=12345&sessionid=abc123");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
// Process the response text if you need to...
}
這使你的服務器擊中了他們的服務器,並確保它被稱爲:可以通過voithos'以上方法可以輕鬆完成。這種方法的缺點是它使你的服務器有次要HTTP請求的開銷。如果其他服務器速度很慢,這可能會造成阻塞問題,從而導致您的結果明顯緩慢。你可以通過多線程/異步來解決這個問題 - 但是你得到了這個圖像:它引入了一堆問題來解決這個問題,而這些問題在你的控制之外 - 但是 - 它確保你知道遠程源是否被命中,並且答覆是什麼。 2)或者,如果你的用戶正在製作一個實際的帖子,並獲得一個新的頁面的HTML響應,你可以簡單地將Joel Purra的響應注入到該頁面的HTML中,迫使用戶的瀏覽器負責遠程服務器。
<div style="display: none;">
<iframe src="http://externalsite.com?id=12345&sessionid=abc123"></iframe>
</div>
這種方法的缺點是,如果出於某種原因關閉請求你的客戶火災和不等待加載下一頁面,外部站點返回404錯誤等,不僅將外部處理沒有完成 - 你不會知道它沒有完成。3)如果您有能力使用客戶端庫(如jQuery)進行處理,那麼我建議您將所有表單提交內容以異步方式進行發佈。該方法是這樣的:
<script type="text/javascript">
$(document).bind('ready', function() {
$('#formSubmitButton').bind('click', function (ev) {
ev.preventDefault(); // These two lines stop the default processing from
ev.stopPropagation(); // occurring on form-submit (i.e. no full post-back)
// This line starts an asynchronous call to the server, posting your form
// data itself.
$.ajax({
url: '/My/Post/Url',
type: 'POST',
async: false,
// You could use a library for this kind of form parsing. I suggest
// http://www.json.org/js.html - for serialization, and
// http://code.google.com/p/form2js/ - for form conversion. It's great.
data: { my: 'form', data: 'fields' },
success: function (data) {
$.ajax({
url: '/The/External/Url',
type: 'POST',
async: false,
data: { external: 'data', goes: 'here' },
success: function (remoteData) {
if (remoteData) // validate response here
displaySuccess();
else
displayFailure();
},
error: displayFailure
});
},
error: displayFailure
});
});
});
</script>
在此方法 - 你做張貼到您自己的服務器,併成功 - 立即火了第二個請求到遠程服務器。但是,因爲您等待直到第二個請求已被觸發時才顯示成功/失敗 - 您知道至少在UI層,兩個請求都是在客戶端獲得隊列離開頁面之前完成的。
因此 - 從工作流程和開銷角度來看可能更安全 - 但是,它需要您在JavaScript中編寫一些UI級別的邏輯,這可能會有問題,具體取決於您的項目。
你需要*用戶的瀏覽器*來獲取它,或者你可以從你的服務器上做到這一點嗎? –