{"id":666,"date":"2025-10-14T16:09:18","date_gmt":"2025-10-14T07:09:18","guid":{"rendered":"https:\/\/aquaguide.cdnetworks.com\/?page_id=666"},"modified":"2025-10-14T16:09:38","modified_gmt":"2025-10-14T07:09:38","slug":"callback-%ec%9a%94%ec%b2%ad-%ec%b2%98%eb%a6%ac","status":"publish","type":"page","link":"https:\/\/aquaguide.cdnetworks.com\/?page_id=666","title":{"rendered":"Callback \uc694\uccad \ucc98\ub9ac"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"666\" class=\"elementor elementor-666\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2761f36c e-flex e-con-boxed e-con e-parent\" data-id=\"2761f36c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-462416e4 elementor-widget elementor-widget-text-editor\" data-id=\"462416e4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t\n<p>\uc7ac\uc0dd \ud5c8\uc6a9 \uc694\uccad, \uc7ac\uc0dd \uc2dc\uac04 \ubcf4\uace0 \ub4f1 \ud50c\ub808\uc774\uc5b4 \uad00\ub828 \uc774\ubca4\ud2b8\ub97c \uc9c1\uc811 \ucc98\ub9ac\ud558\ub294 \uc608\uc2dc \ucf54\ub4dc\ub97c \uc124\uba85\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc790\uc138\ud55c \uc0ac\ud56d\uc740 \uc544\ub798 \ub9c1\ud06c\ub97c \ucc38\uace0\ud574\uc8fc\uc138\uc694.<a href=\"https:\/\/playnplaydoc.cdnetworks.com\/playnplay-sdk.github.io\/callback-url\/home.html\" target=\"_blank\" rel=\"noreferrer noopener\">Callback URL<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">php \uc608\uc2dc<\/h2>\n\n\n\n<p>php \uc608\uc2dc\uc785\ub2c8\ub2e4.\uc774 \ucf54\ub4dc\ub294&nbsp;<strong>PHP 5.2 \uc774\uc0c1<\/strong>\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 json \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/\/ POST\ub85c \ub118\uaca8\ubc1b\uc740 JSON \ub370\uc774\ud130 \ubcc0\uc218\ud654 \n$json = file_get_contents('php:\/\/input');\n$data = json_decode($json);\nfunction callback($e) { \/\/ \ubd84\ub958\uc5d0 \ub9de\ucdb0 \uc62c\ubc14\ub978 Call \ucc98\ub9ac \ud568\uc218 \ud638\ucd9c\n    if ($e == null) { \/\/ \uc544\ubb34 \uac12\uc774 \uc5c6\uc73c\uba74 Block\n        header('HTTP\/1.1 403 Forbidden');\n        die();\n    }\n    $type = $e-&gt;type; \/\/ Callback \uc694\uccad \ubd84\ub958\n    \/\/ \ubaa8\ub4e0 \uc751\ub2f5\uc740 JSON \ud615\uc2dd\uc73c\ub85c \ud574\uc57c \ud569\ub2c8\ub2e4.\n    if ($type == \"CheckAccessRights\") {\n        $result = checkAccessRights($e);\n        echo json_encode($result);\n    } elseif ($type == \"NotifyPlaybackProgress\") {\n        $result = notifyPlaybackProgress($e);\n        echo json_encode($result);\n    } elseif ($type == \"NotifyPlaybackStatus\") {\n        $result = notifyPlaybackStatus($e);\n        echo json_encode($result);\n    } elseif ($type == \"NotifyPlaybackFinish\") {\n        $result = notifyPlaybackFinish($e);\n        echo json_encode($result);\n    } elseif ($type == \"NotifyDownloadStatus\") {\n        $result = notifyDownloadStatus($e);\n        echo json_encode($result);\n    } elseif ($type == \"GetBookmarks\") {\n        $result = getBookmarks($e);\n        echo json_encode($result);\n    } elseif ($type == \"UpdateBookmarks\") {\n        $result = updateBookmarks($e);\n        echo json_encode($result);\n    } else {\n        header('HTTP\/1.1 403 Forbidden'); \/\/ \uc62c\ubc14\ub978 \uac12\uc774 \uc544\ub2c8\uba74 Block\n        die();\n    }\n}\n\nfunction checkAccessRights($e) { \/\/ \uc811\uadfc \uad8c\ud55c \uac80\uc0ac\n    \/\/ \uc544\ub798 \uc815\ubcf4\ub97c \uc774\uc6a9, \uace0\uac1d\uc0ac DB \ub4f1\uacfc \ube44\uad50\ud558\uc5ec return \uac12\uc744 \ud560\ub2f9\ud574\uc57c \ud569\ub2c8\ub2e4.\n    $mediaUrl = $e-&gt;mediaUrl;      \/\/ \ubbf8\ub514\uc5b4 URL check \n    $userId = $e-&gt;userId;          \/\/ \uc0ac\uc6a9\uc790 id check\n    $device_id = $e-&gt;deviceId;     \/\/ \uae30\uae30 \ub4f1\ub85d \uc815\ubcf4 check\n    $offline = $e-&gt;offline;        \/\/ \ub2e4\uc6b4\ub85c\ub4dc \uc694\uccad\uc740 true, \uc2a4\ud2b8\ub9ac\ubc0d \uc694\uccad\uc740 false\n    \/\/ $userData = $e-&gt;userData;   \/\/ Agent\ub97c \uc2e4\ud589\ud560 \ub54c \uc778\uc99d\ub370\uc774\ud130(mediaItem)\uc5d0 \"userData\" \uac12\uc744 \ucd94\uac00\ud55c \uacbd\uc6b0\n    \/\/ $userData \uc0ac\uc6a9 \uc608\uc81c\n    \/\/ $userData = $e-&gt;userData-&gt;CustomKey;\n    \n    \/\/ DB \uc5f0\ub3d9 \ub85c\uc9c1\uc744 \uad6c\ud604\ud574 \uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.\n    $DB_conncet = true;\n    if ($DB_conncet == true) { \n        $result = array(\"result\" =&gt; \"Ok\"); \/\/ \ub85c\uc9c1\uc5d0 \ub530\ub77c \uac12\uc744 \ubd80\uc5ec\ud569\ub2c8\ub2e4. \"Ok\" = \uc131\uacf5, \"Expired\" = \uc811\uadfc \uad8c\ud55c \ub9cc\ub8cc, \"NoRights\" = \uc811\uadfc \uad8c\ud55c \uc5c6\uc74c, \"DeviceLimitExceeded\" = \ub514\ubc14\uc774\uc2a4 \uc81c\ud55c \ucd08\uacfc\n        \/\/ $result = array(\"result\" =&gt; \"Ok\", \"expiresOn\" =&gt; \"3600\"); \/\/ expiresOn \uc635\uc158\uc740 \ub2e4\uc6b4\ub85c\ub4dc \ucee8\ud150\uce20\uc758 \ub9cc\ub8cc\uc77c(UTC, \ucd08)\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc635\uc158\uc740 \"result\"\uac00 \"Ok\"\uc5ec\uc57c \ud569\ub2c8\ub2e4.\n    }\n    return $result;\n}\n\nfunction notifyPlaybackProgress($e) { \/\/ \uc7ac\uc0dd \uc9c4\ud589 \uc0c1\ud0dc \ubcf4\uace0\n    \/\/ \uc544\ub798 \uc815\ubcf4\ub97c \uc774\uc6a9, \uace0\uac1d\uc0ac DB \ub4f1\uacfc \ube44\uad50\ud558\uc5ec return \uac12\uc744 \ud560\ub2f9\ud574\uc57c \ud569\ub2c8\ub2e4.\n    $userId = $e-&gt;userId;                         \/\/ \uc0ac\uc6a9\uc790 id check\n    $position = $e-&gt;position;                     \/\/ \ud604\uc7ac \uc7ac\uc0dd \uc704\uce58\n    $duration = $e-&gt;duration;                     \/\/ \uc804\uccb4 \uc7ac\uc0dd \uae38\uc774\n    $playTime = $e-&gt;progress-&gt;playTime;           \/\/ \uc7ac\uc0dd \uc2dc\uac04 (\ubc30\uc18d X)\n    $watchTime = $e-&gt;progress-&gt;watchTime;         \/\/ \uc2dc\uccad \uc2dc\uac04 (\ubc30\uc18d O)\n    \/\/ $userData =                                \/\/ Agent\ub97c \uc2e4\ud589\ud560 \ub54c \uc778\uc99d\ub370\uc774\ud130(mediaItem)\uc5d0 \"userData\" \uac12\uc744 \ucd94\uac00\ud55c \uacbd\uc6b0\n    \/\/ $userData \uc0ac\uc6a9 \uc608\uc81c\n    \/\/ $userData = $e-&gt;userData-&gt;CustomKey;\n    \/\/ DB \uc5f0\ub3d9 \ub85c\uc9c1\uc744 \uad6c\ud604\ud574 \uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.\n    $DB_conncet = true;\n    $result = array(\"result\" =&gt; \"Ok\");\n    if ($DB_conncet == true) { \n        $result = array(\"result\" =&gt; \"Ok\"); \/\/ \ub85c\uc9c1\uc5d0 \ub530\ub77c \uac12\uc744 \ubd80\uc5ec\ud569\ub2c8\ub2e4. \"Ok\" = \uc131\uacf5, \"PlaybackLimitExceeded\" = \uc7ac\uc0dd \uc81c\ud55c \ucd08\uacfc (\ubc30\uc218 \uc81c\ud55c, \uc7ac\uc0dd \ud69f\uc218 \ub4f1)\n    }\n    return $result;\n}\n\nfunction notifyPlaybackStatus($e) { \/\/ \uc7ac\uc0dd \uc0c1\ud0dc \ubcf4\uace0\n    \/\/ \uc544\ub798 \uc815\ubcf4\ub97c \uc774\uc6a9, \uace0\uac1d\uc0ac DB \ub4f1\uacfc \ube44\uad50\ud558\uc5ec return \uac12\uc744 \ud560\ub2f9\ud574\uc57c \ud569\ub2c8\ub2e4.\n    $userId = $e-&gt;userId;         \/\/ \uc0ac\uc6a9\uc790 id check\n    \/\/ $userData =                \/\/ Agent\ub97c \uc2e4\ud589\ud560 \ub54c \uc778\uc99d\ub370\uc774\ud130(mediaItem)\uc5d0 \"userData\" \uac12\uc744 \ucd94\uac00\ud55c \uacbd\uc6b0\n    \/\/ $userData \uc0ac\uc6a9 \uc608\uc81c\n    \/\/ $userData = $e-&gt;userData-&gt;CustomKey;\n    $mediaUrl = $e-&gt;mediaUrl;     \/\/ \ubbf8\ub514\uc5b4 URL check \n    $status = $e-&gt;status;         \/\/ \uc7ac\uc0dd \uc0c1\ud0dc \u201cStarted\u201d = \ubbf8\ub514\uc5b4 \uc7ac\uc0dd \uc2dc\uc791, \u201cStopped\u201d = \ubbf8\ub514\uc5b4 \uc885\ub8cc\n    $createdAt = $e-&gt;createdAt;   \/\/ Callback JSON \ub370\uc774\ud130\uac00 \uc0dd\uc131\ub41c \uc2dc\uac04\n    \/\/ DB \uc5f0\ub3d9 \ub85c\uc9c1\uc744 \uad6c\ud604\ud574 \uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.\n    $DB_conncet = true;\n    $result = array(\"result\" =&gt; \"Ok\");\n    if ($DB_conncet == true) { \n        $result = array(\"result\" =&gt; \"Ok\"); \/\/ \ub85c\uc9c1\uc5d0 \ub530\ub77c \uac12\uc744 \ubd80\uc5ec\ud569\ub2c8\ub2e4. \"Ok\" = \uc131\uacf5\n    }\n    return $result;\n}\n\nfunction notifyPlaybackFinish($e) { \/\/ \uc7ac\uc0dd \uc885\ub8cc \ubcf4\uace0\n    \/\/ \uc544\ub798 \uc815\ubcf4\ub97c \uc774\uc6a9, \uace0\uac1d\uc0ac DB \ub4f1\uacfc \ube44\uad50\ud558\uc5ec return \uac12\uc744 \ud560\ub2f9\ud574\uc57c \ud569\ub2c8\ub2e4.\n    $userId = $e-&gt;userId;         \/\/ \uc0ac\uc6a9\uc790 id check\n    \/\/ $userData =                \/\/ Agent\ub97c \uc2e4\ud589\ud560 \ub54c \uc778\uc99d\ub370\uc774\ud130(mediaItem)\uc5d0 \"userData\" \uac12\uc744 \ucd94\uac00\ud55c \uacbd\uc6b0\n    \/\/ $userData \uc0ac\uc6a9 \uc608\uc81c\n    \/\/ $userData = $e-&gt;userData-&gt;CustomKey;\n    $mediaUrl = $e-&gt;mediaUrl;     \/\/ \ubbf8\ub514\uc5b4 URL check \n    $position = $e-&gt;position;     \/\/ \ud604\uc7ac \uc7ac\uc0dd \uc704\uce58 (\ub2e8\uc704: ms)\n    $duration = $e-&gt;duration;     \/\/ \uc804\uccb4 \uc7ac\uc0dd \uae38\uc774 (\ub2e8\uc704: ms)\n    \/\/ \ud604\uc7ac \uc138\uc158\uc758 \uc9c4\ud589 \uc0c1\ud0dc\n    $playTime = $e-&gt;progress-&gt;playTime;    \/\/ \uc7ac\uc0dd\ud55c \uc2dc\uac04 (\ubc30\uc18d X)\n    $watchTime = $e-&gt;progress-&gt;watchTime;  \/\/ \uc7ac\uc0dd\ud55c \uc2dc\uac04 (\ubc30\uc18d O)\n    \/\/ \ubbf8\ub514\uc5b4 \uc885\ub8cc \uc6d0\uc778\n    $reason = $e-&gt;reason;         \/\/ \"Ended\" = \ubbf8\ub514\uc5b4\uac00 \ub05d\uae4c\uc9c0 \uc7ac\uc0dd\ub41c \ud6c4 \uc885\ub8cc, \"Error\" = \uc624\ub958\ub85c \uc778\ud558\uc5ec \uc7ac\uc0dd \uc885\ub8cc, \"UserExited\" = \uc0ac\uc6a9\uc790\uac00 \ubbf8\ub514\uc5b4\ub97c \uc81c\uc5b4\ud558\uc5ec \uc885\ub8cc        \n    \/\/ DB \uc5f0\ub3d9 \ub85c\uc9c1\uc744 \uad6c\ud604\ud574 \uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.\n    $DB_conncet = true;\n    $result = array(\"result\" =&gt; \"Ok\");\n    if ($DB_conncet == true) { \n        $result = array(\"result\" =&gt; \"Ok\"); \/\/ \ub85c\uc9c1\uc5d0 \ub530\ub77c \uac12\uc744 \ubd80\uc5ec\ud569\ub2c8\ub2e4. \"Ok\" = \uc131\uacf5\n    }\n    return $result;\n}\n\nfunction notifyDownloadStatus($e) { \/\/ \ub2e4\uc6b4\ub85c\ub4dc \uc0c1\ud0dc \ubcf4\uace0\n    \/\/ \uc544\ub798 \uc815\ubcf4\ub97c \uc774\uc6a9, \uace0\uac1d\uc0ac DB \ub4f1\uacfc \ube44\uad50\ud558\uc5ec return \uac12\uc744 \ud560\ub2f9\ud574\uc57c \ud569\ub2c8\ub2e4.\n    $userId = $e-&gt;userId;         \/\/ \uc0ac\uc6a9\uc790 id check\n    \/\/ $userData =  \/\/ Agent\ub97c \uc2e4\ud589\ud560 \ub54c \uc778\uc99d\ub370\uc774\ud130(mediaItem)\uc5d0 \"userData\" \uac12\uc744 \ucd94\uac00\ud55c \uacbd\uc6b0\n    \/\/ $userData \uc0ac\uc6a9 \uc608\uc81c\n    \/\/ $userData = $e-&gt;userData-&gt;CustomKey;\n    $mediaUrl = $e-&gt;mediaUrl;     \/\/ \ubbf8\ub514\uc5b4 URL check \n    $status = $e-&gt;status;         \/\/ \ub2e4\uc6b4\ub85c\ub4dc \uc0c1\ud0dc \"Started\" = \ub2e4\uc6b4\ub85c\ub4dc \uc2dc\uc791, \"Completed\" = \ub2e4\uc6b4\ub85c\ub4dc \uc644\ub8cc, \"Canceled\" = \ub2e4\uc6b4\ub85c\ub4dc \ucde8\uc18c,  \"Failed\" = \ub2e4\uc6b4\ub85c\ub4dc \uc2e4\ud328\n    $createdAt = $e-&gt;createdAt;   \/\/ Callback JSON \ub370\uc774\ud130\uac00 \uc0dd\uc131\ub41c \uc2dc\uac04\n    \/\/ DB \uc5f0\ub3d9 \ub85c\uc9c1\uc744 \uad6c\ud604\ud574 \uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.\n    $DB_conncet = true;\n    $result = array(\"result\" =&gt; \"Ok\");\n    if ($DB_conncet == true) { \n        $result = array(\"result\" =&gt; \"Ok\"); \/\/ \ub85c\uc9c1\uc5d0 \ub530\ub77c \uac12\uc744 \ubd80\uc5ec\ud569\ub2c8\ub2e4. \"Ok\" = \uc131\uacf5\n    }\n    return $result;\n}\n\nfunction getBookmarks($e) { \/\/\ubd81\ub9c8\ud06c \ub370\uc774\ud130 \ubcc0\uacbd \uc2dc \ud638\ucd9c\ub429\ub2c8\ub2e4.\n    \/\/ \ucc38\uace0: useBookmarkCallback \uac00 true\uc77c \uacbd\uc6b0 \ub3d9\uc791\ud569\ub2c8\ub2e4.\n    \/\/ \uc11c\ubc84\uc5d0 \uc800\uc7a5\ub41c \ubd81\ub9c8\ud06c \ub370\uc774\ud130\ub97c \ud50c\ub808\uc774\uc5b4\uc5d0 \uc804\ub2ec\ud569\ub2c8\ub2e4.\n    $userId = $e-&gt;userId;         \/\/ \uc0ac\uc6a9\uc790 id check,\n    $userData = $e-&gt;userData; \/\/ Agent\ub97c \uc2e4\ud589\ud560 \ub54c \uc778\uc99d\ub370\uc774\ud130(mediaItem)\uc5d0 \"userData\" \uac12\uc744 \ucd94\uac00\ud55c \uacbd\uc6b0\n    $mediaUrl = $e-&gt;mediaUrl;     \/\/ \ubbf8\ub514\uc5b4 URL check \n    $appId = $e-&gt;appId;         \/\/ App ID\n    \n    $DB_conncet = true; \/\/ DB\uc640 \uc5f0\uacb0 \ub85c\uc9c1\uc744 \uad6c\ud604\ud574 \uc8fc\uc154\uc57c \ud569\ub2c8\ub2e4. DB\uc5d0\uc11c user\uc758 \ubd81\ub9c8\ud06c \ub370\uc774\ud130\ub97c \uac00\uc838\uc640\uc57c \ud569\ub2c8\ub2e4.\n    $bookmarks = [{\"title\": \"\uc81c\ubaa9\", \"pos\": 60}];   \/\/ \uc800\uc7a5\ub41c \ubd81\ub9c8\ud06c \ubaa9\ub85d(\ubc30\uc5f4), \uc774 \uac12\uc744 DB\uc5d0 \ub4f1\ub85d\ud558\ub294 \ub4f1 \ud65c\uc6a9\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    \n    $result= array(\"result\" =&gt; \"Ok\", \"bookmarks\" =&gt; $bookmarks);\n    return $result;\n}\n\nfunction updateBookmarks($e) { \/\/\ubd81\ub9c8\ud06c \ub370\uc774\ud130 \ubcc0\uacbd \uc2dc \ud638\ucd9c\ub429\ub2c8\ub2e4.\n    \/\/ \ucc38\uace0: useBookmarkCallback \uac00 true\uc77c \uacbd\uc6b0 \ub3d9\uc791\ud569\ub2c8\ub2e4.\n    \/\/ \ud50c\ub808\uc774\uc5b4\uc5d0\uc11c \uc5c5\ub370\uc774\ud2b8\ub41c \ubd81\ub9c8\ud06c \uc815\ubcf4\ub97c \ubc1b\uc544 DB\uc5d0 \uc5c5\ub85c\ub4dc\ud569\ub2c8\ub2e4.\n    $userId = $e-&gt;userId;         \/\/ \uc0ac\uc6a9\uc790 id check,\n    $userData = $e-&gt;userData; \/\/ Agent\ub97c \uc2e4\ud589\ud560 \ub54c \uc778\uc99d\ub370\uc774\ud130(mediaItem)\uc5d0 \"userData\" \uac12\uc744 \ucd94\uac00\ud55c \uacbd\uc6b0\n    $mediaUrl = $e-&gt;mediaUrl;     \/\/ \ubbf8\ub514\uc5b4 URL check \n    $appId = $e-&gt;appId;         \/\/ App ID\n    $bookmarks = $e-&gt;bookmarks;   \/\/ \uc800\uc7a5\ub41c \ubd81\ub9c8\ud06c \ubaa9\ub85d(\ubc30\uc5f4), \uc774 \uac12\uc744 DB\uc5d0 \ub4f1\ub85d\ud558\uc5ec \uc5c5\ub370\uc774\ud2b8\n\n    $result= array(\"result\" =&gt; \"Ok\");\n    return $result;\n}\n\n     callback($data);\n?&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">jsp \uc608\uc2dc<\/h2>\n\n\n\n<p>jsp \uc608\uc2dc\uc785\ub2c8\ub2e4.\uc774 \ucf54\ub4dc\ub294&nbsp;<strong>Java SE 7 \uc774\uc0c1<\/strong>\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 org.json \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<strong>Front \ubd80\ubd84<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;%@ page import=\"java.io.BufferedReader, java.io.IOException\" %&gt;\n&lt;%@ page import=\"org.json.JSONObject\" %&gt;\n&lt;%@ page import=\"com.example.CallbackHandler\" %&gt;\n\n&lt;%\n    response.setContentType(\"application\/json\");\n    StringBuilder jsonBuilder = new StringBuilder();\n\n    \/\/ JSON \ub370\uc774\ud130 \uc218\uc2e0\n    try (BufferedReader reader = request.getReader()) {\n        String line;\n        while ((line = reader.readLine()) != null) {\n            jsonBuilder.append(line);\n        }\n    } catch (IOException e) {\n        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);\n        out.print(new JSONObject().put(\"error\", \"Invalid request\").toString());\n        return;\n    }\n\n    JSONObject data;\n    try {\n        data = new JSONObject(jsonBuilder.toString());\n    } catch (Exception e) {\n        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);\n        out.print(new JSONObject().put(\"error\", \"Invalid JSON format\").toString());\n        return;\n    }\n\n    String type = data.optString(\"type\", null);\n    JSONObject result = new JSONObject();\n\n    if (type == null) {\n        response.setStatus(HttpServletResponse.SC_FORBIDDEN);\n        out.print(new JSONObject().put(\"error\", \"Type not specified\").toString());\n        return;\n    }\n\n    \/\/ \uc694\uccad \uc720\ud615\uc5d0 \ub530\ub978 \ucc98\ub9ac\n    try {\n        switch (type) {\n            case \"CheckAccessRights\":\n                result = CallbackHandler.checkAccessRights(data);\n                break;\n            case \"NotifyPlaybackProgress\":\n                result = CallbackHandler.notifyPlaybackProgress(data);\n                break;\n            case \"NotifyPlaybackStatus\":\n                result = CallbackHandler.notifyPlaybackStatus(data);\n                break;\n            case \"NotifyPlaybackFinish\":\n                result = CallbackHandler.notifyPlaybackFinish(data);\n                break;\n            case \"NotifyDownloadStatus\":\n                result = CallbackHandler.notifyDownloadStatus(data);\n                break;\n            case \"GetBookmarks\":\n                result = CallbackHandler.getBookmarks(data);\n                break;\n            case \"UpdateBookmarks\":\n                result = CallbackHandler.updateBookmarks(data);\n                break;\n            default:\n                response.setStatus(HttpServletResponse.SC_FORBIDDEN);\n                out.print(new JSONObject().put(\"error\", \"Invalid type\").toString());\n                return;\n        }\n    } catch (Exception e) {\n        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\n        out.print(new JSONObject().put(\"error\", \"Internal server error\").toString());\n        return;\n    }\n\n    out.print(result.toString());\n%&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Handler \ubd80\ubd84<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.example;\n\nimport org.json.JSONObject;\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.SecretKeySpec;\nimport javax.crypto.spec.IvParameterSpec;\nimport java.util.Base64;\n    \npublic class CallbackHandler {\n\n    \/\/ Base64\ub85c \uc778\ucf54\ub529\ub41c AES \uc554\ud638\ud654\ub41c \ubb38\uc790\uc5f4\uc744 \ubcf5\ud638\ud654\ud558\ub294 \uba54\uc11c\ub4dc (option)\n    private static long decryptAuthtime(String authtime, String secretKey) throws Exception {\n        byte[] key = secretKey.getBytes(\"UTF-8\");\n        byte[] iv = new byte[16];\n\n        \/\/ Base64 \ub514\ucf54\ub529\n        byte[] encryptedData = Base64.getDecoder().decode(authtime);\n\n        \/\/ AES \ubcf5\ud638\ud654\n        Cipher cipher = Cipher.getInstance(\"AES\/CBC\/PKCS5Padding\");\n        SecretKeySpec secretKeySpec = new SecretKeySpec(key, \"AES\");\n        IvParameterSpec ivSpec = new IvParameterSpec(iv);\n        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);\n\n        byte[] decryptedTimeBytes = cipher.doFinal(encryptedData);\n        return Long.parseLong(new String(decryptedTimeBytes, \"UTF-8\"));\n    }\n\n    public static JSONObject checkAccessRights(JSONObject e) {\n        boolean dbConnect = true;\n        if (dbConnect) {\n            return new JSONObject().put(\"result\", \"Ok\");\n        }\n        return new JSONObject().put(\"result\", \"NoRights\");\n    }\n\n    \/\/ \ub098\uba38\uc9c0 \uba54\uc11c\ub4dc \uc720\uc9c0\n    public static JSONObject notifyPlaybackProgress(JSONObject e) {\n        boolean dbConnect = true;\n        if (dbConnect) {\n            return new JSONObject().put(\"result\", \"Ok\");\n        }\n        return new JSONObject().put(\"result\", \"PlaybackLimitExceeded\");\n    }\n\n    public static JSONObject notifyPlaybackStatus(JSONObject e) {\n        boolean dbConnect = true;\n        if (dbConnect) {\n            return new JSONObject().put(\"result\", \"Ok\");\n        }\n    }\n\n    public static JSONObject notifyPlaybackFinish(JSONObject e) {\n        boolean dbConnect = true;\n        if (dbConnect) {\n            return new JSONObject().put(\"result\", \"Ok\");\n        }\n    }\n\n    public static JSONObject notifyDownloadStatus(JSONObject e) {\n        boolean dbConnect = true;\n        if (dbConnect) {\n            return new JSONObject().put(\"result\", \"Ok\");\n        }\n    }\n\n    public static JSONObject getBookmarks(JSONObject e) {\n        \/\/ \uc9c1\uc811 \ubd81\ub9c8\ud06c\ub97c \uad00\ub9ac\ud558\ub294 \uacbd\uc6b0\uc5d0\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n        boolean dbConnect = true; \/\/ DB\uc5d0\uc11c user\uc758 \uc800\uc7a5\ub41c \ubd81\ub9c8\ud06c \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\ub294 \ub85c\uc9c1 \uad6c\ud604\n        JSONArray putBookmarks = new JSONArray(); \/\/ DB \uc640 \uc5f0\uacb0\ud558\uc5ec \ubc1b\uc544\uc628 \ub370\uc774\ud130\ub97c \uc774 \ubc30\uc5f4\ubcc0\uc218\uc5d0 \uc800\uc7a5\ud574 \uc8fc\uc138\uc694\n        \/\/ \uc608\uc2dc: putBookmarks\uc758 \uac12 = [{\"title\": \"\uc81c\ubaa91\", \"pos\": 60}, {\"title\": \"\uc81c\ubaa92\", \"pos\": 120}] \uc758 \ud615\ud0dc\uac00 \ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\n\n        if (dbConnect) {\n            JSONObject response = new JSONObject();\n            response.put(\"result\", \"Ok\");\n            response.put(\"bookmarks\", putBookmarks);\n            return response;\n        }\n    }\n    \n    public static JSONObject updateBookmarks(JSONObject e) {\n        JSONArray updateBookmark = new JSONArray(); \/\/ \uc5c5\ub370\uc774\ud2b8\ub41c \ubd81\ub9c8\ud06c\ub97c \uc800\uc7a5\ud560 \ubcc0\uc218 \uc0dd\uc131\n        updateBookmark = e.getJSONArray(\"bookmarks\"); \/\/ \ucf5c\ubc31 \ub370\uc774\ud130 \uc911 \uc5c5\ub370\uc774\ud2b8 \ub41c \ubd81\ub9c8\ud06c \ub370\uc774\ud130\ub97c \uac00\uc838\uc634\n        boolean dbConnect = true; \/\/ updateBookmark \uac12\uc744 DB\uc5d0 \uc5c5\ub85c\ub4dc\ud574\uc8fc\uc138\uc694.\n\n        if (dbConnect) { \n            response.put(\"result\", \"Ok\");\n            return response;\n        }\n    }\n\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">asp \uc608\uc2dc<\/h2>\n\n\n\n<p>asp \uc608\uc2dc\uc785\ub2c8\ub2e4.\uc774 \ucf54\ub4dc\ub294&nbsp;<strong>.NET Framework 3.5 \uc774\uc0c1, C# 3.0 \uc774\uc0c1<\/strong>\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 Newtonsoft.Json \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<strong>Front \ubd80\ubd84<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;%@ Page Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Callback.aspx.cs\" Inherits=\"WebApplication.Callback\" %&gt;<\/code><\/pre>\n\n\n\n<p><strong>Handler \ubd80\ubd84<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using System;\nusing System.IO;\nusing Newtonsoft.Json;\nusing System.Security.Cryptography;\nusing System.Text;\n\npublic class EncryptionHelper\n{\n    public static string Decrypt(string encryptedText, string secretKey) \/\/ \uc2dc\uac04\uac12 \uc554\ud638 \ubcf5\ud638\ud654 (option)\n    {\n        using (Aes aes = Aes.Create())\n        {\n            aes.Key = Encoding.UTF8.GetBytes(secretKey.PadRight(16).Substring(0, 16)); \/\/ 16\ubc14\uc774\ud2b8 \ud0a4\n            aes.IV = new byte[16]; \/\/ 16\ubc14\uc774\ud2b8 \ucd08\uae30\ud654\ub41c IV \uc0dd\uc131\n            aes.Mode = CipherMode.CBC; \/\/ CBC \ubaa8\ub4dc \uc124\uc815\n            aes.Padding = PaddingMode.PKCS7; \/\/ \ud328\ub529 \ubaa8\ub4dc \uc124\uc815 (Key\uac00 16\ubc14\uc774\ud2b8 \uc774\ud558\uc77c \uacbd\uc6b0 \uc704\ud568)\n\n            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);\n\n            byte[] encryptedBytes = Convert.FromBase64String(encryptedText);\n            byte[] decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);\n\n            return BitConverter.ToInt64(decryptedBytes, 0).ToString(); \/\/\ub514\ucf54\ub529\ub41c \uac12 Return\n        }\n    }\n}\n\nnamespace WebApplication\n{\n    public partial class Callback : System.Web.UI.Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            if (Request.HttpMethod == \"POST\") \/\/ \uc694\uccad\uc774 POST \uba54\uc11c\ub4dc\uc77c \ub54c\ub9cc \ucc98\ub9ac\ud569\ub2c8\ub2e4.\n            {\n                \/\/ JSON \ub370\uc774\ud130\ub97c \uc694\uccad \ubcf8\ubb38\uc5d0\uc11c \uc77d\uc74c\n                using (var reader = new StreamReader(Request.InputStream))\n                {\n                    var json = reader.ReadToEnd();\n                    var data = JsonConvert.DeserializeObject&lt;dynamic&gt;(json);\n                    var result = HandleCallback(data);\n\n                    \/\/ JSON \ud615\uc2dd\uc73c\ub85c \uc751\ub2f5\n                    Response.ContentType = \"application\/json\";\n                    Response.Write(JsonConvert.SerializeObject(result));\n                    Response.End();\n                }\n            }\n            else\n            {\n                Response.StatusCode = 405; \/\/ \ud5c8\uc6a9\ub418\uc9c0 \uc54a\ub294 \uba54\uc11c\ub4dc\uc758 \uacbd\uc6b0\n                Response.End();\n            }\n        }\n\n        private dynamic HandleCallback(dynamic e)\n        {\n            if (e == null || e.type == null)\n            {\n                Response.StatusCode = 400; \/\/ \uc798\ubabb\ub41c \uc694\uccad\uc77c \uacbd\uc6b0\n                Response.End();\n                return null;\n            }\n\n            string type = e.type;\n            dynamic result = null;\n\n            switch (type)\n            {\n                case \"CheckAccessRights\":\n                    result = CheckAccessRights(e);\n                    break;\n                case \"NotifyPlaybackProgress\":\n                    result = NotifyPlaybackProgress(e);\n                    break;\n                case \"NotifyPlaybackStatus\":\n                    result = NotifyPlaybackStatus(e);\n                    break;\n                case \"NotifyPlaybackFinish\":\n                    result = NotifyPlaybackFinish(e);\n                    break;\n                case \"NotifyDownloadStatus\":\n                    result = NotifyDownloadStatus(e);\n                    break;\n                case \"GetBookmarks\":\n                    result = GetBookmarks(e);\n                    break;\n                case \"UpdateBookmarks\":\n                    result = UpdateBookmarks(e);\n                    break;\n                default:\n                    Response.StatusCode = 400; \/\/ \uc798\ubabb\ub41c \uc694\uccad\uc77c \uacbd\uc6b0\n                    Response.End();\n                    return null;\n            }\n\n            return result;\n        }\n\n        private dynamic CheckAccessRights(JObject e)\n        {\n            \/\/ \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \ubc0f \uae30\ud0c0 \ub85c\uc9c1 \uad6c\ud604\ubc14\ub78d\ub2c8\ub2e4.\n            JObject response = new JObject(); \/\/ response \uac1d\uccb4 \uc0dd\uc131\n            response[\"result\"] = \"Ok\";\n            \/\/ \uc774\uc678 \uacbd\uc6b0:  response[\"result\"] = \"Expired\" \uad8c\ud55c\ub9cc\ub8cc| \"NoRights\" \uad8c\ud55c\uc5c6\uc74c | \"DeviceLimitExceeded\" \uae30\uae30\ub300\uc218\ucd08\uacfc\n            \/\/ \ub2e4\uc6b4\ub85c\ub4dc\uc758 \uacbd\uc6b0, \ucee8\ud150\uce20 \uc720\ud6a8\uc2dc\uac04 \uae30\uc785: response[\"result\"] = \"Ok\", response[\"expireOn\"] = \ub9cc\ub8cc\uc77c(\uc22b\uc790\ud615, UTC)\n            return response;\n        }\n\n        private dynamic NotifyPlaybackProgress(JObject e)\n        {\n            \/\/ \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \ubc0f \uae30\ud0c0 \ub85c\uc9c1 \uad6c\ud604\ubc14\ub78d\ub2c8\ub2e4.\n            JObject response = new JObject(); \/\/ response \uac1d\uccb4 \uc0dd\uc131\n            response[\"result\"] = \"Ok\";\n            return response;\n\n        }\n\n        private dynamic NotifyPlaybackStatus(JObject e)\n        {\n            \/\/ \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \ubc0f \uae30\ud0c0 \ub85c\uc9c1 \uad6c\ud604\ubc14\ub78d\ub2c8\ub2e4.\n            JObject response = new JObject(); \/\/ response \uac1d\uccb4 \uc0dd\uc131\n            response[\"result\"] = \"Ok\";\n            return response;\n        }\n\n        private dynamic NotifyPlaybackFinish(JObject e)\n        {\n            \/\/ \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \ubc0f \uae30\ud0c0 \ub85c\uc9c1 \uad6c\ud604\ubc14\ub78d\ub2c8\ub2e4.\n            JObject response = new JObject(); \/\/ response \uac1d\uccb4 \uc0dd\uc131\n            response[\"result\"] = \"Ok\";\n            return response;\n        }\n\n        private dynamic NotifyDownloadStatus(JObject e)\n        {\n            \/\/ \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \ubc0f \uae30\ud0c0 \ub85c\uc9c1 \uad6c\ud604\ubc14\ub78d\ub2c8\ub2e4.\n            JObject response = new JObject(); \/\/ response \uac1d\uccb4 \uc0dd\uc131\n            response[\"result\"] = \"Ok\";\n            return response;\n        }\n\n        private dynamic GetBookmarks(JObject e)\n        {\n            \/\/ \ubd81\ub9c8\ud06c\ub97c \uc9c1\uc811 \uad00\ub9ac\ud558\uc2dc\ub294 \uacbd\uc6b0 DB\uc5d0\uc11c \uac12\uc744 \ubc1b\uc544 \uc785\ub825\ud569\ub2c8\ub2e4.\n            \/\/ \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \ubc0f \uae30\ud0c0 \ub85c\uc9c1 \uad6c\ud604\ubc14\ub78d\ub2c8\ub2e4.\n            bool dbConnect = true; \/\/ DB\uc5d0\uc11c user\uc758 \uc800\uc7a5\ub41c \ubd81\ub9c8\ud06c \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\ub294 \ub85c\uc9c1 \uad6c\ud604\n            JArray putBookmarks = new JArray(); \/\/ DB \uc640 \uc5f0\uacb0\ud558\uc5ec \ubc1b\uc544\uc628 \ub370\uc774\ud130\ub97c \uc774 \ubc30\uc5f4\ubcc0\uc218\uc5d0 \uc800\uc7a5\ud574 \uc8fc\uc138\uc694\n            \/\/ \uc608\uc2dc: putBookmarks\uc758 \uac12 = [{\"title\": \"\uc81c\ubaa91\", \"pos\": 60}, {\"title\": \"\uc81c\ubaa92\", \"pos\": 120}] \uc758 \ud615\ud0dc\uac00 \ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\n\n            JObject response = new JObject();\n            response[\"result\"] = \"Ok\";\n            response[\"bookmarks\"] = putBookmarks;\n            return response;\n        }\n\n        public static JObject UpdateBookmarks(JObject e)\n        {\n            JArray updateBookmark = new JArray(); \/\/ \uc5c5\ub370\uc774\ud2b8\ub41c \ubd81\ub9c8\ud06c\ub97c \uc800\uc7a5\ud560 \ubcc0\uc218 \uc0dd\uc131\n            updateBookmark = (JArray)e[\"bookmarks\"]; \/\/ \ucf5c\ubc31 \ub370\uc774\ud130 \uc911 \uc5c5\ub370\uc774\ud2b8 \ub41c \ubd81\ub9c8\ud06c \ub370\uc774\ud130\ub97c \uac00\uc838\uc634\n            bool dbConnect = true; \/\/ updateBookmark \uac12\uc744 DB\uc5d0 \uc5c5\ub85c\ub4dc\ud574\uc8fc\uc138\uc694.\n\n            JObject response = new JObject(); \/\/ response \uac1d\uccb4 \uc0dd\uc131\n            response[\"result\"] = \"Ok\";\n            return response;\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-08522ae e-flex e-con-boxed e-con e-parent\" data-id=\"08522ae\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7b0bb56 elementor-button-info elementor-widget elementor-widget-button\" data-id=\"7b0bb56\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/aquaguide.cdnetworks.com\/?page_id=536\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">\ub4a4\ub85c \uac00\uae30<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\uc7ac\uc0dd \ud5c8\uc6a9 \uc694\uccad, \uc7ac\uc0dd \uc2dc\uac04 \ubcf4\uace0 \ub4f1 \ud50c\ub808\uc774\uc5b4 \uad00\ub828 \uc774\ubca4\ud2b8\ub97c \uc9c1\uc811 \ucc98\ub9ac\ud558\ub294 \uc608\uc2dc \ucf54\ub4dc\ub97c \uc124\uba85\ud569\ub2c8\ub2e4. \uc790\uc138\ud55c \uc0ac\ud56d\uc740 \uc544\ub798 \ub9c1\ud06c\ub97c \ucc38\uace0\ud574\uc8fc\uc138\uc694.Callback [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-666","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/aquaguide.cdnetworks.com\/index.php?rest_route=\/wp\/v2\/pages\/666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aquaguide.cdnetworks.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aquaguide.cdnetworks.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aquaguide.cdnetworks.com\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/aquaguide.cdnetworks.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=666"}],"version-history":[{"count":4,"href":"https:\/\/aquaguide.cdnetworks.com\/index.php?rest_route=\/wp\/v2\/pages\/666\/revisions"}],"predecessor-version":[{"id":670,"href":"https:\/\/aquaguide.cdnetworks.com\/index.php?rest_route=\/wp\/v2\/pages\/666\/revisions\/670"}],"wp:attachment":[{"href":"https:\/\/aquaguide.cdnetworks.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}