是否可以通过PHP连接到.NET API
本文关键字:NET API 连接 可以通过 PHP 是否 | 更新日期: 2023-09-27 18:31:04
初学者问题在这里。我有一个用PHP编写的网站,需要连接到我们使用的应用程序。应用程序DocuWare提供了一个DocuWare Platform .NET API。是否可以在 PHP 中使用它?
该网站提供了示例,但这些示例是用 C# 编写的。我在下面从他们的网站上放了一个示例,展示了如何在 C# 中连接到应用程序。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Cache;
using System.Net.Http;
using DocuWare.Platform.ServerClient;
namespace DocuWare.PlatformClientExamples
{
static partial class Examples
{
static Uri uri = new Uri("http://chw-dw-01/docuware/platform");
static public ServiceConnection Connect()
{
return ServiceConnection.Create(uri, "admin", "admin");
}
static public ServiceConnection ConnectWithUserAgent()
{
return ServiceConnection.Create(uri, "admin", "admin",
userAgent: new System.Net.Http.Headers.ProductInfoHeaderValue[] {
new System.Net.Http.Headers.ProductInfoHeaderValue("DocuWare+.NET+API+Test+Client", "1.0")
});
}
static public ServiceConnection ConnectWithOrg()
{
return ServiceConnection.Create(uri, "admin", "admin", organization: "Peters Engineering");
}
static public ServiceConnection ConnectWithCaching()
{
var handler = new WebRequestHandler() { CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default) };
return ServiceConnection.Create(uri, "admin", "admin", httpClientHandler: handler);
}
static public ServiceConnection ConnectWithNTLM()
{
return ServiceConnection.CreateWithWindowsAuthentication(uri, "Administrator", "admin");
}
static public ServiceConnection ConnectWithDefaultUser()
{
return ServiceConnection.CreateWithWindowsAuthentication(uri, System.Net.CredentialCache.DefaultCredentials);
}
}
}
是否可以使用替代方案在 PHP 中执行此操作,或者我们是否需要将 PHP 网站更改为 C#才能执行此操作?
我在Docuware V6.10 REST API下创建了一个身份验证类。希望这有帮助(请原谅德语评论):
class DwPlatformAuthentication {
/**
* Authentication-Cookie
* @var string $_auth
*/
private static $_auth = null;
/**
* BrowserId-Cookie
* @var string $_browserid
*/
private static $_browserid = null;
/**
* liefert den Authentication-Cookie zurück
*/
public static function GetDwPlatformAuth()
{
return self::$_auth;
}
/**
* liefert den BrowserId-Cookie zurück
*/
public static function GetDwPlatformBrowserId()
{
return self::$_browserid;
}
/**
* stellt eine Verbindung zu Docuware (REST-Schnittstelle) her
*/
public static function GetAuthentication()
{
// enthält Konstanten für Datenbankverbindung (z.B. DOCUWARE_USER)
require_once 'config.php';
// startet die Session
session_start();
// ermittelt den aktuellen Authentifizierungs-Cookie
if(isset($_SESSION['dwplatformauth']) && isset($_SESSION['dwplatformbrowserid'])){
self::$_auth = $_SESSION['dwplatformauth'];
self::$_browserid = $_SESSION['dwplatformbrowserid'];
}
else{
// ermittelt einen neuen Authentifizierungs-Cookie, wenn keiner gespeichert ist
// definiert den URL
$url = DOCUWARE_HOST.'DocuWare/Platform/Account/Logon';
// definiert die POST-Parameter
$data = array(
'UserName' => DOCUWARE_USER,
'Password' => DOCUWARE_PASS,
'Organization' => DOCUWARE_ORGA
);
// use key 'http' even if you send the request to https://...
$options = array(
"http" => array(
"header" => "Content-Type: application/x-www-form-urlencoded'r'n",
"method" => "POST",
"content" => http_build_query($data, "", "&")
),
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
//print_r($http_response_header); // ermittelt den Response-Header
// ermittelt den Authentifizierungs-Cookie
$dwplatformauth = explode('=', $http_response_header[8]);
$dwplatformauth = explode(';', $dwplatformauth[1]);
$dwplatformauth = $dwplatformauth[0];
// schreibt den Wert des Authentifizierungs-Cookies in eine Session-Variable
if(isset($dwplatformauth) && $dwplatformauth != null){
$_SESSION['dwplatformauth'] = $dwplatformauth;
}
// ermittelt den DWPLATFORMBROWSERID-Cookie
$dwplatformbrowserid = explode('=', $http_response_header[10]);
$dwplatformbrowserid = explode(';', $dwplatformbrowserid[1]);
$dwplatformbrowserid = $dwplatformbrowserid[0];
// schreibt den Wert des DWPLATFORMBROWSERID-Cookies in eine Session-Variable
if(isset($dwplatformbrowserid) && $dwplatformbrowserid != null){
$_SESSION['dwplatformbrowserid'] = $dwplatformbrowserid;
}
self::$_auth = $_SESSION['dwplatformauth'];
self::$_browserid = $_SESSION['dwplatformbrowserid'];
}
}}
您可以在另一个类中使用 DwPlatformAuthentication 类来创建文档:
class DwPlatformDocument {
/**
* Indexfelder des Archiv, die bearbeitet werden sollen
* @var DwPlatformFields $dwFields
*/
public $dwFields;
/**
* Der Name des Archivs.
* Die FileCabinetId kann in den Eigenschaften (Allgemein) des Archivs über die DocuWare-Administration abgelesen werden.
* @var string $fileCabinetId
*/
public $fileCabinetId;
/**
* speichert einen Datensatz in Docuware
* @param DwPlatformFields $dwFields Daten, die an Docuware übergeben werden sollen
* @param int $dwdocid Primary Key des Docuware-Datensatzes, der geändert werden soll
* @return int $dwdocid Primärschlüssel des Datensatzes in Docuware
*/
public function saveDocuware($dwFields, $dwdocid = null) {
if (empty ( $this->fileCabinetId )) {
throw new Exception ( 'Die Eigenschaft fileCabinetId muss definiert werden.' );
}
// bindet Klasse zur Authentifizierung von Docuware Platform Services ein
require_once 'docuware/DwPlatformAuthentication.php';
// bindet Klasse zur Erzeugung von Indexfeldern eines Dokuments (Docuware Platform Service) ein
require_once 'docuware/DwPlatformFields.php';
// stellt eine Verbindung zu Docuware her und ermittelt die Authentifizierungs-Cookies
DwPlatformAuthentication::GetAuthentication ();
// liefert den Wert des Authentifizierungs-Cookies zurück und speichert ihn in einer Variable
$dwplatformauth = DwPlatformAuthentication::GetDwPlatformAuth ();
// liefert den Wert des DWPLATFORMBROWSERID-Cookies zurück und speichert ihn in einer Variable
$dwplatformbrowserid = DwPlatformAuthentication::GetDwPlatformBrowserId ();
// UPDATE
if (is_numeric ( $dwdocid )) {
// definiert den URL
// ermittelt die Indexfelder inkl. Indexdaten zu einem Dokument
$url = DOCUWARE_HOST . 'DocuWare/Platform/FileCabinets/' . $this->fileCabinetId . '/Documents/' . $dwdocid . '/Fields';
}
else { // INSERT
// definiert den URL
$url = DOCUWARE_HOST . 'DocuWare/Platform/FileCabinets/' . $this->fileCabinetId . '/Documents';
}
// ermittelt die POST-Parameter aus den DwPlatformFields
$data = array ();
// zählt die Elemente des DwPlatformFields-Objekts
$countFields = 0;
foreach ( $dwFields->Fields as $field ) {
$data ["Fields[" . $countFields . "].FieldName"] = $field->FieldName;
$data ["Fields[" . $countFields . "].Item"] = $field->Item;
$data ["Fields[" . $countFields . "].ItemElementName"] = $field->ItemElementName;
$countFields ++;
}
// use key 'http' even if you send the request to https://...
$options = array (
'http' => array (
'header' => "Content-type: application/x-www-form-urlencoded; charset=utf-8'r'n" .
"Cookie: DWOrganization=YourCompanyName; " .
"openInNewWindow=False; " .
"DWPLATFORMBROWSERID=" . $dwplatformbrowserid . "; " .
".DWPLATFORMAUTH=" . $dwplatformauth . "'r'n",
// ACHTUNG: "'r'n" muss in doppelten Anführungszeichen (") stehen -> ''r'n' funktioniert nicht!!!
'method' => 'POST',
'content' => http_build_query ( $data, '', '&' )
)
);
$context = stream_context_create ( $options );
$result = file_get_contents ( $url, false, $context );
// speichert die Antwort des POST-Request in einem XML-Objekt
$xml = new SimpleXMLElement ( $result );
// UPDATE
if (is_numeric ( $dwdocid )) {
$dwdocid = ( string ) $xml->Field [9]->Int;
}
else { // INSERT
$dwdocid = ( string ) $xml->attributes ()->Id;
}
return $dwdocid;
}
/**
* lädt ein Dokument ins Docuware
* @param DwPlatformFields $dwFields Indexdaten, die an Docuware übergeben werden sollen
* @param string $filename Pfad der Datei, die ins Docuware geladen werden soll
* @return int $dwdocid Primary Key des Datensatzes in Docuware
*/
public function uploadDocument ($dwFields, $filename){
if (empty ( $this->fileCabinetId )) {
throw new Exception ( 'Die Eigenschaft fileCabinetId muss definiert werden.' );
}
// bindet Klasse zur Authentifizierung von Docuware Platform Services ein
require_once 'docuware/DwPlatformAuthentication.php';
// bindet Klasse zur Erzeugung von Indexfeldern eines Dokuments (Docuware Platform Service) ein
require_once 'docuware/DwPlatformFields.php';
// stellt eine Verbindung zu Docuware her und ermittelt die Authentifizierungs-Cookies
DwPlatformAuthentication::GetAuthentication ();
// liefert den Wert des Authentifizierungs-Cookies zurück und speichert ihn in einer Variable
$dwplatformauth = DwPlatformAuthentication::GetDwPlatformAuth ();
// liefert den Wert des DWPLATFORMBROWSERID-Cookies zurück und speichert ihn in einer Variable
$dwplatformbrowserid = DwPlatformAuthentication::GetDwPlatformBrowserId ();
// definiert den URL
$url = DOCUWARE_HOST . 'DocuWare/Platform/FileCabinets/' . $this->fileCabinetId . '/Documents';
// definiert Zeitstempel, der als Grenze für Multipart Content-type verwendet wird
define ( 'MULTIPART_BOUNDARY', md5 ( time () ) );
// definiert den Teil, der die Indexdaten als JSON enthält
$content = "--".MULTIPART_BOUNDARY."'r'n";
$content .= "Content-Disposition: form-data; name='"Fields'"'r'n".
"Content-type: application/json'r'n'r'n";
$content .= $dwFields->getJSON () . "'r'n";
// definiert den Inhalt für den POST-REQUEST, der die Datei enthält
$content .= "--".MULTIPART_BOUNDARY."'r'n".
"Content-Disposition: form-data; name='"file'"; filename='"".$filename."'"'r'n".
"Content-Type: text/plain'r'n".
"Content-Transfer-Encoding: base64'r'n'r'n";
// ermittelt den Inhalt der Datei und fügt diesen zum Inhalt des POST-REQUESTs an
$content .= file_get_contents($filename)."'r'n";
$content .= "--".MULTIPART_BOUNDARY."--'r'n'r'n"; // ACHTUNG: diese Syntax muss unbedingt eingehalten werden
// definiert die Parameter (header, method, content etc.) für den POST-REQUEST
// übergibt die Authentifizierungs-Cookies (im Header)
$options = array(
"http" => array(
"header" => "Content-Type: multipart/form-data; boundary=".MULTIPART_BOUNDARY."'r'n".
"Cookie: DWOrganization=YourCompanyName; ".
"openInNewWindow=False; ".
"DWPLATFORMBROWSERID=".$dwplatformbrowserid."; ".
".DWPLATFORMAUTH=".$dwplatformauth."'r'n",
// ACHTUNG: "'r'n" muss in doppelten Anführungszeichen (") stehen -> ''r'n' funktioniert nicht!!!
"method" => "POST",
"content" => $content,
),
);
// sendet eine Anfrage an den Docuware-Server
$context = stream_context_create ( $options );
try {
// Nur einfache Fehler melden
error_reporting(E_ERROR);
$result = file_get_contents ( $url, false, $context );
// speichert die Antwort des POST-Request in einem XML-Objekt
$xml = new SimpleXMLElement ( $result );
// ermittelt die dwdocid aus der Antwort der Docuware-Servers
$dwdocid = ( string ) $xml->attributes ()->Id;
return $dwdocid;
} catch (Exception $e) {
return false;
}
}}
也许你需要文档字段的类:
class DwPlatformFields {
public $Fields;
public function __construct() {
$this->Fields = new ArrayObject ( array () );
}
public function AddField($field) {
$this->Fields->append ( $field );
}
public function CreateDocumentUploadContent($multipart_boundary) {
$multipart_boundary = "--" . $multipart_boundary;
$countFields = 0;
foreach ( $this->Fields as $field ) {
$content .= $multipart_boundary."'r'n".
"Content-Disposition: form-data; name='"Fields[".$countFields."].FieldName'"'r'n'r'n".
$field->FieldName."'r'n";
$content .= $multipart_boundary."'r'n".
"Content-Disposition: form-data; name='"Fields[".$countFields."].Item'"'r'n'r'n".
$field->Item."'r'n";
$content .= $multipart_boundary."'r'n".
"Content-Disposition: form-data; name='"Fields[".$countFields."].ItemElementName'"'r'n'r'n".
$field->ItemElementName."'r'n";
$countFields++;
}
$content .= $multipart_boundary;
return $content;
}
public function getJSON() {
$json .= '{"Fields":[';
foreach ( $this->Fields as $field ) {
$json .= json_encode ( $field ) . ",";
}
$json .= "]}";
return $json;
}}
class Field { public $FieldName;
public $Item;
public $ItemElementName;
public function __construct($name, $item, $element) {
$this->FieldName = $name;
$this->Item = $item;
$this->ItemElementName = $element;
}}
您可以像下面这样使用它:
require 'docuware/DwPlatformFields.php';
require 'docuware/DwPlatformDocument.php';
$dwFields = new DwPlatformFields();
$dwFields->AddField(new Field('PROJEKT', $bezeichnung, 'String'));
$dwFields->AddField(new Field('PROJEKTID', $projekt_id, 'Decimal'));
$fileCabinetId = 'd7b3a06e-9d6a-4ba3-b317-672b18cb7913';
$dwDocument = new DwPlatformDocument();
$dwDocument->fileCabinetId = $fileCabinetId;
return $dwDocument->saveDocuware($dwFields, $dwdocid);
您可以使用任何理解HTTP的内容连接到DocuWare平台。我把它连接到Java,C/AL(Navision),Swift,...
您是否尝试过任何 Rest 客户端来"玩弄"平台?