Confronto dei formati di percorso

5

Sto sviluppando una nuova applicazione e sto cercando di creare una convenzione per definire i percorsi. Idealmente, mi piacerebbe che fosse semplice, flessibile e reversibile.

Ecco alcuni esempi di framework popolari:

Backbone

route                           matches
-----------------------------------------------------
help                            help
search/:query                   search/kiwis
search/:query/p:page            search/kiwis/p7
file/*path                      file/nested/folder/file.txt
docs/:section(/:subsection)     docs/faq, docs/faq/installing

Django

Utilizza regex, ma viene fornito con un inversione regex

route                                                           matches
-------------------------------------------------------------------------------------
^articles/2003/$                                                /articles/2003/
^articles/(\d{4})/(\d{2})/$                                     /articles/2005/03/
^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$     /articles/2003/03/03/

Ruby on Rails

:controller/:action/:id/with_user/:user_id
books/*section/:title

ASP.NET / MVC 5

{controller}/{action}/{id}           /Products/show/beverages
{resource}.axd/{*pathInfo}           /WebResource.axd?d=...
{productId:int}/{productTitle}       /5/asp-net-mvc
books/{isbn?}                        /books, /books/1430210079

Django è probabilmente il più flessibile, ed è già familiare alle persone che conoscono le regex, ma è anche il più difficile da leggere e invertire.

Backbone, RoR e ASP.NET consentono tutte le parti opzionali e jolly / splat, con varie sintassi. MVC 5 ha alcune opzioni per limitare i parametri inline ala :int .

Dove potrebbero questi schemi fallire e come potrebbero essere risolti?

    
posta mpen 13.12.2013 - 07:29
fonte

2 risposte

2

Ho usato ASP.NET MVC per anni. Ultimamente ho fatto ricerche su Rails e Django per vedere se hanno qualcosa in più da offrire. Ho letto la parte di routing della loro documentazione, ma non ho ancora creato app reali, quindi non sono un esperto. Non ho esperienza con Backbone, quindi lo lascio fuori.

In breve, Rails ha il più potente sistema di routing dei tre, Django ha il più debole e ASP.NET MVC è da qualche parte tra.

Tutti hanno:
 - percorsi con nome
 - caratteri jolly (in ASP.NET MVC solo l'ultimo parametro)
 - dati extra (passa alcuni valori che non fanno parte del percorso)
 - restrizioni regex
 - aiutanti per creare URL
 - una sorta di prefisso del percorso (spazio dei nomi / area)

Ruby on Rails e ASP.NET MVC hanno:
 - routing generico (una rotta, più controllori / azioni)
 - valori predefiniti
 - vincoli di codice

Ruby on Rails ha:
 - routing delle risorse
 - potente reindirizzamento

Esempio di vincolo regex in Ruby on Rails (l'ID deve essere un numero)

get ':controller/:id/:action', constraints: {id: /^\d+/}

Esempio di vincolo di codice in ASP.NET MVC (verifica che {year}/{month}/{day} formi una data valida)

routes.MapRoute("date", "{year}/{month}/{day}", 
          new { controller = "Test", action = "Date" }, 
          new { year = @"\d{4}", month = @"\d{2}", day = @"\d{2}", date = new DateConstraint() }); 

// -----
public class DateConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        try
        {
            var year = int.Parse(values["year"] as string);
            var month = int.Parse(values["month"] as string);
            var day = int.Parse(values["day"] as string);
            var date = new DateTime(year, month, day);
            return true;
        }
        catch 
        {
            return false;
        }
    }
}

Esempio di reindirizzamento in Ruby on Rails

get '/stories/:name', to: redirect {|params, req| "/posts/#{params[:name].pluralize}" }
    
risposta data 21.12.2013 - 01:10
fonte
0

Che ne dici di manipolare le rotte usando le funzioni e i condizionali di Angular.js e js?   link

    
risposta data 19.12.2013 - 20:00
fonte

Leggi altre domande sui tag