是否可以通过PHP连接到.NET API?

时间:2016-01-20 10:45:04

标签: c# php

这里有初学者问题。我有一个用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#才能执行此操作?

2 个答案:

答案 0 :(得分:1)

我在Docuware版本6.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;           
    }



}}

也许你需要DocuwareField的课程:

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);

答案 1 :(得分:0)

您可以使用任何了解HTTP的内容连接到DocuWare平台。我把它连接到Java,C / AL(Navision),Swift,......

你有没有尝试任何休息客户来玩#34;与平台?