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
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 4
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
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.
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.
Und für curl könntest du dir libcurl .NET Binding anschauen.
Leider verstehe ich dieses "libcurl" nicht...
Habe es mit Google probiert jedoch kein Erfolg.
Konnte alles ins C# übersetzten bis auf diese Curl-Klasse.
Doe Beispiele von libcurl sind doch ziemlich ausführlich.
Was verstehst da nicht?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
"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"
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.)
Falls du dich auf "libcurl .NET Binding" beziehst:
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
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
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.
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" 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
Danke nun ist mir klar warum es mit "this" nicht geklappt hat.
Das die Frage zu den IF-Abfragen hat sich auch geklärt.
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];
Super, danke.
Hatte bemerkt warum der Fehler ausgetretten ist, jedoch wusste ich nicht wie korrekt deklarieren.