Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
Задача состоит в передаче от клиента серверу ajax-запросом неких данных в формате JSON, распознавании их на сервере (CLS) и пробном редактировании и отправке обратно клиенту. Отправка серверу делается из обычной HTML-странички с помощью подключенной библиотеки JQUERY: КЛИЕНТ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. Встроенные стредства Cache для работы с JSON, как я понял, можно использовать только в составе ZEN, что в моем случае не подходит (сервер должен только приянять данные от клиента, обработать, и отослать обратно), поэтому для обработки JSON я использовал класс CacheJSON https://github.com/PlanetCache/CacheJSON#readme. СЕРВЕР Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Данные клиентом отправляются верные, смотрел FireBug-ом, но на сервере я получаю какой-то "4@%CSP.BinaryStream". метод GetObjectFromJSON не работает почему-то, при выполнении на клиент идет csp-страничка с ошибкой об отсутствии метода (там генерация кода, и он, кажется, некорректно может прочитать название свойства класса) Вопросы: 1) может быть неправильно кодирую в JSON на клиенте? это должна быть строка? 2) правильно ли принимаются данные на сервере, %request.Content ? 3) правильно ли указаны заголовки на сервере p.s. - от гиперсобытий Кашэ отказался, не рекомендуйте. закомментированный код оставил специально, чтобы посмотреть что я уже пытался. Рамки задачи я описал достаточно подробно, помогите пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 13:22 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
Я в этом не так четко понимаю, но посоветовал бы посетить страницу : (Там у человека много разьеснений на счет Json and Ajax На github тоже очень много его примеров.) http://gradvs1.mgateway.com/download/ajax3.0.546.pdf и http://gradvs1.mgateway.com/main/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 14:01 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
Valeriu, ничего нового, но спасибо. Думаю одна из проблем в неправильной приемке данных на сервере. Если отправлять просто Код: plaintext 1. 2. 3. то на сервере работает вот такой доступ к отправленным от клиента данным: Код: plaintext 1. 2. 3. Но это отправка уже не JSON, а хотелось бы отправлять именно объекты - для простоты обращения к свойствам и упрощения кодинга в целом. Ну и для красоты что-ли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 14:20 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
drakutНу и для красоты что-ли... Эва! Типа не просто отправил данные... Но сделал это красиво! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 15:06 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
krvsa, прошу по делу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 15:14 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
drakutkrvsa, прошу по делу Да ты че... А поговорить? (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 15:18 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
автор// вот тут DAiMor упомянул о другом способе кодирования // - не знаю какой правильный //var jsondata = JSON.stringify(data) DAiMor плохого не посоветует :-) , но такой вариант будет работать во всех браузерах кроме IE ранних версий но для IE я подгружаю json2.js , и тогда работает везде %request.Content это Stream а не строка соответственно ее еще нужно прочитать. Код: sql 1. utils.CacheJSON парсить стрим не умеет, поэтому нужно передавать ему строку, но не забываем про ограничение строки по длине в 32килобайта. либо дописать возможность работы со стримом в CacheJSON ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 15:21 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
DAiMor, спасибо БОЛЬШОЕ. А как парсить? преобразовать в строку? я думал данные отправляются обычной строкой.. я в замешательстве ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 15:28 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
drakutDAiMor, спасибо БОЛЬШОЕ. А как парсить? преобразовать в строку? я думал данные отправляются обычной строкой.. я в замешательстве что именно парсить? я строчку уже привел, что то еще надо ? неважно что ты передаешь текстом, сервер в данном случае ожидает что там может прийти много данных, и поэтому собирает полученные данные в поток, потому как строки в каше не резиновые и ограниченные длиной до 32килобайт или до 3.5 мегабайт если включена поддержка длинных строк, но чтение из потока методом Read по умолчанию читает 32000байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 15:42 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
drakut, как-то так : Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 15:52 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
DAiMor, с ваших слов я так понял, что нужно сначала нужно прочитать из потока входящие данные, а потом их парсить. То есть Код: plaintext и req надо еще парсить, а вот как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 15:53 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
drakutВстроенные стредства Cache для работы с JSON, как я понял, можно использовать только в составе ZEN, что в моем случае не подходитМожно. Пример можно найти здесь: 12670293 Привожу ещё один пример по отправке JSON с клиента на сервер и обратно, используя лишь стандартные средства: CSP+JSON, используя ZEN<CSP:CLASS INCLUDES="%callout"> <html> <head> <title></title> <script type="text/javascript" src="zenutils.js"></script> <script type="text/javascript" src="zenCSLM.js"></script> <script language="cache" method="GetArray" arguments="&pMetaData,&pData" returntype="%Status"> //var data = {PHONE: "phone", NAME: "name", COMMENTS: "comments", PHOTO: "photo", COUNTRY: "country", MODID: "modId"}; Set pMetaData = $LB("PHONE","NAME","COMMENTS","PHOTO","COUNTRY","MODID") Set pData(1) = $LB("phone","name","comments","photo","country","modId") Quit $$$OK </script> <script language="cache" method="SrvSave" arguments="json:%String" returntype="%String"> new format,tIO,tXDEV,export,tChunk,obj ##; преобразуем входную JSON-строку в объект do ##class(%ZEN.Auxiliary.jsonProvider).%ParseJSON(json,,.obj) if $IsObject(obj) { ##; посмотрим содержимое поля Phone set ^tmp(1)=obj.Phone } ##; подготовим выходные данные do ..GetArray(.pMetaData,.pData) // собираем в строку всё, что выводится через write set tIO=$IO,tXDEV="|XDEV|"_+$JOB,$ZT="Trap" Do { /// For $$$IsUnicode use UTF-8 Open tXDEV:($ZF(-6,$$$XSLTLibrary,12):"":"S":/HOSTNAME="XSLT":/IOT=$S(($zcvt($get(format),"L")[",utf8")||$$$IsUnicode:"UTF8",1:"RAW"):/IBU=16384:/OBU=16384) Use tXDEV Quit:$$$ISERR(##class(%ZEN.Auxiliary.jsonProvider).%ArrayToJSON(.pMetaData,.pData)) // Flush any remaining output Write *-3 // Now read back a string (up to the maximum possible length, 32k or ~4MB for long strings) Set export = "" While (1) { #dim tChunk As %String Read tChunk:0 Quit:'$L(tChunk) Set export = export _ tChunk } } While (0) :Exit Close tXDEV Use tIO Quit export :Trap Set $ZT="" Goto Exit </script> <script type="text/javascript"> function test() { //набор различных данных var data = {Name: "Sasha", Phone: "123456"}; // преобразуем JSON-объект в строку var dataStr=ZLM.jsonEncode(data,true); zenAlert("data=",dataStr); // передадим наш объект на сервер и получим результат var result=#server(..SrvSave(dataStr))#; // преобразуем строку в JSON-объект var obj=ZLM.jsonParseObject(result); zenAlert("result=",result); zenAlert("obj=",obj); } </script> </head> <body> <button onclick="test();">test</button> </body> </html> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 16:09 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
drakutDAiMor, с ваших слов я так понял, что нужно сначала нужно прочитать из потока входящие данные, а потом их парсить. То есть Код: plaintext и req надо еще парсить, а вот как? в вашем случае вы уже парсите с помощью utils.CacheJSON с помощью метода Decode() куда вы и передадите вашу строку, и строка примет вид s obj = ..Decode(req) только, передавать нужно ему не поток а строку, а он вернет объект типа %ArrayOfDataTypes или %ListOfDataTypes из которого без труда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 16:40 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
DAiMor, как преобразовывать поток в строку? Как раз интересовал момент с передачей данных: Код: plaintext Код: plaintext servit, спасибо, знаю, читал =) но сейчас интересны как раз места с получением данных от клиента, их кодированием/декодированием и прочее, а этот пример никак не поможет. ------------------------------------------------------------------------------------------------------------------------- Уважаемые кашевары, спасибо за помощь, на данный момент вот что (история еще не закончена) : index.html : ... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. test.test.cls : Class test.test Extends (%CSP.Page, utils.CacheJSON) [ ClassType = "", ProcedureBlock ] { Parameter CONTENTTYPE = "TEXT"; Parameter CHARSET = "UTF-8"; Parameter NOCHARSETCONVERT = 1; ClassMethod OnHTTPHeader(ByRef DoPage As %Boolean, Format As %String = "") As %Status { Set %response.Headers("EXPIRES")="Thu, 29 Oct 1998 17:04:19 GMT" Set %response.Headers("CACHE-CONTROL")="private" Set %response.Headers("PRAGMA")="no-cache" Set %response.CharSet = ..#CHARSET Do %response.WriteHTTPHeader(%request.Method'="HEAD") Quit 1 } ClassMethod OnPage() As %Status { //Do ..sessionLogin() //Do $zutil(168,##class(EBD.utils.common).pathCsp()) //Получаем JSON m stream=%request.Data S jsonRequest = $G(stream("json",1)) //D ..PrintVariable(.jsonRequest, "jsonRequest") //строим объект из пришедших данных. У класса-родителя должны быть все свойства "приходящего" от клиента объекта S obj=##class(test.Request).GetObjectFromJSON(jsonRequest) //Строим ответный объект S Response=##class(test.Request).%New() S Response.Name = obj.Name_"123" S Response.Phone = "server was here" //преобразуем ответный объект в JSON S jsonObj=Response.GetJSONFromObject() //D ..PrintVariable(.jsonObj, "jsonObj") W jsonObj Q 1 }} Теперь проблема в парсинге обработанных данных на клиенте: JSON.parse: unexpected character есть подозрение что кашэ что-то там не то делает. В фаербаге смотрю что приходит - вроде все ок, не пойму что такое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 19:09 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
drakutservit, спасибо, знаю, читал =) но сейчас интересны как раз места с получением данных от клиента, их кодированием/декодированием и прочее, а этот пример никак не поможет.Не буду спрашивать запускали ли Вы пример выше, но чтобы функционал моей серверной части совпал с Вашим последним вариантом, сделайте следующее изменение в коде: замените строку Quit:$$$ISERR(##class(%ZEN.Auxiliary.jsonProvider).%ArrayToJSON(.pMetaData,.pData)) на #; подготовим выходные данные set obj.Name=obj.Name_"123" set obj.Phone="server was here" Quit:$$$ISERR(##class(%ZEN.Auxiliary.jsonProvider).%ObjectToJSON(obj)) PS: в вышедшей вчера Caché 2012.2.RC появились ещё два класса: %ZEN.Auxiliary.jsonArrayProvider , %ZEN.Auxiliary.jsonSQLProvider (примеры в документации). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2012, 20:37 |
|
||
|
Jquery - json - AJAX - Cache'
|
|||
|---|---|---|---|
|
#18+
Проблема с парсером ответа от сервера решилась. Его вообще не надо парсить (только если браузер не старый). Нужно было у параметра CONTENTTYPE поставить значение json маленькими буквами: Код: java 1. 2. 3. 4. На клиенте тоже у datatype указываем json, и с ответом обращаемся как с объектом: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2012, 14:54 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=37866676&tid=1557434]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 349ms |

| 0 / 0 |
