Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
PHP-Code in C# umschreiben
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

PHP-Code in C# umschreiben

beantworten | zitieren | melden

Hallo zusammen,

Ich hoffe, dass ich hier richtig bin mit dem Thema.

Wie im Titel schon steht, will ich mehrere PHP-Files in C#-Files umschreiben.
Da ich ein Anfänger in PHP wie auch in C# bin, brauche ich eure Hilfe.

Es geht darum, dass ich mit den PHP-Files Daten aus einer Webbasierten Buchhaltungssoftware erhalte und diese via VBScript-Schnittstelle in die Datenbank lokale Datenbank einer anderen Buchhaltungssoftware importiere.

Die PHP-Files:
Die Files nutzen cUrl und oAuth 2.0 um eine REST API anzuzapfen um mir die gewünschten Daten zuliefern.
Diese Daten werden als HTML-Seite dargestellt.

Mein Ziel ist es, diese Daten in variablen zu speichern damit ich die Daten der VBScript-Schnittstelle übergeben kann.
Da für mich eine grafische Darstellung via HTML-Seite nicht wichtig ist, würde ich gerne diese Aufgabe als C#-Konsolenanwendung realisieren.

Damit ich mir irgendwie vorstellen kann, wie solch eine Konvertierung aussehen muss, wäre ich froh wenn Ihr mir helfen könntet.

Im Anhang findet Ihr eines dieser PHP-Files. Anhang entfernt und als Code eingefügt - Coffeebean
<?php

class Curl {

    const METHOD_GET = 'GET';
    const METHOD_POST = 'POST';
    const METHOD_PUT = 'PUT';
    const METHOD_DELETE = 'DELETE';
    
    const CURL_TIMEOUT_IN_SECS = 15;

    public static $successFullHttpCodes = array(200, 201, 204);

    public function call($url, $urlParams = array(), $postParams = null, $method = self::METHOD_GET, $headers = array()) {
        $finalUrl = $url . $this->getUrlParameterString($urlParams);
        $data = $this->makeCurlCall($finalUrl, $postParams, $method, $headers);
        return $data;
    }

    private function makeCurlCall($url, $postParams = array(), $method = self::METHOD_GET, $headers = array()) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_VERBOSE, 0);
        curl_setopt($curl, CURLOPT_TIMEOUT, self::CURL_TIMEOUT_IN_SECS);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);

        if ($headers) {
            $usableHeaders = array();
            foreach ($headers as $name => $value) {
                $usableHeaders[] = sprintf('%s: %s', $name, $value);
            }

            curl_setopt($curl, CURLOPT_HTTPHEADER, $usableHeaders);
        }

        if ($postParams) {
            curl_setopt($curl, CURLOPT_POSTFIELDS, $postParams);
        }

        $data = curl_exec($curl);
        $this->checkForError($curl, $data);

        return $data;
    }

    private function checkForError($curl, $data) {
        $curlInfo = curl_getinfo($curl);
        if (isset($curlInfo['http_code']) && !in_array($curlInfo['http_code'], self::$successFullHttpCodes)) {
            throw new Exception($curlInfo['http_code'] ? $data : 'could not get a response from the service', $curlInfo['http_code'] ? $curlInfo['http_code'] : 500);
        }
    }

    private function getUrlParameterString(array $urlParams) {
        if (!$urlParams) {
            return "";
        }

        return "?" . http_build_query($urlParams);
    }

}

?>

Vielen Dank

Gruss

Ovoxo

Moderationshinweis von Coffeebean (01.10.2015 - 18:44)

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 4

private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

Hi Ovoxo,
Zitat von Ovoxo
Damit ich mir irgendwie vorstellen kann, wie solch eine Konvertierung aussehen muss, wäre ich froh wenn Ihr mir helfen könntet.

Wobei genau helfen? Du erwartest doch hoffentlich nicht, daß wir dir den PHP-Code in C# übersetzen? Bitte beachte unbedingt unseren [Hinweis] Wie poste ich richtig?, besonders Punkt 1.1, 4, 4.2 und 5.

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
hypersurf
myCSharp.de - Member



Dabei seit:
Beiträge: 520
Herkunft: Münster

beantworten | zitieren | melden

Du könntest z. B. RestSharp nutzen um auch die REST API anzuzapfen. Alternativ könntest Du auch einfach den HTML-Output der PHP-Seite einlesen und verarbeiten.
private Nachricht | Beiträge des Benutzers
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Nein natürlich will ich nicht, dass Ihr mir den ganzen Code übersetzt.
Ich wäre schon über Tipps froh wenn Ihr mir ungefähr sagen könntet wie ich anfangen muss. Da ich schon Probleme habe die erste Funktion zu übersetzten habe ich hauptsächlich diesen Beitrag erstellt.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.358

beantworten | zitieren | melden

Und für curl könntest du dir libcurl .NET Binding anschauen.
private Nachricht | Beiträge des Benutzers
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Leider verstehe ich dieses "libcurl" nicht...
Habe es mit Google probiert jedoch kein Erfolg.

Konnte alles ins C# übersetzten bis auf diese Curl-Klasse.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Doe Beispiele von libcurl sind doch ziemlich ausführlich.
Was verstehst da nicht?
private Nachricht | Beiträge des Benutzers
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Leider schaffe ich es nicht, die libcurl in mein Projekt einzubinden.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

"Ich schaff es nicht" ist keine akzeptable Fehlermeldung. Niemand hat hier eine Glaskugel. [Hinweis] Wie poste ich richtig? "5. Problem genau beschreiben - inkl. genauer Fehlermeldung - und konkrete Fragen stellen"
private Nachricht | Beiträge des Benutzers
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Sorry, besser gesagt ich verstehe nicht wie ich diese Dateien in mein Projekt einbinden kann.

Ob ich die Dateien in mein Projekt Kopieren muss.
Ob ich diese Solution öffnen muss.
Ob ich die darin enthaltenen .dll-Dateien als Referenz einbinden muss.(Dabei erhalte ich immer den Fehler, dass die Dateien Fehlerhaft sind.)
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.358

beantworten | zitieren | melden

Falls du dich auf "libcurl .NET Binding" beziehst:
- die libcurlNet.dll als Verweis (Reference) zu deinem Projekt hinzufügen
- die libcurl.dll muß dann zur Laufzeit aber auch im "bin"-Verzeichnis zur Verfügung stehen - am besten diese direkt "als Datei hinzufügen" (und bei den dortigen Eigenschaften "Copy To OutputDir" auf "copy, if newer" stellen)
private Nachricht | Beiträge des Benutzers
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Gibt es keine Möglichkeit, dass mir jemand vielleicht hilft?
Ich komme leider nicht klar mit der libCurl .NET.

Verstehe nicht wie ich diese einsetzen muss.
Via Goggle finde ich leider auch keine passende Lösung
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

Hi Ovoxo,

wir drehen uns im Kreis. Th69 hat dir doch eine Anleitung gegeben, wie du die Bibliothek einbindest. Wenn du damit nicht zurecht kommst, mußt du schon genauer beschreiben, woran es scheitert. Wie sollte dir sonst jemand weiterhelfen können?

[Hinweis] Wie poste ich richtig? Punkt 5.

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Das Einbinden hat super geklappt nach der Anleitung.
Mein Problem ist, dass ich nicht mit den Funktionen klar komme.

Leider bin ich ein C# / PHP Anfänger und verstehe die einzelnen Funktionen nicht.

Oder besser gesagt ich verstehe nicht welche Klasse die Funktionen beinhaltet, welche ich brauche.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Was wir nicht machen werden ist das Zeug für Dich programmieren; das muss Dir klar sein.
Die Bibliothek hat eine (offensichtlich) ausführliche Anleitung sowie zahlreiche Beispiele.

Anfänger hin oder her.
Ab und zu muss man auch einfach etwas ausprobieren; deswegen heisst der Job "Entwickler" ;-)
private Nachricht | Beiträge des Benutzers
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Also hier mein fehlerhafter Code..

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SeasideResearch.LibCurlNet;

namespace ConsoleApplication1
{
    
    class CurlCall
    {
        const String method_get = "GET";
        const String method_post = "POST";
        const String method_put = "PUT";
        const String method_delete = "DELETE";

        const int curl_timeout_in_secs = 15;
        public static int[] successFullHttpCodes = { 200, 201, 204 };

        public String call(String url, String[] urlParams, String postParams, String method, String[] header)
        {
            String data = "";
            String finalUrl = "";

            finalUrl = url + this.getUrlParameterString(urlParams);

            return data;
        }

        private String makeCurlCall(String url, String[] postParams, String method, String[] header)
        {
            try
            {
                Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);

                Easy easy = new Easy();
                Easy.WriteFunction wf = OnWriteData;

                easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
                easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 2);
                easy.SetOpt(CURLoption.CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
                easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf);
                easy.SetOpt(CURLoption.CURLOPT_URL, "http://google.com/index.html");
                easy.SetOpt(CURLoption.CURLOPT_VERBOSE, 0);
                easy.SetOpt(CURLoption.CURLOPT_TIMEOUT, curl_timeout_in_secs);
                easy.SetOpt(CURLoption.CURLOPT_CUSTOMREQUEST, method);

                if(header != null)
                {
                    String[] usableHeaders;
                    for(int i = 0; i ≤ header.Length; i++)
                    {
                        usableHeaders[i] = string.Format("%s: %s", header[i], i);
                    }
                    easy.SetOpt(CURLoption.CURLOPT_HTTPHEADER, usableHeaders);
                }

                if (postParams != null)
                {
                    easy.SetOpt(CURLoption.CURLOPT_POSTFIELDS, postParams);
                }

                easy.Perform();
                easy.Cleanup();

                Curl.GlobalCleanup();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                Console.ReadKey();
            }
            String data;
            data = "0";
            this.checkForError("", data);
            return data;
        }

        private void checkForError(String curl, String data)
        {
            String curlInfo;
            Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
            Easy easy = new Easy();
            curlinfo = easy.GetInfo(CURLINFO, curl);
            if()
            {

            }
        }
        private String getUrlParameterString(String[] urlParams)
        {
            if(urlParams != null)
            {
                return "";
            }

            return "?";
        }
        public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb,
        Object extraData)
        {
            Console.Write(System.Text.Encoding.UTF8.GetString(buf));
            Console.ReadKey();
            return size * nmemb;
        }

    }
}

Nun mein Problem, warum ich so viel Frage.
Ich konnte einige Funktionen nicht übersetzten.

Die Parameter
$method = self::METHOD_GET
konnte ich nicht übersetzten, da ich dieses self:: nicht verstanden habe.

Bei
if ($headers) {
und
if ($postParams) {
bin ich mir nicht sicher, ob ich es richtig übersetzt habe.

Bei
$usableHeaders[] = sprintf('%s: %s', $name, $value);
erhalte ich den Fehler
Fehler
"Use of unassigned local variable 'usableHeaders'

Bei der Funktion checkForError habe ich nicht verstanden welches die Variable $curl sein sollte. Mit dem
$curlInfo = curl_getinfo($curl);
hatte ich auch Probleme.

Bei der Funktion getUrlParameterString konnte ich keine Funktion für
http_build_query($urlParams);
finden.

Hoffe Ihr seht nun mein Problem.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ovoxo am .
private Nachricht | Beiträge des Benutzers
felix
myCSharp.de - Member



Dabei seit:
Beiträge: 174

beantworten | zitieren | melden


$method = self::METHOD_GET
Das ist wohl ein optionaler Parameter mit einer Standard-Zuweisung. Das "self" kannst du in diesem Fall für die Portierung auf C# ignorieren. In C# heißt es übrigens "this" ;-)

Hier kannst du das ganze auch noch mal nachlesen.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von felix am .
private Nachricht | Beiträge des Benutzers
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Danke nun ist mir klar warum es mit "this" nicht geklappt hat.
Das die Frage zu den IF-Abfragen hat sich auch geklärt.
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 415
Herkunft: Hamburg

beantworten | zitieren | melden

Zitat von Ovoxo
Bei
$usableHeaders[] = sprintf('%s: %s', $name, $value);
erhalte ich den Fehler
Fehler
"Use of unassigned local variable 'usableHeaders'

Hier greifst du auf ein nicht initialisiertes Array zu. Die Deklaration deines Arrays müsste in etwa so aussehen:


String[] usableHeaders = new String[header.Length];
private Nachricht | Beiträge des Benutzers
Ovoxo
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Super, danke.

Hatte bemerkt warum der Fehler ausgetretten ist, jedoch wusste ich nicht wie korrekt deklarieren.
private Nachricht | Beiträge des Benutzers