Laden...

PHP-Code in C# umschreiben

Erstellt von Ovoxo vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.738 Views
O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren
PHP-Code in C# umschreiben

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

Hinweis von Coffeebean vor 8 Jahren

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

5.657 Beiträge seit 2006
vor 8 Jahren

Hi 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

H
523 Beiträge seit 2008
vor 8 Jahren

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.

O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren

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.

O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren

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

Konnte alles ins C# übersetzten bis auf diese Curl-Klasse.

16.806 Beiträge seit 2008
vor 8 Jahren

Doe Beispiele von libcurl sind doch ziemlich ausführlich.
Was verstehst da nicht?

O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren

Leider schaffe ich es nicht, die libcurl in mein Projekt einzubinden.

16.806 Beiträge seit 2008
vor 8 Jahren

"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"

O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren

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

4.931 Beiträge seit 2008
vor 8 Jahren

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)
O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren

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

5.657 Beiträge seit 2006
vor 8 Jahren

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

O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren

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.

16.806 Beiträge seit 2008
vor 8 Jahren

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" 😉

O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren

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 > Fehlermeldung:

"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.

F
174 Beiträge seit 2007
vor 8 Jahren

$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.

O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren

Danke nun ist mir klar warum es mit "this" nicht geklappt hat.
Das die Frage zu den IF-Abfragen hat sich auch geklärt.

T
415 Beiträge seit 2007
vor 8 Jahren

Bei

$usableHeaders[] = sprintf('%s: %s', $name, $value);  

erhalte ich den Fehler > Fehlermeldung:
"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];

O
Ovoxo Themenstarter:in
19 Beiträge seit 2015
vor 8 Jahren

Super, danke.

Hatte bemerkt warum der Fehler ausgetretten ist, jedoch wusste ich nicht wie korrekt deklarieren.