我有一个函数用于从我的RESTFUL WCF服务中检索数据。返回的数据必须是JSON。
客户端上的我有一个名为autosuggest的javascript函数,如下所示:
function autosuggest(location){
var uri= 'http://localhost:2043/Suggest.svc/GetAirportsjson?location='+location;
$.ajax({
url:uri,
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: 'jsonpCallback(e)',
success: function(e){
alert("success");
}
}); };
服务界面为:
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/GetAirportsXML?location={location}")]
[OperationContract]
List<Suggestions> GetAirportDataXml(string location);
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/GetAirportsJSON?location={location}")]
[OperationContract]
List<Suggestions> GetAirportDataJson(string location);
在Firebug中观察到的位置= m的响应是
[{"AirportCode":"MMZ","AirportName":"Maimana","AreaCode":"701","CountryCode":"AF","CountryName":"Afghanistan"},{"AirportCode":"MZR","AirportName":"Mazar-i-sharif","AreaCode":"701","CountryCode":"AF","CountryName":"Afghanistan"},{"AirportCode":"IMZ","AirportName":"Nimroz","AreaCode":"701","CountryCode":"AF","CountryName":"Afghanistan"},{"AirportCode":"TMR","AirportName":"Aguemar","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"BMW","AirportName":"Bordj Badji Mokhtar","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"IAM","AirportName":"In Amenas","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"MUW","AirportName":"Mascara-Ghriss","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"MZW","AirportName":"Mechria","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"MQV","AirportName":"Mostaganem","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"HME","AirportName":"Oued Irara Apt","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"TMX","AirportName":"Timimoun","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"TLM","AirportName":"Zenata","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"}]
我还将提供我的服务代码
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.ServiceModel.Activation;
namespace AutosuggestAPI.svc
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Suggest : IService1
{
public string GetDateTime()
{
return DateTime.Now.ToString();
}
private static List<Suggestions> GetDistinct(List<Suggestions> suggestions)
{
var length = suggestions.Count;
var Arr = new Suggestions[length];
suggestions.CopyTo(Arr);
var dist = new HashSet<string>();
foreach (var suggestion in Arr)
{
if (!dist.Contains(suggestion.AirportCode.ToString()))
dist.Add(suggestion.AirportCode.ToString());
else
{
suggestions.Remove(suggestion);
}
}
return suggestions;
}
public List<Suggestions> GetAirportDataXml(string location)
{
var suggestions = new List<Suggestions>();
var val = string.Empty;
for (int i = 0; i < 2; i++)
{
val = i == 0 ? "AirPortName" : "AirPortCode";
SqlConnection conn = null;
try
{
// create and open a connection object
conn = new SqlConnection("Server=(local);DataBase=DBAirPortCodes;Integrated Security=SSPI");
conn.Open();
// 1. create a command object identifying
// the stored procedure
var cmd = new SqlCommand("sp_CheckCondition", conn) { CommandType = CommandType.StoredProcedure };
// 2. set the command object so it knows
// to execute a stored procedure
// 3. add parameter to command, which
// will be passed to the stored procedure
cmd.Parameters.Add(new SqlParameter("@lookup", val));
cmd.Parameters.Add(new SqlParameter("@searchfor", location));
var reader = cmd.ExecuteReader();
while (reader.Read())
{
var suggestion = new Suggestions()
{
_airportCode = Convert.ToString(reader["AirPortCode"]).Trim(),
_airportName = Convert.ToString(reader["AirPortName"]).Trim(),
_areaCode = Convert.ToString(reader["AreaCode"]).Trim(),
_countryCode = Convert.ToString(reader["CountryCode"]).Trim(),
_countryName = Convert.ToString(reader["CountryName"]).Trim()
};
suggestions.Add(suggestion);
}
}
finally
{
if (conn != null)
conn.Close();
}
}
var distinctList = GetDistinct(suggestions);
return distinctList;
}
List<Suggestions> GetAirportDataJson(string location)
{
List<Suggestions> suggestions = GetAirportDataXml(location);
return suggestions;
}
public List<Suggestions> GetAirportDataJsonp(string location)
{
return GetAirportDataXml(location);
}
public List<Suggestions> GetAllSuggestions()
{
var suggestions = new List<Suggestions>();
var val = string.Empty;
for (int i = 0; i < 2; i++)
{
val = i == 0 ? "AirPortName" : "AirPortCode";
SqlConnection conn = null;
try
{
// create and open a connection object
conn = new SqlConnection("Server=(local);DataBase=DBAirPortCodes;Integrated Security=SSPI");
conn.Open();
var cmd = new SqlCommand("sp_GetAllAirports", conn) { CommandType = CommandType.StoredProcedure };
var reader = cmd.ExecuteReader();
while (reader.Read())
{
var suggestion = new Suggestions()
{
_airportCode = Convert.ToString(reader["AirPortCode"]).Trim(),
_airportName = Convert.ToString(reader["AirPortName"]).Trim(),
_areaCode = Convert.ToString(reader["AreaCode"]).Trim(),
_countryCode = Convert.ToString(reader["CountryCode"]).Trim(),
_countryName = Convert.ToString(reader["CountryName"]).Trim()
};
suggestions.Add(suggestion);
}
}
finally
{
if (conn != null)
conn.Close();
}
}
var distinctList = GetDistinct(suggestions);
return distinctList;
}
}
}
问题是调用是成功的,我在浏览器中获取数据,但我无法在Jquery或Javascript中捕获它。 有人可以帮忙吗?
答案 0 :(得分:0)
您将错误的字符串传递给jsonCallback。
应该是
function autosuggest(location){
var uri= 'http://localhost:2043/Suggest.svc/GetAirportsjson?location='+location;
$.ajax({
url:uri,
dataType: 'jsonp',
jsonpCallback: 'jsonpCallback',
success: function(e){
alert("success");
}
});
};
为什么要用默认值覆盖默认回调参数名称?
编辑:似乎你真的不明白jquery如何处理jsonp的东西。
jquery创建一个函数来处理jsonp请求的返回,该请求返回json作为包含在此函数调用中的纯文本。你根本不能提供任何功能,这对于jquery和更直接的
更为可取只需要提供的参数是jsonp的数据类型
var r = $.ajax({
url : uri
, dataType:'jsonp'
, success: function (e) {
viewModel.tweets(e.results);
}});
编辑2:您的服务应该处理'callback'参数,如果提供,请在提供的函数调用中包装响应json
即
请求:http://......../GetAirportsjson?location=....&callback=mycallback
回复:mycallback({ .... you real json response goes here .... })
直到你有了这个,你没有做正确的jsonp响应