2013年11月25日 星期一

[程式] Ajax & Rails - Check if File at External Domain Exist

欲檢查在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

沒有留言:

張貼留言