1

我正在搜索表单上实现 jquery 自动完成功能,并从 Google Search Appliance 自动完成建议服务获取建议,该服务返回 json 中的结果集。

当用户在搜索框中输入内容时,我想做的是去 GSA 获取建议。

获取json建议的url如下:

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 中都有效。

4

3 回答 3

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); 
        }
于 2010-05-21T11:02:59.367 回答
0

从 6.10 和 6.14 开始,GSA 将返回以 JSONP 编码的建议。我在这里写了一段时间。我对该帖子进行了更新,它将向您展示如何在没有代理的情况下立即执行此操作。

于 2012-07-21T03:32:12.577 回答
0

使用 GSA 的完整代码 - Servlete 和 Jquery - 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");
                },
            });
        },
于 2013-02-08T23:22:33.960 回答