jQuery Autocomplete Json Ajax кросс-браузер проблема с Google Search Appliance - PullRequest
1 голос
/ 01 апреля 2010

Я реализую автозаполнение jquery в форме поиска и получаю предложения от службы предложений автозаполнения Google Search Appliance, которая возвращает набор результатов в json.

Я пытаюсь сделать это, чтобы перейти к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 из службы предложения.Использование этой страницы в качестве прокси и установка ее в качестве URL-адреса в автозаполнении jQuery работали как в IE, так и в FireFox.

Ответы [ 3 ]

3 голосов
/ 21 мая 2010

Обход

Я создал страницу aspx, чтобы позвонить в службу предложения GSA и вернуть json из службы предложения. Использование этой страницы в качестве прокси и установка ее в качестве URL-адреса в автозаполнении jQuery работали как в 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 голосов
/ 09 февраля 2013

Полный код с использованием GSA - Servlete и Jquery - Java

Вы можете использовать сервлет 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 Код запроса ***********************

$("#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");
                },
            });
        },
0 голосов
/ 21 июля 2012

Начиная с 6.10 и 6.14 GSA будет возвращать предложения, закодированные в JSONP. Я недавно написал здесь . У меня есть обновление к этому сообщению, которое покажет вам, как сделать это сейчас без прокси.

...