$.ajax POST 调用 ServiceStack webservice,参数未到达
Posted
技术标签:
【中文标题】$.ajax POST 调用 ServiceStack webservice,参数未到达【英文标题】:$.ajax POST call to ServiceStack webservice, parameter not arriving 【发布时间】:2013-06-03 01:14:12 【问题描述】:我正在尝试学习如何使用 ServiceStack 编写 Web 服务并通过 javascript 中的 ajax 调用它。我通过观看复数视觉电影做到了这一点,我想我几乎想出了如何做到这一点,除了通过服务调用将数据作为参数传递。
我尝试用这个 ajax 调用来调用服务:
var request = ;
request.Amount = 32;
$.ajax( type: 'POST',
contentType: 'application/jsonp; charset=utf-8',
url: "http://localhost:1879/entry",
dataType: 'jsonp',
data: request: request,
success: function(result)
alert(result.Id);
);
服务如下所示:
public class EntryService : Service
public object Post(Entry request)
return new EntryResponse() Id = request.Amount ;
[Route("/entry", "POST")]
public class Entry
public int Amount get; set;
public class EntryResponse
public int Id get; set;
我希望回调中的警报显示数字 32,但它显示数字 0。当我调试我的服务时,我看到 request.Amount 也是 0,所以我认为我在 Ajax 上做错了服务电话,但我不知道是什么。所以我想知道我在这里做错了什么。
【问题讨论】:
您是否将您的服务设置为与 jQuery 的 JSONP 兼容?你知道回调处理程序有一个特定的名称等。 尝试两件事:1)尝试将数据:request:request更改为data:request 2)如果您需要jsonp,请添加SetConfig(new EndpointHostConfig AllowJsonpRequests = true);到您的 AppHost (github.com/ServiceStack/ServiceStack/wiki/Configuration-options) (回复你删除的答案)也许你把事情弄得太复杂了?你想做的事情一点也不复杂。我会回到旧技术并尝试 asmx 或 page 方法。他们用 jQuery 来招待他们。顺便说一句,Web 服务不需要不同的端口。 ***.com/a/16335022/397817 可能有帮助,也可能没有帮助。 【参考方案1】:Pluralsight 课程的作者在这里。希望能帮到你。
您应该做的第一件事是确保 API 正常工作。
转到此:http://localhost:1879/entry
在您的网络浏览器中,您应该会看到一个显示的页面,其中包含有关该服务的信息。如果你不知道你的 URL 错误或 ServiceStack 配置错误。
假设 URL 是正确的,您需要做的就是将数据包装在 JSON.Stringify() 中。 当您发布帖子时,数据必须采用 JSON 格式作为 JSON 字符串。您当前正在发送一个 JSON 对象。
此外,您很可能可以在 $.ajax 调用中将 localhost 位从您的 url 中删除,然后执行“entry”
【讨论】:
【参考方案2】:你不能用 JsonP 发帖。如果您尝试进行跨域 POST,则需要查看 cors 并确保为您要发布的服务启用了该功能。
Post data to JsonP
【讨论】:
我发现 jsonp 选项可以作为解决 ajax 成功回调时根本没有收到任何警报的解决方案。这就是我将 json 更改为 jsonp 的原因。如果我把它改回 json,我根本看不到警报。我没有太多关于 Web 服务的经验,所以我不知道我是否正在尝试进行任何跨域发布。我想要的只是一个 Web 服务,我可以使用参数调用它,可以使用这些参数做一些事情,并从 Web 服务中得到一个基于参数或消息的结果的答案,无论情况需要什么。 那么,如果您尝试连接到不同域上的服务(当您的 web 服务没有您尝试连接到它作为同一 url 域的一部分时),您需要启用cors 正确执行跨域 ajaxing。您能否更好地了解您正在使用哪种设置(您尝试访问的网络服务以及您尝试从何处访问它)? 对于我想在未来建立的网站,我希望通信行为像这样(或任何可能的方式)。我有一个网站:mywebsite.com,它是用 html + jquery + angular js 构建的。我还在同一个域上托管了一个 Web 服务:mywebsite.com/mywebservice(如果需要端口号,则添加 ofc。)。通过 $.ajax,我尝试获取数据并将其推送到该 Web 服务,该 Web 服务处理数据并在需要时提供数据作为回报。为了学习如何建立通信,我尝试使用我第一篇文章中的代码来实现,其中输入是输出。 如果网站和webservice和你说的在同一个域,你不应该使用jsonp。如果您这样做,我认为 applicaiton/jsonp 不正确,您想使用 application/javascript,因为 jsonp 正在将脚本交给您。 (我也不确定应用程序/jsonp 是否存在)***.com/questions/111302/…【参考方案3】:我只使用 jsonp 因为我阅读并希望它可以解决我的问题。但是根据您的解释,我不需要它,所以我将代码更改为:
var request = ;
request.Amount = 32;
$.ajax( type: 'POST',
contentType: 'application/json; charset=utf-8',
url: "http://localhost:1879/json/reply/Entry",
dataType: 'json',
data: request,
success: function(result)
alert(result.Id);
,
error: function(xhr, ajaxOptions, thrownError)
alert("Failure!");
alert(xhr.status);
alert(thrownError);
);
首先,我在没有错误部分的情况下进行了此调用,但什么也没发生,没有警报,没有错误,什么都没有。所以我假设错误被消耗而不是被显示,所以我添加了错误回调,我的假设似乎是正确的。现在我收到 3 个警报,最后 2 个警报显示“400”和“错误请求”。
我搜索了这些错误并尝试了,但我找到的任何可能的解决方案都没有解决我的问题。我在 localhost 部分之后尝试了 2 个 url:/json/reply/Entry 和 /entry,但两者都不起作用。那我做错了什么?
【讨论】:
如果您使用默认的 ServiceStack 端点“api”,请尝试localhost:1879/api/Entry 感谢您的帮助,但它不起作用。如果我将 url 更改为您建议的内容,我会收到 404 错误。如何判断我是否使用了默认的 ServiceStack 端点? 取决于您的托管方式 - 如果您通过 ASP.NET 托管,请检查您的 web.config。您应该看到一个带有 path="api*" 的 http 处理程序设置。如果它只是 path="*" 然后尝试 localhost:1879/Entry。查看此页面 github.com/ServiceStack/ServiceStack/wiki/… - 并尝试查找您的元数据页面 (localhost:1879/api/metadata) 啊,它说 path="*" 并且我的元数据可以通过 localhost:1879/metadata 访问。就像我在上面的一篇文章中所说的那样,再次调用 localhost:1879/Entry 给了我错误的请求(400 错误)。以上是关于$.ajax POST 调用 ServiceStack webservice,参数未到达的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ajax 函数调用中发送 var 以发送 POST? [复制]