Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как с помощью JSON передать серверу словарь с данными? (https://javascript.ru/forum/jquery/20728-kak-s-pomoshhyu-json-peredat-serveru-slovar-s-dannymi.html)

Kotakota 15.08.2011 13:40

Как с помощью JSON передать серверу словарь с данными?
 
Привет!
Есть код:
$.ajax({
  type: "GET",
  dataType: 'jsonp',
  data: 'id = 5',
  url: 'http://localhost/jsonp/',
  success: function (data) {
   alert(data);
  },
});

В этом варианте все просто. Отдаем серверу &id=5
А что если я хочу передать в "data:" словарь?
Как его присвоить переменной?
Что то типа:
$.ajax({
  type: "GET",
  dataType: 'jsonp',
  data: "id = {'key1':'value1','key2':'value2'}",
  url: 'http://localhost/jsonp/',
  success: function (data) {
   alert(data);
  },
});

Этот вариант не работает.
А мне необходимо на серверной стороне взять переменную $_GET['id'] которая будет содержать этот словарь!
Что можно здесь сделать?

devote 15.08.2011 13:58

$.ajax({ 
  type: "GET", 
  dataType: 'jsonp', 
  data: {id:{"key1":'value1',"key2":'value2'}},
  url: 'http://localhost/jsonp/', 
  success: function (data) { 
   alert(data); 
  }, 
});

Kotakota 15.08.2011 14:09

Цитата:

Сообщение от devote (Сообщение 120655)
$.ajax({ 
  type: "GET", 
  dataType: 'jsonp', 
  data: {id:{"key1":'value1',"key2":'value2'}},
  url: 'http://localhost/jsonp/', 
  success: function (data) { 
   alert(data); 
  }, 
});

Возникла ошибка:
"NetworkError: 500 INTERNAL SERVER ERROR - http://localhost/jsonp/?callback=jsonp1313402876472&id%5Bkey1%5D=value1&i d%5Bkey2%5D=value2"

B@rmaley.e><e 15.08.2011 14:28

А это:
Цитата:

Сообщение от Kotakota
500 INTERNAL SERVER ERROR

ни о чём не говорит? Ошибка сервера же.

Kotakota 15.08.2011 14:33

Да, исправил уже.
Я все пытался взять переменную $_GET['id'] из предыдущего примера...
А как теперь взять этот словарь из $_GET на серверной стороне?
Имени у него то нет!

B@rmaley.e><e 15.08.2011 16:44

$_SERVER['QUERY_STRING']

Или, как вариант:
$.ajax({
	type: "GET",
	data: {
		"id" : JSON.stringify({"key1" : "value1", "key2" : "value2'})
	},
	url: 'http://localhost/jsonp/',
	success: function (data) {
		alert(data);
	},
});


И на сервере что-то в духе
json_decode($_GET['id'])

Kotakota 16.08.2011 08:20

Спасибо!
Переменную в этом случае можно поймать как:
$_GET['id[key1]'] или $_GET['id[key2]']

может еще кому будет полезно.
Есть еще вопрос.
Так как в JSOP для отправки данных на сервер используется метод GET, то разве он не ограничен в 255 символов?
Пробовал отправлять больше, все работает!
Нашел еще по этому вопросу:
Причиной тому было непонятно откуда взявшееся убеждение в том, что максимальная длина URL, регламентированная стандартом HTTP, составляет 256 символов. В действительности это далеко не так (ложное воспоминание о числе 256 скорее всего было порождено SQL-типом VARCHAR или чем-то подробным). HTTP формально не лимитирует длину URL, но ограничение на нее накладывают реализации этого протокола.
А как в данный момент с этим обстоят дела?

devote 16.08.2011 09:24

Цитата:

Сообщение от Kotakota
Спасибо!
Переменную в этом случае можно поймать как:
$_GET['id[key1]'] или $_GET['id[key2]']

хм странно, а так чтоль не работает?:
$_GET['id']['key1']
Цитата:

Сообщение от Kotakota
HTTP формально не лимитирует длину URL, но ограничение на нее накладывают реализации этого протокола.
А как в данный момент с этим обстоят дела?

А почему не используешь post? Зачем именно get? отправляй постом, данные будут храниться в переменной $_POST

Kotakota 16.08.2011 13:17

Кажется меня обманули...
Маны которые я читал про JSONP говорили, что в связи с особенностями вызова через <script src="...."> данные могут передаваться только методом GET.
Попробовал через POST, прекрасно работает...

Kolyaj 16.08.2011 14:03

Цитата:

Сообщение от Kotakota
в связи с особенностями вызова через <script src="....">

Цитата:

Сообщение от Kotakota
Попробовал через POST

Интересно, каким образом вам это удалось?

Kotakota 16.08.2011 14:10

Цитата:

Сообщение от Kolyaj (Сообщение 120865)
Интересно, каким образом вам это удалось?

$.ajax({ 
  type: 'POST', 
  dataType: 'jsonp', 
  data: {
'id=5'
    },
  url: 'http://localhost/jsonp/', 
  success: function (data) { 
   alert(data.man1); 
  } 
});

Все работает.
Хотя почти во всех манах читал, что JSONP не работает с POST.

Kolyaj 16.08.2011 14:14

А откуда вы знаете, что этот код делает внутри jQuery? Тут два варианта: либо он отправляет POST, но не JSONP, либо он отправляет JSONP, но не POST.

Kotakota 16.08.2011 14:17

Цитата:

Сообщение от Kolyaj (Сообщение 120868)
А откуда вы знаете, что этот код делает внутри jQuery? Тут два варианта: либо он отправляет POST, но не JSONP, либо он отправляет JSONP, но не POST.

Я думал об этом.
Даже где то читал, что если указан метод POST для jsonp, то jQuery автоматически переделывает его в GET.
Сейчас гуглю на эту тему...

[Добавлено]
> From: Gregory Foster
> I am attempting to POST some JSON data across domains via
> jQuery's low- level .ajax() call; since it is cross-domain, I
> use the JSONP dataType.
That's your problem right there: You can't do that.
Cross-domain JSONP isn't AJAX at all. It doesn't use XMLHttpRequest. It's
nothing more than a dynamic script element that loads JavaScript code.
You can't do a POST with a dynamic script element. Where would you put the
POST data?
I don't know what the $.ajax code is trying to do - maybe it should fail in
a more informative way. It will fail one way or another regardless.
-Mike


и еще лог FireBug моего запроса:
Host localhost
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept text/javascript, application/javascript, */*
Accept-Language ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding gzip, deflate
Accept-Charset windows-1251,utf-8;q=0.7,*;q=0.7
Connection keep-alive
Content-Type application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With XMLHttpRequest - Это, если я не ошибаюсь GET!
Referer http://localhost/
Content-Length 80

Вроде как то так. Не работает jsonp с методом POST!

B@rmaley.e><e 16.08.2011 14:54

Цитата:

Сообщение от Kotakota
X-Requested-With XMLHttpRequest - Это, если я не ошибаюсь GET!

Это тут вообще ни при чём, это дополнительный заголовок XHR запроса, который jQuery вставляет всегда.

Magneto 16.08.2011 14:58

JSONP хорош при обращении к серверам отличным от сервера с которого была загруженна страница. И на сторонний сервер браузер может послать только GET-запрос (политика безопасности). Подчеркну, важная особенность JSONP, это запросы к чужим серверам.

Если же работа происходит только с одним сервером то посылайте и получайте данные так как Вам будет удобно. Нужно отправить большой текстовый кусок ? Отправляете POST-запросом. Хотите в ответ получить JSON, JSONP или XML? Используйте их.

B@rmaley.e><e 16.08.2011 15:20

Цитата:

Сообщение от Magneto
И на сторонний сервер браузер может послать только GET-запрос (политика безопасности)

Вообще-то, послать можно и POST. Вот только не существует способа получить ответ на такой запрос.

Kolyaj 16.08.2011 15:23

Цитата:

Сообщение от B@rmaley.e><e
Вот только не существует способа получить ответ на такой запрос.

Существует. Разумеется, если к обоим серверам доступ есть. Но если сторонний сервер не захочет, то и на get запрос получить ответ нельзя.


Часовой пояс GMT +3, время: 10:28.