TMS Webcore app mit DB auf gehosteten Systemen
Hallo liebe Gemeinde,
ich bastele gerade ein bisschen mit den TMS WebCore und FNC Komponenten rum. Programme mit diesen Komponenten erzeugen ja nach dem compilieren ein paar .html und .js Dateien, die man auch locker auf einen gehosteten Webspace bei z.B. StraXXX oder IonoXXX, oder wem auch immer hochladen kann. Nun hätte ich 2 Fragen: - Bekommt man es irgendwie hin, dass sich eine solche Webcore App mit einer Datenbank(die ja häufig zu Hostingpaketen gehört) "direkt" verbindet? Wenn ja, wie? - Kann man diese Webcore App mit einem z.B. XData Server ausstatten, so dass man über diesen die "DB von aussen" mit einem XData Client erreichen kann? Wenn ja, wie? Danke schon mal wieder vorab an die schlaue Gemeinde |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
Zitat:
|
AW: TMS Webcore app mit DB auf gehosteten Systemen
Normalerweise läuft da auch PHP.
Und WebCore ist HMTL-basiert, also könnte man es in ein PHP z.B. per Formular einbinden. https://www.w3schools.com/php/php_forms.asp Natürlich kann es auch eine vollständige REST-API sein, in PHP, aber der native PHP-Ansatz ist vieleicht für einfache Dinge ausreichend. |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Auf gehostetem WebSpace läuft in der Regel PHP + da kannst du zB
https://github.com/mevdschee/php-crud-api aufsetzen. Damit kannst du deine DB, die ja am Server läuft, vom Client, wo die TMS WebCore Anwendugn läuft, via REST API ansprechen. Funktioniert super. |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
Sowas Ähnliches habe ich auch im Einsatz, hatte ich aber nicht genannt um nicht den Eindruck zu erwecken dass dies völlig Problemfrei ist. Wenn man nur einfach Libraries benutzt oder selber hackt können schnell Sicherheitslücken auftreten. Ich habe jetzt noch nichts mit php-crud-api gemacht, das sieht aber soweit OK aus. Hast Du Erfahrungen damit in welche Fettnäpfchen man treten kann ? Ich habe bei "selbstgemachtem" PHP-Server immer ein bischen das Gefühl eine Sicherheitslücke übersehen zu haben, vielleicht schaue ich mir php-crud-api auch mal näher an, das scheint auch auf einem sehr guten Stand zu sein. Auch Laravel und andere aktuellen PHP System sind nicht völlig pflegeleicht und ich suche auch immer noch eine 100% wasserdichte Implementierung. Leider zeigen die dort immer nur Teilbeispiele aber selten ganze Projekte von A bis Z. Der Vorteil z.B. von Laravel ist die super Pflege und die Millionen User. Generell würde ich für sowas sogar fast empfehlen einfach ein Wordpress aufzusetzen. Das hat auch eine REST-Schnittstelle an die man sich anhängen könnte. Das ist auch super gepflegt und sicherheitstechnisch auf dem letzten Stand, das bischen Overhead vom CMS macht keine Probleme. Wenn man sich sowas selber baut hat man immer das Problem der Pflege, schnell veralten die Libraries und Updates sind nicht immer leicht einzuspielen. Bei Wordpress ist das relativ gut optimiert, mit richtigem Dashboard, und das kann sich regelmäßig selbst updaten. |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
|
AW: TMS Webcore app mit DB auf gehosteten Systemen
Hallo TigerLilly,
vielen Dank erstmal für die gute Idee. Zitat:
|
AW: TMS Webcore app mit DB auf gehosteten Systemen
Was für eine DB magst du denn erreichen? Liegt die auf demseblen Server wir das PHP Script?
Kommst du denn mit einem Tool an deine DB? Für mich hat es genügt, die DB Paramter zu setzen + alles hat funktioniert. |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
Ich habe ein Hosting ink MySQL DBs bei IonXXX.... ob das der (physikalisch) gleiche Server ist kann ich dir natürlich nicht beantworten. Aber ich komme mit "normalen" php Scripts auf die DB(unter Angabe des Users, Passworts, DB Namen und Host)... Das habe ich auch mit der CRUD API gemacht, aber da funktioniert es leider nicht...wäre ja auch zu schön, wenn es so einfach gewesen wäre:x |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Eigentlich klingt das eher danach, dass das copnnect schon funktioniert, aber du eeine falsche Abfrage an das API absetzt.
Das da 1000 => ["Route '%s' not found", ResponseFactory::NOT_FOUND] ist eine Meldung der API. Nimm doch mal den REST Debugger von EMBA und mqach dich mit der Abfragesyntax vertraut. |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Okay, vielleicht bin ich auch einfach nur zu blöde ...
Du hast ja scheinbar eine CRUD API auf irgendeinem Server laufen. Die CRUD API hat ja auch einen Endpunkt mit /status/ping. Wie sieht denn dazu der Aufruf in einem Browser aus? Wenn ich http://xxxxxx.xxx/api.php?status/ping eingebe bekomme ich die schon genannte Fehlermeldung. Eigentlich laut Seite soll da ja ein ReturnCode 200 und sowas: { "db": 42, "cache": 9 } (in der Art)rauskommen..... Wie sieht das bei dir aus? Oder habe ich den Aufruf schon falsch? |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Hast du eine Middleware aktiviert in der Konfiguration?
Dort kannst du auch den Debugmodus aktivieren. Und: Teste das nicht im browser sondern im REST debugger. |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Sorry für die späte Antwort.
An der Konfiguration für die Middleware habe ich zumindest nichts geändert. Damit müsste es wohl CORS sein. Ja, mit dem EMBA Rest Debugger werde ich es beizeiten versuchen, wäre dir aber trotzdem dankbar, wenn du mal bei dir per Browser den status/ping Endpoint ausprobieren könntest und das Ergebnis hier postest.. DANKE und Gruß |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Lass das ? weg:
http://xxxxxx.xxx/api.php/status/ping |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Danke für die Info.
Irgendwie funktioniert das auf dem gehosteten System leider nicht(was auch immer ich falsch gemacht habe). Habe mir lokal nen XAMPP aufgesetzt und es funktioniert sofort. Eine Frage hätte ich noch: Was für eine TMS Connection(und wie konfiguriert) hast du zur Verbindung zu der API genutzt? Wenn du gaanz viel Muße hast hast du ja vielleicht sogar ein funktionierendes Snippet für mich :angel: |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
Delphi-Quellcode:
Der Request in der Funktion läuft asynchron ab. Wenn du auf den Aufruf warten musst, verwende eine Promise.
procedure ...RequestValue(pmResultProc: TProcBoolean);
//-------- local function ------------------------------------------- function DoHandleResponse(_pmEvent: TEventListenerEvent): Boolean; var rspJson: String; rspStatus: Integer; rspObject: TJSObject; begin asm rspJson = _pmEvent.target.responseText; rspStatus = _pmEvent.target.status; end; if rspStatus = 200 then begin rspObject := TJSJson.parseObject(rspJson); ... end; pmResultProc(...); Result := True; end; //-------- end local function --------------------------------------- var req: TJSXmlHttpRequest; requestUrl: String; begin asm var url = new URL(this.FServiceUrl); url.searchParams.append('accessToken', this.FAccessToken); requestUrl = url.toString(); end; req := TJSXmlHttpRequest.new; req.addEventListener('loadend', @DoHandleResponse); req.open('GET', requestUrl); req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); req.send; end;
Delphi-Quellcode:
Benutzen kannst du es so:
function ...LoadValue: TJSPromise;
begin Result := TJSPromise.new( procedure(pmSuccess, pmFailed: TJSPromiseResolver) begin RequestValue( procedure(pmValue: Boolean) begin pmSuccess(pmValue); end); end); end;
Delphi-Quellcode:
Bis bald...
procedure ...btnLoadValueClick(Sender: TObject);
//-------- local function ------------------------------------------- function HandleLoadValue(pmValue: JSValue): JSValue; begin Result := pmValue; btnLoadValue.Enabled := True; ShowMessage('Value available: ' + TJSString(pmValue).ToString); end; //-------- end local function --------------------------------------- begin btnLoadValue.Enabled := False; LoadValue._then(@HandleLoadValue); end; Thomas |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Hallo Thomas,
Danke für dein Beispiel! Wenn ich das richtig sehe hat das aber nichts mehr mit TMS geschweige denn mit TMS Web Core zu tun, oder habe ich da jetzt was falsch verstanden? Gruß |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
Funktioniert extrem cool und nahezu ohne Code. Was mytbo zu Fuß macht, machen die TMS Komponenten von selbst. |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
|
AW: TMS Webcore app mit DB auf gehosteten Systemen
Ich habe aus der DFM das wichtigste rauskopiert:
Code:
Also
object conNaehrwerte: TWebClientConnection
Active = False Headers.Strings = ( 'X-API-Key=12345678') DataNode = 'records' URI = 'https://www.nutritional-software.at/api.php/records/TBLXY?filter=COL1,eq,ABC' Left = 1134 Top = 568 end object cdsNaehrwerte: TWebClientDataSet Connection = conNaehrwerte Params = <> Left = 1265 Top = 561 end 1) TWebClientConnection aufs Formular und bestücken 2) TWebClientDataSet damit verbinden 3) active = true Weiter kannst du mit TWebDataSource und dann auch schon visuelle Kompopnenten zB TWebDBEdit anbinden. Ich habe zuerst nur die TWeb*-Sachen verwendet, aber hier kann man auch alles aus TTMSFNC* benutzen. Ich habe zu Beginn mit CORS gekämpft, aber wenn das API und der DB Server auf demseblen Server sind, ist das kein Thema. Der REST-Debugger war sehr hilfreich beim Verstehen, was im Header etc stehen muss bzw dann zurückgeliefert wird. Achja: Oben das
Code:
steht da nur, weil ich als Middleware die Authentifizierung aktiv habe. Wenn du die nicht hast, brauchst du den header gar nicht setzen.
Headers.Strings = (
'X-API-Key=12345678') Hilft dir das mal? |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Hi TigerLilly,
super, tolle hilfe, funktioniert bei mir aber leider nicht: alles noch lokal im Browser: http://localhost/api.php/records/customers ergibt {"records":[{"id":1,"company":"Company A","last_name":"Bedecs","first_name":"Anna","email _address":null,"job_title":"Owner","business_phone ":"(123)555-0100","home_phone":null,"mobile_phone":null,"fax_n umber":"(123)555-0101","address":"123 1st Street","city":"Seattle","state_province":"WA","zi p_postal_code":"99999","country_region":"USA","web _page":null,"notes":null,"attachments":""},{"id":2 ,"company":"Company B","last_name":"Gratacos Solsona","first_name":"Antonio","email_address":nu ll,"job_title":"Owner","business_phone":"(123)555-0100","home_phone":null,"mobile_phone":null,"fax_n umber":"(123)555-0101","address":"123 2nd Street","city":"Boston","state_province":"MA","zip _postal_code":"99999","country_region":"USA","web_ page":null,"notes":null,"attachments":""},{"id":3, "company":"Company C"..... Das Ganze mit Rest Explorer 1.2 auf http://localhost/api.php/records/customers versucht...liefert auch Ergebnisse dann in Delphi:
Delphi-Quellcode:
liefert mir
object Form1: TForm1
Width = 1096 Height = 681 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] FormContainer = 'appcontent' ParentFont = False OnCreate = WebFormCreate object WebLabel1: TWebLabel Left = 24 Top = 40 Width = 180 Height = 16 Caption = 'Click on column headers to sort' ElementID = 'description' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Tahoma' Font.Style = [] HeightPercent = 100.000000000000000000 ParentFont = False WidthPercent = 100.000000000000000000 end object WebLabel2: TWebLabel Left = 24 Top = 8 Width = 62 Height = 13 Caption = 'DBGrid Demo' ElementID = 'title' HeightPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000 end object WebDBGrid1: TWebDBGrid Left = 24 Top = 59 Width = 1049 Height = 470 Columns = < item DataField = 'Company' Title = 'Company' end> DefaultRowHeight = 80 DataSource = WebDataSource1 FixedCols = 0 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Tahoma' Font.Style = [] Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goRowSelect] ParentFont = False TabOrder = 0 HeightPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000 OnFixedCellClick = WebDBGrid1FixedCellClick ColWidths = ( 64) RowHeights = ( 80 80 80 80 80) end object WebClientConnection1: TWebClientConnection Active = True URI = 'localhost/api.php/records/customers/' Left = 464 Top = 544 end object WebDataSource1: TWebDataSource DataSet = WebClientDataSet1 Left = 624 Top = 552 end object WebClientDataSet1: TWebClientDataSet Connection = WebClientConnection1 Params = <> Left = 256 Top = 552 object WebClientDataSet1Brand: TStringField FieldName = 'Company' Size = 256 end end end ERROR Error connecting to URI localhost/api.php/records/customers/ | fMessage::Error connecting to URI localhost/api.php/records/customers/ FJSError::Error: Error connecting to URI localhost/api.php/records/customers/ fHelpContext::0 at http://localhost:8000/TMSWeb_DBGrid/TMSWeb_DBGrid.js [259:48] auf http://localhost:8000/TMSWeb_DBGrid/index.html und die gleiche Fehlermeldung bekomme ich auch schon, wenn ich ich mir im Designer auf WebClientDataset die Felder holen will... Bin ich zu doof, oder was ist hier los? |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
|
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
Bis bald... Thomas |
AW: TMS Webcore app mit DB auf gehosteten Systemen
So, jetzt habe ich es: in der WebCLientConnection musste noch der DataNode auf "records" gesetzt werden!
Danke euch allen...jetzt kann es weitergehen |
AW: TMS Webcore app mit DB auf gehosteten Systemen
:- ) Stand aber im Beispiel drin. Gut, dass es jetzt funkt. Viel Spaß!
|
AW: TMS Webcore app mit DB auf gehosteten Systemen
So, und jetzt habe ich es auch endlich auf dem gehosteten System laufen:
für die, die vielleicht ein ähnliches Problem haben: ich musste in der api.php nocht den basePath auf '/api.php' stzen..... Das soll einer ahnen ;-) Aber Danke nochmal an alle für diesen coolen Tip... jetzt werde ich das nochmal mit Berechtigungen testen ... mal schauen, wie lange ich brauche, um das zum Laufen zu bekommen ;-) |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zumindest mit ApiKey war das ganz unkompliziert:
Code:
Und in der Connection setzt du im Code oder zur Designtime
$config = new Config([
'driver' => 'mysql', 'address' => 'xxx', // 'port' => '3306', 'username' => 'xxx', 'password' => 'xxx', 'database' => 'xxx', ---> 'middlewares'=>'apiKeyAuth', ---> 'apiKeyAuth.keys'=>'abc,def', // da sind mehrere möglich 'debug' => false ]);
Code:
Connection.Headers.Add('X-API-Key=abc');
|
AW: TMS Webcore app mit DB auf gehosteten Systemen
Hallo TigerLilly,
du scheinst ja schon viel Erfahrung mit dem Setup zu haben. Das mit dem Daten holen funktioniert wunderbar, auch mit dem APIKey(Danke dafür nochmal!!!). Jetzt bin ich aber auf das nächste Problem gestoßen: Ich würde nun gerne die Daten die ich über die CRUD -API erhalten habe aus der Webcore Anwendung auch aktualisieren, aber ApplyUpdates,Post oder was auch immer geht gar nicht als request an die CRUD-API raus... Hast du eine Idee, was ich jetzt wieder falsch bzw. vergessen habe mache...oder geht das gar nicht? Gruß |
AW: TMS Webcore app mit DB auf gehosteten Systemen
:-) Freut mich, wenn ich hefen konnte.
In ReadMe zur API steht:
Code:
Das Updaten geht analog zum Lesen, nur mit PUT statt GET.
#### Update
To update a record in this table the request can be written in URL format as: PUT /records/posts/1 Where "1" is the value of the primary key of the record that you want to update. Send as a body: { "title": "Adjusted title!" } This adjusts the title of the post. And the return value is the number of rows that are set: 1 TWebClientConnection hat eine Property Command, mit der du das machen kannst. Ich hab grad keine Zugriff auf meinen Code, ich such das später raus. |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Zitat:
Ja, das mit der CRUD API habe ich gelesen, und wenn ich das über nen Rest Explorer mache funktioniert es auch... Mir ist nur gerade trotz Lesen der TWebClientConnection völlig unklar, was zu machen ist ... Aber ich freue mich schon auf deinen nächsten Code-Snippet.. der ist dann bestimmt wieder so hilfreich wie die Teile zuvor ;-) Gruß |
AW: TMS Webcore app mit DB auf gehosteten Systemen
Es ist ein bissl komplizierter. WebClientDataset.GetPendingUpdates gibt dir an, welche Updates du via REST zum Server schicken musst. Diese Anweisungen musst du dir zusammenbauen (RIT, JSON) und per TWebHTTPRequest an deinen Server schicken.
|
AW: TMS Webcore app mit DB auf gehosteten Systemen
Hallo Tigerlilly,
Zitat:
|
AW: TMS Webcore app mit DB auf gehosteten Systemen
Hallo TigerLilly,
bisschen kompliziert ist gut: WebClientDataset.GetPendingUpdates ist leider nirgendwo dokumentiert, noch gibt es Democode dazu:oops:... Da du das ja schon gelöst zu haben scheinst: Könntest du bitte nochmal ein kleines Snippet dazu einstellen? Danke im Voraus! Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz