我正在构建一个使用jquery与网页通信的Web服务。 我想构建我的webservice,因此它是类型安全的,无需在服务器端执行转换。
如何从客户端发出ajax调用,使用jquery到期望int值参数的服务器。
编辑: 我明白这是不可能的。我用c#编写服务器端。 目前,Web服务支持来自客户端(js)和其他实用程序(其他c#程序)的调用。我目前可以想到的最简单的解决方案是复制方法并将其签名更改为字符串,然后转换数据类型并调用方法,这次使用正确的数据类型。
是否有任何.net 4属性可以装饰我自动执行此操作的方法?
谢谢
答案 0 :(得分:7)
我怕你不能。使用请求发送的所有参数都是string类型。
您可以将参数作为编码的JSON发送。
假设一个对象
{"int":1}
urlencoded它是
%7B%22int%22%3A1%7D
向http://domain.org/params=%7B%22int%22%3A1%7D
发送请求 在domain.org上解码它:
$params=json_decode($_GET['params']);
你会看到类型仍然是整数:
echo gettype($params->int);
但是这也是一个服务器端转换(因为你需要解码JSON)。
关于评论之外,这里有一个例子,表明它不是带口红的猪,试试看是否保留了类型:
<html>
<head>
<title>Test</title>
<script type="text/javascript">
<!--
function request()
{
var obj={
"pig":1,
"cow":2.2,
"duck":'donald',
"rabbit":{"ears":2}
};
location.replace('?params='+encodeURIComponent(JSON.stringify(obj)));
}
//-->
</script>
</head>
<body>
<input type="button" onclick="request()" value="click">
<pre><?php
if(isset($_GET['params']) && $params=json_decode($_GET['params']))
{
var_dump($params);
}
?>
</pre>
</body>
</html>
输出:
object(stdClass)#1 (4) {
["pig"]=>
int(1)
["cow"]=>
float(2.2)
["duck"]=>
string(6) "donald"
["rabbit"]=>
object(stdClass)#2 (1) {
["ears"]=>
int(2)
}
}
这在我看来并不坏,这就是JSON被“发明”的原因,在应用程序之间交换数据。
答案 1 :(得分:3)
出于安全原因,你仍然应该将所有值转换为服务器上的int,。
从客户端,只需传递一下,例如script.php?id=2
$.get('script.php?id=2', function(data) {
$('.result').html(data);
alert('Load was performed.');
});
答案 2 :(得分:3)
你应该从不信任客户端数据,所以你必须检查服务器端的所有值 - 不这样做会导致安全漏洞。
另外,无论如何,它都是无意义的,因为你可以将你的值视为你的JS代码中的int,float或其他任何东西(使用parseInt(),parseFloat()...),但是当向服务器发送请求时,这会丢失 - 参数没有关于发送到服务器的数据类型的任何信息,所以它们都被视为字符串(并且,根据您的服务器,转换为接收时的预期值)
答案 3 :(得分:1)
这取决于您在服务器端使用的语言。有些语言会自动输入,有些则不会。例如,PHP会将类似?id = 1的内容转换为int类型,而我相信ruby会将它保留为字符串值,除非您明确地将其转换为int。
不幸的是,您不能保证从javascript发送的内容本身就是任何类型,而不是具体说明服务器上的结果需要什么语言。您可以使用每个值发送类型参数,但是您仍然必须验证它们在服务器端实际匹配。