Как отправить параметры типа INT, используя JQuery - PullRequest
3 голосов
/ 20 января 2011

Я создаю веб-сервис, который будет взаимодействовать с веб-страницей с помощью jquery. Я хочу создать свой веб-сервис таким образом, чтобы он был безопасным для типов, без необходимости выполнять преобразования на стороне сервера.

Как я могу выполнить ajax-вызов со стороны клиента, используя jquery для сервера, который ожидает параметр int value.

Edit: Я понял, что это невозможно. Я программирую на стороне сервера с помощью C #. В настоящее время веб-служба поддерживает как вызовы со стороны клиента (js), так и другие утилиты (другие программы на c #). Самое простое решение, о котором я сейчас могу подумать, - это скопировать методы и изменить их подпись на строку, затем преобразовать типы данных и вызвать методы, на этот раз с правильными типами данных.

Есть ли какой-либо атрибут .net 4, которым я могу украсить свой метод, который выполняет это автоматически?

Спасибо

Ответы [ 4 ]

8 голосов
/ 20 января 2011

Боюсь, ты не сможешь. Все параметры, отправленные с запросом, имеют тип 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).

Что касается последующего комментария, вот пример, который показывает, что это не свинья с помадой, попробуйте и посмотрите, сохранились ли типы:

<code><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);
  }
?>

Выход:

object(stdClass)#1 (4) {
  ["pig"]=>
  int(1)
  ["cow"]=>
  float(2.2)
  ["duck"]=>
  string(6) "donald"
  ["rabbit"]=>
  object(stdClass)#2 (1) {
    ["ears"]=>
    int(2)
  }
}

Мне кажется, это неплохо, просто для этого был «изобретен» JSON, для обмена данными между приложениями.

3 голосов
/ 20 января 2011

вы должны никогда не доверять клиентским данным , поэтому вам все равно придется проверять все значения на стороне сервера - если это не будет сделано, это приведет к дырам в безопасности.

кроме того, в любом случае это бессмысленно,потому что вы можете рассматривать ваши значения как целые числа, числа с плавающей запятой или что-то еще в вашем JS-коде (используя parseInt (), parseFloat () ...), но при отправке запроса на сервер это теряется - параметры не имеют никакогоинформация об их типе данных отправляется на сервер, поэтому все они обрабатываются как строки (и, в зависимости от вашего сервера, преобразуются в ожидаемые при получении)

3 голосов
/ 20 января 2011

Вы все равно должны преобразовать все значения в int на сервере, по соображениям безопасности.

От клиента, просто введите целые, как script.php?id=2

$.get('script.php?id=2', function(data) {
  $('.result').html(data);
  alert('Load was performed.');
});
1 голос
/ 20 января 2011

Это будет зависеть от того, какой язык вы используете на стороне сервера. Некоторые языки будут автоматически набирать приведение, другие - нет. Например, PHP преобразует что-то вроде? Id = 1 в тип int, тогда как я полагаю, что ruby ​​будет сохранять это строковое значение, если вы явно не приведете его к типу int.

К сожалению, вы не можете гарантировать, что что-то, отправленное из javascript, само по себе является каким-либо типом, не зная точно, какой язык ожидает результаты на сервере. Вы можете отправить параметры типа с каждым значением, но вам все равно придется проверить, что они действительно совпадают на стороне сервера.

...