2010-04-01 7 views
1

J'implémente une saisie semi-automatique jquery dans un formulaire de recherche et je reçois les suggestions du service de suggestions Autocomple de Google Search Appliance qui renvoie un jeu de résultats dans json. Ce que j'essaie de faire est d'aller à la GSA pour obtenir des suggestions lorsque l'utilisateur tape quelque chose dans la boîte de recherche.JQuery Autocomplete JSON Ajax problème de navigateur croisé avec Google Search Appliance

L'URL pour obtenir les suggestions de JSON est la suivante:

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

Le JSON qui est retourné est la suivante:

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

Le code autocomplete jQuery est la suivante:

$(#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; 
} 

});

Cela fonctionne dans IE mais échoue dans firefox car les données retournées dans la fonction d'analyse sont nulles. Des idées pourquoi ce serait le cas?

Solution

J'ai créé une page ASPX pour appeler la GSA propose un service et de retourner le JSON de la suggérer un service. L'utilisation de cette page en tant que proxy et son paramétrage en tant qu'URL dans la saisie semi-automatique jQuery a fonctionné dans IE et FireFox.

Répondre

3

Solution

J'ai créé une page ASPX pour appeler la GSA propose un service et de retourner le JSON de la suggérer un service. L'utilisation de cette page en tant que proxy et son paramétrage en tant qu'URL dans la saisie semi-automatique jQuery a fonctionné dans IE et FireFox.

code Proxy

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

À partir de 6.10 et 6,14 la GSA renverra des suggestions codées dans JSONP. J'ai écrit il y a un certain temps here. J'ai une mise à jour à ce poste qui vous montrera comment le faire maintenant sans le proxy.

0

Code complet en utilisant GSA - Servlete et Jquery - Java

Vous pouvez utiliser servlet GSAProxyServlet.java pour créer un proxy à l'aide 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 code* ** * * * * ** * ** * ** * ** * ****

$("#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"); 
       }, 
      }); 
     },