2010-04-01 85 views
1

我在搜索表單上實現jQuery自動完成,並從Google Search Appliance Autocomple建議服務獲取建議,該服務返回json中的結果集。jQuery自動完成Json Ajax與Google Search Appliance跨瀏覽器問題

我想要做的是去GSA獲取建議,當用戶在搜索框中輸入內容時。

URL,以獲取json的建議如下:

http://gsaurl/suggest?q=<query>&max=10&site=default_site&client=default_frontend&access=p&format=rich 

它傳回的JSON如下:

{ "query":"re", "results": [ {"name":"red", "type":"suggest"}, {"name":"read", "type":"suggest"}] } 

jQuery的自動完成代碼如下:

$(#q).autocomplete(searchUrl, { 
width: 320, 
dataType: 'json', 
highlight: false, 
scroll: true, 
scrollHeight: 300, 
parse: function(data) { 
var array = new Array(); 

for(var i=0;i<data.results.length;i++) 
{ 
    array[i] = { data: data.results[i], value: data.results[i].name, result: data.results[i].name }; 
} 

return array; 
}, 
formatItem: function(row) { 
return row.name; 
} 

});

這適用於IE,但在Firefox中失敗,因爲解析函數返回的數據爲空。 任何想法,爲什麼會這樣?

解決方法

我創建了一個aspx頁面調用GSA建議服務,並從建議的服務回報JSON。使用這個頁面作爲代理並將其設置爲jQuery自動完成中的url可在IE和FireFox中使用。

回答

3

解決方法

我創建了一個aspx頁面調用GSA建議服務,並從建議的服務回報JSON。使用這個頁面作爲代理並將其設置爲jQuery自動完成中的url可在IE和FireFox中使用。

代理代碼

string responseText; 

      try 
      { 
       Uri gsaUrl = new Uri(GetSuggestUrl()); 

       HttpWebRequest request = (HttpWebRequest)WebRequest.Create(gsaUrl); 
       request.ContentType = "application/x-www-form-urlencoded"; 
       request.Method = WebRequestMethods.Http.Get;     

       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       Stream responseStream = response.GetResponseStream(); 
       StreamReader streamReader = new StreamReader(responseStream); 

       responseText = streamReader.ReadToEnd(); 

      } 
      catch(Exception e) 
      { 
       throw new Exception(e.Message, e.InnerException); 
      }   

      string json = responseText; 
      Response.Clear(); 
      //Response.ContentType = "application/json; charset=utf-8"; 
      Response.Write(json); 

     } 

     private string GetSuggestUrl() 
     { 
      string url = "http://<GSA>/suggest"; 
      string query = HttpContext.Current.Request.QueryString["q"]; 
      int max = 10; 
      string site = "site"; 
      string client = "client"; 
      string access = "p"; 
      string format = "rich"; 

      return string.Format("{0}?q={1}&max={2}&site={3}&client={4}&access={5}&format={6}", url, query, max, site, client, access, format); 
     } 
0

作爲6.10和6.14的GSA將返回JSONP編碼建議。我寫了一段時間回here。我已經得到了該帖子的更新,它會告訴你如何在沒有代理的情況下做到這一點。 Servlete和jQuery - - 使用GSA

0

完整代碼的Java

您可以使用servlet的GSAProxyServlet.java創建使用AxisHttp代理。

/** 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, 
     IOException { 
    // TODO Auto-generated method stub 
    Object responseText = null; 
    PrintWriter out = response.getWriter(); 
    try { 
     responseText = generateResponce(request, response); 

     response.setContentType("text/json"); 
     response.setHeader("Cache-Control", "no-cache"); 
     out.print(responseText); 
    } catch (Exception e) { 
     System.out.println(e); 
    } finally { 
     out.close(); 
    } 
} 

private String generateResponce(HttpServletRequest request, HttpServletResponse response) { 
    String responseStr = null; 

    try { 
     String q = (String) request.getParameter("q"); 
     String ulrStr = getSuggestUrl(q); 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet getRequest = new HttpGet(ulrStr); 
     getRequest.addHeader("accept", "application/json"); 

     HttpResponse response1 = httpClient.execute(getRequest); 

     if (response1.getStatusLine().getStatusCode() != 200) { 
      throw new RuntimeException("Failed : HTTP error code : " + response1.getStatusLine().getStatusCode()); 
     } 

     BufferedReader br = new BufferedReader(new InputStreamReader((response1.getEntity().getContent()))); 

     System.out.println("Output from Server .... \n"); 
     String tmp = null; 
     while ((tmp = br.readLine()) != null) { 
      System.out.println(tmp); 
      responseStr = tmp; 
     } 

     httpClient.getConnectionManager().shutdown(); 

     System.out.println("Output# " + responseStr); 

    } catch (Exception e) { 
     System.out.println(e); 
    } 
    return responseStr; 
} 

private String getSuggestUrl(String query) { 
    String url = "http://GSA-URL/suggest?"; 
    String site = "max=10&site=all&client=my_frontend&format=rich"; 
    return url + site + "&q=" + query; 
} 

** * ** * ** * ** * ****JSP jQuery代碼* ** * * * * ** * ** * ** * ** * ****

$("#q").autocomplete({ 
     source : function(request, response) { 
      $.ajax({ 
       url : "GSAProxyServlet", 
       dataType : "json", 
       data : { 
        q : request.term 
       }, 
       success : function(data) { 
        response($.map(data.results, function(item) { 
         return { 
          label: item.name , 
          value: item.name 
         } 
        })); 
       }, 
       failure : function(data) { 
        alert("error"); 
       }, 
       parse: function() { 
        alert("parse"); 
       }, 
      }); 
     },