jQuery Autocomplete Json Ajax кросс-браузер проблема с Google Search Appliance
Я внедряю автозаполнение 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 ответа
Временное решение
Я создал страницу 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);
}
С 6.10 и 6.14 GSA будет возвращать предложения, закодированные в JSONP. Я написал здесь некоторое время назад. У меня есть обновление к этому посту, которое покажет вам, как сделать это сейчас без прокси.
Полный код с использованием 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 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");
},
});
},