Aktuelle Zeit: 24.09.2020 17:21

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: URL-Routing optimieren
BeitragVerfasst: 30.12.2016 13:06 
Offline
Benutzeravatar

Registriert: 08.03.2013 14:27
Wohnort: ERB
Ich habe da mal eine kleine Frage. Für mein Framework teste ich gerade das parsen von URL's im Format des HTTP-Headers Request-Uri. Diese gibt den Pfad ab der Domain wieder. Hintergrund dabei ist, das bei korrekter Konfiguration der Webserver alle Requests an das FastCGI leiten, die mit einer bestimmten File-Extension aufgerufen wurden. Dabei spielt es keine Rolle, ob Pfad oder Datei existiert. Das kann man dann dazu nutzen, sich das Rewrite-Gebastel auf dem Webserver zu sparen. Die Anwendung muss nur entsprechend auf Prozeduren routen können.

Dies realisiere ich mit festen ebenen. Wird dies auf 2 gestellt (meiner Meinung nach ein Standard), werden die ersten Ordner aus der Angabe als fixe Schlüssel verwendet. Alle weiteren sind Variablen, die per Get()-Map angesprochen werden sollen. Ich wollte mal fragen, ob da jemand noch Ideen zur Optimierung hat. An der Performance soll es nicht hapern. Wenn ich ElapsedMilliseconds glauben darf, läuft der folgende Code unter einer Millisekunde durch. Es geht eher um die Lösung selbst. Da würde ich weitere Denkanstöße begrüßen.

PS: Das ist der Probecode. Ich habe es etwas kommentiert. Es sieht aber so wirr aus, da dieser Code eher in Richting Machbarkeitsstudie geht. Der Code, der im Framework landet ist definitiv sauberer ;)
Code:
TimeA.i = ElapsedMilliseconds()

; Simuliert FastCGI URL und die eingerichtete Route
Route.s = "news/view/year/name.html"
GivenUrl.s = "news/view/2016/team_hat_verloren.html"

; Platzhalter-Prozeduradresse
GivenProcedurePointer.i = 1234567890

; Mögliche Einstellungen
Layers.i = 2 + 1
Handle.s = "html"

; Struktur für die Routen
Structure ParsedRoutes
  Variables.s
  Proc.i
EndStructure

Define.s Key,Vars,Sub,GetKey

; Route-Map
NewMap Routes.ParsedRoutes()

; ===== Beim entwickeln der Webanwendung =====
; Parsen der einzustellenden Route
CountParams.i = CountString(Route,"/") + 1
For C = 1 To CountParams
  Sub = StringField(Route,C,"/")
  If C < Layers
    Key + Sub
  Else
    Key + "__" + C + "__"
    If C < CountParams
      Vars + Sub + "|"
    Else
      Vars + RemoveString(Sub,"."+Handle)
    EndIf
  EndIf
  If C < CountParams
    Key + "/"
  Else
    Key + "." + Handle
  EndIf
Next C

; Route festlegen
Routes(Key)\Proc = GivenProcedurePointer
Routes(Key)\Variables = Vars

Key = ""

; ===== Nach Request =====
; Parsen der URL und finden der Route
NewList TempGet.s()
NewMap Get.s()

CountParams.i = CountString(GivenUrl,"/") + 1
For C = 1 To CountParams
  Sub = StringField(GivenUrl,C,"/")
  If C < Layers
    Key + Sub
  Else
    Key + "__" + C + "__"
    If C < CountParams
      AddElement(TempGet())
      TempGet() = Sub
    Else
      AddElement(TempGet())
      TempGet() =  RemoveString(Sub,"."+Handle)
    EndIf
  EndIf
  If C < CountParams
    Key + "/"
  Else
    Key + "." + Handle
  EndIf
Next C

If FindMapElement(Routes(),Key)
  ; Holen der Variablen und erstellen von Get()
  Vars = Routes()\Variables
  C.i = 1
  If ListSize(TempGet()) = (CountString(Vars,"|") + 1)
    ForEach TempGet()
      Get(StringField(Vars,C,"|")) = TempGet()
      C + 1
    Next
  Else
    Debug #False
    End
  EndIf
Else
  Debug #False
  End
EndIf

; Demo-Ausgabe
Debug "Eingerichtete Route: " + Route + Chr(10)
Debug "Übergebe URL: " + GivenUrl
Debug "Geparste Route: " + Key + Chr(10)
Debug "Hinterlegte Prozedur: " + Str(Routes()\Proc)
Debug "Hinterlegte Variablen: " + Routes()\Variables + Chr(10)
Debug "Get-Map für Prozedur:"
ForEach Get()
  Debug MapKey(Get()) + ": " + Get()
Next

Debug Chr(10) + Str(ElapsedMilliseconds() - TimeA)


Die Ausgabe:
Code:
Eingerichtete Route: news/view/year/name.html

Übergebe URL: news/view/2016/team_hat_verloren.html
Geparste Route: news/view/__3__/__4__.html

Hinterlegte Prozedur: 1234567890
Hinterlegte Variablen: year|name

Get-Map für Prozedur:
year: 2016
name: team_hat_verloren

0

Danke für jeden Tipp :)

Ansonsten komtm es so rein :D

_________________
USAC Protokoll
Universal Stringbased Application Communication Protocoll

Github: Zum Spezifikationdokument v0.01


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 18 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye