欲檢查在External Domain的網頁是否存在
必須利用Ajax將URL傳至server端處理
再將結果回傳至前端頁面的JavaScript決定後續動作
其中需要修改前端HTML、Route、 Controller等三個檔案
===== HTML ===== // 該file在URL為/user/share_urls/new時執行
<script>
function check_url(){
var exist = false;
$.ajax({
type: "POST",
url: "check", // 決定該Ajax要執行的URL/Action (= /user/share_urls/check)
data: { url: $("#share_url_url").val() },
// 傳送欲檢查的URL, 一筆名為url、值為$("#share_url_url").val()的data
async: false // wait for ajax response, 避免exist的值在回傳前就被被最後的if statement判讀
})
.done(function(res){ // 當ajax成功回傳後對回傳資料res(可任意命名)進行該function
if ( res.status < 400 ) // 當response status code < 400
exist = true; // 紀錄為網頁存在
});
if( !exist ){ // 若網頁不存在
alert("Url不存在, 請確認!");
return false; // 終止進行後續submit動作 (請參考:[程式] HTML & JavaScript - Check Form)
}
}
</script>
...
<input type="submit" onclick="return check_url()">
===== Route =====
在config/route.rb中加入
match "/user/share_urls/check" => "user/share_urls#check"
或
namespace: user do
match "share_urls/check" => "share_urls#check"
end
===== Controller =====
在share_urls_controller.rb中加入
def check
url = params[:url]
uri = URI(url)
if /^https/.match(url) // 若為https
request = Net::HTTP::Get.new(uri.request_uri)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
res = http.request(request)
else // 若為http
res = Net::HTTP.get_response(uri)
end
render json: {"status" => res.code}
// 傳送一筆名為status、值為response status code的data
end
沒有留言:
張貼留言