上Google Blogger API Reference Guide看到可以用GET方式得到Comments的XML。
當然二話不說,打開Aptana Studio立即工作。
基於jQuery Ajax,不到一小時已經搞定,在本機試行,沒有問題。
沾沾自喜地心想: (那會難得到我?)
那就把程式碼Copy & Paste至Blogger的HTML/JavaScript小工具,儲存,看一看。
OMFG~竟然什麼都沒有,打開IE9的F12 Developer Tool看看出現大概是這樣的Error。
XMLHttpRequest cannot load XXX.上Google搜尋一下,原來是Google防止Cross-Domain Request帶出的問題。
Origin XXX is not allowed by Access-Control-Allow-Origin.
根據一些討論區答案,解決方法是轉用JSONP,因為Google API 伺服器不支援CORS (Cross-origin resource sharing)。
其實Google API 既有提供JSON,jQuery亦可以解讀,當然問題其實老早已解決。
但我就是有點不服氣,深入理解一下CORS。
按照網上的高手建議,
可以在Http Headers (PHP/ASP.NET)或jQuery Ajax中加入:
Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Authorization
之後又有人建議對jQuery設定
$.support.cors = true; crossDomain: true;
當然統統試過都沒有用,因為主導權是在Server那邊,要是好像Google般不容許Cross-Domain Request的話,無論如何在Headers出什麼古惑都沒有用。
以下就是我的Blogger Recent Comments的XML版本。
http://webapp.heliohost.org/html/blogger_recent_comments.htm
Save As另存新檔後,在本機用Browser打開,是沒有問題的。
但在線上看,就會出現我說的問題。
當然現在問題已經解決,我已經轉用JSONP方式去實現。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>blogger_recent_comments</title> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script type="text/javascript"> function contains(arr, obj) { for(var i = 0; i < arr.length; i++) { if(arr[i].toLowerCase() == obj.toLowerCase() && arr[i].length == obj.length) return true; } } if( typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function(str) { return this.indexOf(str) == 0; }; } $(document).ready(function() { var feedurl = "http://www.blogger.com/feeds/880240131395666753/comments/default"; var maxcount = 10; var minlength = 10; var exclude_name = new Array("達MiNG"); $.support.cors = true; $.ajax({ type : "GET", url : feedurl, dataType : "xml", crossDomain : true, headers : { "GData-Version" : "2" }, success : function(responseData, textStatus, jqXHR) { var cnt = 0; var html = ""; $(responseData).find('entry').each(function() { var title = $(this).find("title").text(); var content = $(this).find('content').text(); var url = $(this).find("link[rel='alternate']").attr('href'); var authorname = $(this).find("author").find('name').text(); if(!contains(exclude_name, authorname) && !content.startsWith('[...]') && title.length >= 10) { html += "<span style='font-family:Arial;color:#333;font-size:11px;font-weight:bold;'>" + authorname + " 說 : </span><br />" + "<span style='font-family:Arial;color:#666;font-size:11px;'>" + title + "</span><br /><br />"; cnt++; } if(cnt == maxcount) return false; }); var dom = $(html); $('#recent_comments').append(dom); }, error : function(responseData, textStatus, errorThrown) { console.log(textStatus); } }); }); </script> </head> <body> <div id="recent_comments"></div> </body> </html>
沒有留言:
發佈留言