Сервис редактирования документов оповещает сервис хранения документов о статусе редактирования документа, используя callbackUrl из JavaScript API. Сервис редактирования документов использует POST запросы с параметрами в теле.
Параметры и их описание:
Параметр | Описание | Тип | Наличие |
actions | Определяет полученный объект, если новый пользователь, был подключен к совместному редактированию документа или отключен от него. В первом случае значение поля тип равно 1, во втором - 0. Значение поля userid является идентификатором пользователя, который был подключен к совместному редактированию документа, или отключен от него. | массив объектов | необязательный |
changeshistory | Определяет массив объектов с историей изменения документа. Объект присутствует только если значение параметра status равно 2 или 3. Должен быть отправлен как свойство changes, объекта, который был передан методу refreshHistory в качестве аргумента. Удалено, начиная с версии 4.2, пожалуйста, используйте history. | массив объектов | необязательный |
changesurl | Определяет ссылку на файл с данными об изменениях документа, используемый для отображения истории изменения этого документа. Ссылка присутствует только если значение параметра status равно 2 или 3. Файл должен быть сохранён, а его адрес должен быть отправлен как параметр changesUrl, используя метод setHistoryData, чтобы показать изменения, относящиеся к конкретной версии документа. | строка | необязательный |
forcesavetype | Определяет тип инициатора запроса на выполнение принудительного сохранения. Может быть равным следующим значениям:
|
целочисленный | необязательный |
history | Определяет объект с информацией об истории изменения документа. Объект присутствует только если значение параметра status равно 2 или 3. Содержит объекты serverVersion и changes, которые должны быть отправлены как свойства serverVersion и changes объекта, который был передан в качестве аргумента методу refreshHistory. | объект | необязательный |
key | Определяет идентификатор отредактированного документа. | строка | обязательный |
status | Определяет статус документа. Может быть равным следующим значениям:
|
целочисленный | обязательный |
url | Определяет ссылку на отредактированный документ, который будет сохранён сервисом хранения документов. Ссылка присутствует только если значение параметра status равно 2 или 3. | строка | необязательный |
userdata | Определяет пользовательскую информацию, отправляемую командному сервису в случае, если она была передана в запросе. | строка | необязательный |
users | Определяет список идентификаторов пользователей, который открыли документ для редактирования; когда документ был изменён, объект users вернёт идентификатор пользователя, который последним редактировал документ (для ответов со статусами 2 и 6). | массив строк | необязательный |
Статус 1 будет получен каждый раз, когда пользователь подключается к совместному редактированию документа или отключается от него.
Статус 2 (3) будет получен через 10 секунд после закрытия документа, с идентификатором пользователя, от которого сервисом редактирования документов в последний раз были получены изменения.
Статус 4 будет получен после закрытия документа, если пользователь не вносил в него никаких изменений.
Статус 6 (7) будет получен при выполнении запроса на принудительное сохранение.
{ "actions": [{"type": 1, "userid": "78e1e841"}], "key": "Khirz6zTPdfd7", "status": 1, "users": ["6d5a81d0", "78e1e841"] }
{ "actions": [{"type": 0, "userid": "78e1e841"}], "changesurl": "https://documentserver/url-to-changes.zip", "history": { "changes": changes, "serverVersion": serverVersion }, "key": "Khirz6zTPdfd7", "status": 2, "url": "https://documentserver/url-to-edited-document.docx", "users": ["6d5a81d0"] }
{ "key": "Khirz6zTPdfd7", "status": 4 }
{ "changesurl": "https://documentserver/url-to-changes.zip", "forcesavetype": 0, "history": { "changes": changes, "serverVersion": serverVersion }, "key": "Khirz6zTPdfd7", "status": 6, "url": "https://documentserver/url-to-edited-document.docx", "users": ["6d5a81d0"], "userdata": "sample userdata" }
Сервис хранения документов должен отправить следующий ответ, в противном случае, редактор документов покажет сообщение об ошибке:
{ "error": 0 }
Менеджер документов и сервис хранения документов включены в Сервер совместной работы или должны быть реализованы разработчиками, использующими Сервер документов на своих собственных серверах.
public class WebEditor : IHttpHandler { public void ProcessRequest(HttpContext context) { string body; using (var reader = new StreamReader(context.Request.InputStream)) body = reader.ReadToEnd(); var fileData = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(body); if ((int) fileData["status"] == 2) { var req = WebRequest.Create((string) fileData["url"]); using (var stream = req.GetResponse().GetResponseStream()) using (var fs = File.Open(PATH_FOR_SAVE, FileMode.Create)) { var buffer = new byte[4096]; int readed; while ((readed = stream.Read(buffer, 0, 4096)) != 0) fs.Write(buffer, 0, readed); } } context.Response.Write("{\"error\":0}"); } }
public class IndexServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); Scanner scanner = new Scanner(request.getInputStream()).useDelimiter("\\A"); String body = scanner.hasNext() ? scanner.next() : ""; JSONObject jsonObj = (JSONObject) new JSONParser().parse(body); if((long) jsonObj.get("status") == 2) { String downloadUri = (String) jsonObj.get("url"); URL url = new URL(downloadUri); java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection(); InputStream stream = connection.getInputStream(); File savedFile = new File(pathForSave); try (FileOutputStream out = new FileOutputStream(savedFile)) { int read; final byte[] bytes = new byte[1024]; while ((read = stream.read(bytes)) != -1) { out.write(bytes, 0, read); } out.flush(); } connection.disconnect(); } writer.write("{\"error\":0}"); } }
var fs = require("fs"); app.post("/track", function (req, res) { var updateFile = function (response, body, path) { if (body.status == 2) { var file = syncRequest("GET", body.url); fs.writeFileSync(path, file.getBody()); } response.write("{\"error\":0}"); response.end(); } var readbody = function (request, response, path) { var content = ""; request.on("data", function (data) { content += data; }); request.on("end", function () { var body = JSON.parse(content); updateFile(response, body, path); }); } if (req.body.hasOwnProperty("status")) { updateFile(res, req.body, pathForSave); } else { readbody(req, res, pathForSave) } });
<?php if (($body_stream = file_get_contents("php://input"))===FALSE){ echo "Bad Request"; } $data = json_decode($body_stream, TRUE); if ($data["status"] == 2){ $downloadUri = $data["url"]; if (($new_data = file_get_contents($downloadUri))===FALSE){ echo "Bad Response"; } else { file_put_contents($path_for_save, $new_data, LOCK_EX); } } echo "{\"error\":0}"; ?>
class ApplicationController < ActionController::Base def index body = request.body.read file_data = JSON.parse(body) status = file_data["status"].to_i if status == 2 download_uri = file_data["url"] uri = URI.parse(download_uri) http = Net::HTTP.new(uri.host, uri.port) if download_uri.start_with?("https") http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE end req = Net::HTTP::Get.new(uri.request_uri) res = http.request(req) data = res.body File.open(path_for_save, "wb") do |file| file.write(data) end end render :text => "{\"error\":0}" end end
Комментарии
0 комментариев
Статья закрыта для комментариев.