如何使用RESTapi将新文档添加到Content Server 10.5

本文关键字:添加 Content Server 文档 RESTapi 何使用 新文档 | 更新日期: 2023-09-27 18:28:10

如何使用RESTapi将新文档添加到Content Server 10.5?

我遵循Swagger文档创建节点,但不清楚如何将文件附加到请求。以下是我正在使用的代码:

var folderId = 2000;
var docName = "test";
var uri = $"http://[serverName]/otcs/llisapi.dll/api/v1/nodes?type=144&parent_id={folderId}&name={docName}";    
var request = new HttpRequestMessage();
request.Headers.Add("Connection", new[] { "Keep-Alive" });
request.Headers.Add("Cache-Control", "no-cache, no-store, must-revalidate"); 
request.Headers.Add("Pragma", "no-cache");     
request.Headers.Add("OTCSTicket", /* ticket here */);
request.RequestUri = new Uri(uri);
request.Method = HttpMethod.Post;
request.Content = new ByteArrayContent(data);
request.Content.Headers.ContentType = new MediaTypeHeaderValue(MimeMapping.GetMimeMapping(filePath));
request.Headers.ExpectContinue = false;
var httpClientHandler = new HttpClientHandler
{
  Proxy = WebRequest.GetSystemWebProxy(),
  UseProxy = true,
  AllowAutoRedirect = true
};
using (var client = new HttpClient(httpClientHandler))
{
  var response = client.SendAsync(request).Result;
  IEnumerable<string> temp;
  var vals = response.Headers.TryGetValues("OTCSTicket", out temp) ? temp : new List<string>();
  if (vals.Any())
  {
    this.ticket = vals.First();
  }
  return response.Content.ReadAsStringAsync().Result;
}

我一直在developer.opentext.com论坛上搜索,但在c#中找到一个完整的例子很难——javascript中有一些例子,但试图在c#中或通过chrome或firefox扩展复制这些例子只会得到相同的结果。到目前为止,调用其他CSREST方法还不是一个问题,这是第一个给我带来问题的方法。

编辑:我把错误的网址粘贴到我的问题中,现在我已经修复了。是CCD_ 2。

如何使用RESTapi将新文档添加到Content Server 10.5

您的URL看起来不像REST API,而是用于UI的传统URL。

这篇文章应该描述如何做你想做的事情:

https://developer.opentext.com/webaccess/#url=%2Fawd%2Fresources%2Farticles%2F6102%2Fcontent%2Bserver%2Brest%2Bapi%2B%2Bquick%2Bstart%2Bguide&tab=501

编辑:

好的,这就是它应该如何工作:

将POST发送到http://www.your_content_server.com/cs[.exe]/api/v1/nodes

将其发送到您的有效负载中,以便在企业工作区中创建文档

type=144
parent_id=2000
name=document_name.txt
<file>

Python中一个不完整的演示会是这样的。确保你先拿到一张有效的票。

files = {'file': (open("file.txt", 'rb')}
data = { 'type': 144, 'parent_id': 2000, 'name': 'document_name.txt' }
cs = requests.post(url, headers={'otcsticket':'xxxxxxx'}, data=data, files=files)
if cs.status_code == 200:
    print "ok"
else:
    print cs.text

您需要一个表单输入来将文件放到页面上,然后您可以使用文件流来重定向它,这里有很好的指南。

使用文件API 读取JavaScript中的文件

下面是一个Jquery/Ajax示例。

我发现最好的方法是使用Postman(Chrome插件)进行实验,直到你感到舒服为止。

var form = new FormData();
form.append("file", "*filestream*"); 
form.append("parent_id", "100000");
form.append("name", "NameYourCreatedFile");
form.append("type", "144");
var settings = {
  "async": true,
  "url": "/cs.exe/api/v1/nodes", // You will need to amend this to match your environment
  "method": "POST",
  "headers": {
    "authorization": "Basic **use Postman to generate this**",
    "cache-control": "no-cache",
  },
  "processData": false,
  "contentType": false,
  "mimeType": "multipart/form-data",
  "data": form
}
$.ajax(settings).done(function (response) {
  console.log(response);
});

OpenText API似乎只支持通过异步JavaScript上传文件,而不支持通过使用包含文件内容的典型发布表单请求进行传统文件上传(老实说,这很糟糕,因为这是服务器端最容易处理的)。

我已经联系了他们的支持,他们绝对没有帮助-他们说,既然它使用JavaScript,那么他们就帮不了我。除了JavaScript之外,任何其他使用任何语言的人都是SOL。我提交了我的整个API包,但他们并没有进行调查,而是想尽快关闭我的机票。

我找到的唯一方法是将文件上传/发送到Content Servers web服务器上的"upload"目录(在我们的服务器上,它被设置为D:''upload)。此目录位置可在管理部分配置。

将文件发送到web服务器后,发送一个创建节点请求,其中file参数设置为服务器上文件的完整文件路径,因为OpenText API将尝试从此目录检索文件。

我已经为此创建了一个PHP API,您可以在这里浏览它的用法:

https://github.com/FBCLIT/OpenTextApi

<?php
use Fbcl'OpenTextApi'Client;
$client = new Client('http://server.com/otcs/cs.exe', 'v1');
$api = $client->connect('username', 'secret');
try {
    // The folder node ID of where the file will be created under.
    $parentNodeId = '12356';
    // The file name to display in OpenText
    $fileName = 'My Document.txt';
    // The actual file path of the file on the OpenText server.
    $serverFilePath = 'D:'Upload'My Document.txt';
    $response = $api->createNodeDocument($parentNodeId, $fileName, $serverFilePath);
    if (isset($response['id'])) {
        // The ID of the newly created document will be returned.
        echo $response['id']; 
    }   
} catch ('Exception $ex) {
    // File not found on server drive, or issue creating node from given parent.
}

MIME类型检测似乎是自动发生的,您不需要发送任何信息来检测文件类型。您可以将文件命名为任何您喜欢的名称,而不需要扩展名。

我还发现您不能使用IP地址或主机名在此庄园中上载文件。您必须输入上载到的服务器的本地路径。但是,您可以只给上载目录中存在的文件名,并且OpenText API似乎可以很好地找到它。

例如,可以传递D:'Uploads'Document.txtDocument.txt

如果你没有正确地完成,你应该得到错误:

客户端错误:POST http://server.com/otcs/cs.exe/api/v1/nodes导致400 Bad Request响应:{"error":"error:在上载目录中找不到文件。"}

回答我自己的问题,但使用powershell 5(例如,没有-Form参数):

<#
    .SYNOPSIS
        Adds a new document to a folder in Content Server.        
    .DESCRIPTION
        Adds a new document to a folder in Content Server. Will fail
        if a document of the same name already exists in the folder.
    .PARAMETER Url
        String. Required. The first part of the url of the OTCS server. Eg. 'https://url.to.server'          
    .PARAMETER Ticket
        String. Required. Ticket from a call to '/otcs/llisapi.dll/api/v1/auth'.
    .PARAMETER Source
        String. Required. Path to the file to add.
    .PARAMETER ParentFolderID
        Long. Required. The DataID of the destination folder in Content Server.
    .EXAMPLES
        Get-OTCSDocument -Server [ServerName] -Ticket '?' -ParentFolderID 1234 -Source 'c:'path'to'file.txt' 
#>
Function Add-OTCSDocument ($Url, $Ticket, $ParentFolderID, $Source)
{
    $docResult = @{ Success = $false; DocumentID = 0; ExceptionStatusDescription = $null }    
    $fileName = Split-Path $Source -leaf
    
    $AddDocumentUrl = "$Url/otcs/llisapi.dll/api/v1/nodes"
    $header = @{ otcsticket = $ticket }
    
    $CODEPAGE = "UTF-8" # alternatives are ASCII, iso-8859-1 
    $enc = [System.Text.Encoding]::GetEncoding($CODEPAGE)
    $fileBin = [System.IO.File]::ReadAllBytes($Source)
    $fileEnc = $enc.GetString($fileBin)
    $fileName = Split-Path $Source -leaf
    $boundary = [System.Guid]::NewGuid().ToString()       
    $LF = "`r`n"
    $bodyLines = (
        "--$boundary",
        "Content-Type: text/plain; charset=utf-8",
        "Content-Disposition: form-data; name=body$LF",
        "{ `"type`":144, `"name`":`"$fileName`", `"parent_id`":$ParentFolderID }",        
        "--$boundary",
        "Content-Disposition: form-data; name=file; filename=$fileName",
        "Content-Type: application/octet-stream$LF",        
        $fileEnc,
        "$LF",
        "--$boundary--$LF"
     ) -join $LF
    
    Try {
      $result = Invoke-RestMethod -Uri $AddDocumentUrl -ContentType "multipart/form-data; boundary=`"$boundary`"" -Method Post -Headers $header -Body $bodyLines;      
        
      $docResult.Success = $true
      $docResult.DocumentID = $result.id                    
      
      Write-Host $result
    } Catch {
      if($_.ErrorDetails.Message) {
        Write-Host $_.ErrorDetails.Message
      } else {
        Write-Host $_
      }
      $docResult.ExceptionStatusDescription = $_.Exception.Response.StatusDescription
    }
    
    $docResult
}