YARP Docsv2.3
Τεκμηρίωση/Δρομολόγηση/Δρομολόγηση βάσει παραμέτρων ερωτήματος

Δρομολόγηση βάσει παραμέτρων ερωτήματος

Οι διαδρομές του διακομιστή μεσολάβησης που ορίζονται στη διαμόρφωση ή μέσω κώδικα πρέπει να περιλαμβάνουν τουλάχιστον ένα path ή έναν host προς αντιστοίχιση

Δρομολόγηση βάσει παραμέτρων ερωτήματος στο YARP

Οι διαδρομές του διακομιστή μεσολάβησης που ορίζονται στη διαμόρφωση ή μέσω κώδικα πρέπει να περιλαμβάνουν τουλάχιστον ένα path ή έναν host προς αντιστοίχιση. Πέρα από αυτά, μια διαδρομή μπορεί επίσης να ορίσει μία ή περισσότερες παραμέτρους ερωτήματος που πρέπει να είναι παρούσες στο αίτημα.

Προτεραιότητα

Η προεπιλεγμένη σειρά προτεραιότητας αντιστοίχισης διαδρομών είναι 1) path, 2) μέθοδος, 3) host, 4) κεφαλίδες, 5) παράμετροι ερωτήματος. Αυτό σημαίνει ότι μια διαδρομή που ορίζει μεθόδους αλλά όχι παραμέτρους ερωτήματος θα αντιστοιχιστεί πριν από μια διαδρομή που ορίζει παραμέτρους ερωτήματος αλλά όχι μεθόδους. Αυτό μπορεί να παρακαμφθεί ορίζοντας την ιδιότητα Order σε μια διαδρομή.

Διαμόρφωση

Οι παράμετροι ερωτήματος ορίζονται στην ενότητα Match μιας διαδρομής μεσολάβησης.

Αν έχουν οριστεί πολλαπλοί κανόνες παραμέτρων ερωτήματος σε μια διαδρομή, τότε όλοι πρέπει να ταιριάξουν για να επιλεγεί η διαδρομή. Λογική OR πρέπει να υλοποιηθεί είτε μέσα σε έναν κανόνα παραμέτρου ερωτήματος είτε ως ξεχωριστές διαδρομές.

Διαμόρφωση:

JSON"Routes": {
   "route1" : {
      "ClusterId": "cluster1",
      "Match": {
         "Path": "{**catch-all}",
         "QueryParameters": [
             {
                "Name": "queryparam1",
                "Values": [ "value1" ],
                "Mode": "Exact"
             }
         ]
      }
   },
   "route2" : {
      "ClusterId": "cluster1",
      "Match": {
         "Path": "{**catch-all}",
         "QueryParameters": [
             {
                          "Name": "queryparam2",
                          "Values": [ "1prefix", "2prefix" ],
                          "Mode": "Prefix"
                      }
                   ]
}
},
"route3" : {
"ClusterId": "cluster1",
"Match": {
                   "Path": "{**catch-all}",
                   "QueryParameters": [
                      {
                          "Name": "queryparam3",
                          "Mode": "Exists"
                      }
                   ]
}
},
"route4" : {
"ClusterId": "cluster1",
"Match": {
                   "Path": "{**catch-all}",
                   "QueryParameters": [
                      {
                          "Name": "queryparam4",
                          "Values": [ "value1", "value2" ],
                          "Mode": "Exact"
                      },
                      {
                          "Name": "queryparam5",
                          "Mode": "Exists"
                      }
                   ]
}
},
"route5" : {
"ClusterId": "cluster1",
"Match": {
                   "Path": "{**catch-all}",
                   "QueryParameters": [
                      {
                          "Name": "queryparam5",
                          "Values": [ "value1", "value2" ],
                          "Mode": "Contains"
                      },
                      {
                          "Name": "queryparam6",
                          "Mode": "Exists"
                      }
                   ]
}
},
"route6" : {
"ClusterId": "cluster1",
       "Match": {
                   "Path": "{**catch-all}",
                   "QueryParameters": [
                      {
                          "Name": "queryparam6",
                          "Values": [ "value1", "value2" ],
                          "Mode": "NotContains"
                      },
                      {
                          "Name": "queryparam7",
                          "Mode": "Exists"
                      }
                   ]
       }
    }
}
Code:
C#var routes = new[]
{
      new RouteConfig()
      {
             RouteId = "route1",
             ClusterId = "cluster1",
             Match = new RouteMatch
             {
                   Path = "{**catch-all}",
                   QueryParameters = new[]
                   {
                          new RouteQueryParameter()
                          {
                                 Name = "QueryParam1",
                                 Values = new[] { "value1" },
                                 Mode = QueryParameterMatchMode.Exact
                          }
                   }
             }
      },
      new RouteConfig()
      {
             RouteId = "route2",
             ClusterId = "cluster1",
             Match = new RouteMatch
             {
                   Path = "{**catch-all}",
                   QueryParameters = new[]
                   {
                          new RouteQueryParameter()
                          {
                                 Name = "QueryParam2",
                             Values = new[] { "1prefix", "2prefix" },
                             Mode = QueryParameterMatchMode.Prefix
                         }
                      }
                   }
},
new RouteConfig()
{
                   RouteId = "route3",
                   ClusterId = "cluster1",
                   Match = new RouteMatch
                   {
                      Path = "{**catch-all}",
                      QueryParameters = new[]
                      {
                         new RouteQueryParameter()
                         {
                             Name = "QueryParam3",
                             Mode = QueryParameterMatchMode.Exists
                         }
                      }
                   }
},
new RouteConfig()
{
                   RouteId = "route4",
                   ClusterId = "cluster1",
                   Match = new RouteMatch
                   {
                      Path = "{**catch-all}",
                      QueryParameters = new[]
                      {
                      new RouteQueryParameter()
                         {
                             Name = "QueryParam4",
                             Values = new[] { "value1", "value2" },
                             Mode = QueryParameterMatchMode.Exact
                         },
                         new RouteQueryParameter()
                         {
                             Name = "QueryParam5",
                             Mode = QueryParameterMatchMode.Exists
                         }
                      }
                   }
},
new RouteConfig()
{
                   RouteId = "route5",
                   ClusterId = "cluster1",
                   Match = new RouteMatch
                   {
                      Path = "{**catch-all}",
                      QueryParameters = new[]
                      {
                         new RouteQueryParameter()
                         {
                            Name = "QueryParam5",
                            Values = new[] { "value1", "value2" },
                            Mode = QueryParameterMatchMode.Contains
                         }
                      }
                   }
    },
    new RouteConfig()
    {
                   RouteId = "route6",
                   ClusterId = "cluster1",
                   Match = new RouteMatch
                   {
                      Path = "{**catch-all}",
                      QueryParameters = new[]
                      {
                         new RouteQueryParameter()
                         {
                            Name = "QueryParam6",
                            Values = new[] { "value1", "value2" },
                            Mode = QueryParameterMatchMode.NotContains
                         }
                      }
                   }
    }
};

Σύμβαση

Το RouteQueryParameter ορίζει τη σύμβαση κώδικα και αντιστοιχίζεται από τη διαμόρφωση.

Name

Το όνομα της παραμέτρου ερωτήματος που αναζητείται στο αίτημα. Απαιτείται μια μη κενή τιμή. Αυτό το πεδίο δεν κάνει διάκριση πεζών-κεφαλαίων.

Values

Μια λίστα πιθανών τιμών προς αναζήτηση. Η παράμετρος ερωτήματος πρέπει να ταιριάζει με τουλάχιστον μία από αυτές τις τιμές, σύμφωνα με το καθορισμένο Mode, με εξαίρεση το 'NotContains'. Απαιτείται τουλάχιστον μία τιμή, εκτός αν το Mode έχει οριστεί σε Exists.

Mode

Το QueryParameterMatchMode καθορίζει τον τρόπο αντιστοίχισης της τιμής/τιμών με την παράμετρο

ερωτήματος του αιτήματος. Η προεπιλογή είναι Exact.

Exact - Η παράμετρος ερωτήματος πρέπει να ταιριάζει εξ ολοκλήρου, ανάλογα με την τιμή του IsCaseSensitive. Υποστηρίζονται μόνο μεμονωμένες παράμετροι ερωτήματος. Αν υπάρχουν πολλαπλές παράμετροι ερωτήματος με το ίδιο όνομα, η αντιστοίχιση αποτυγχάνει. Prefix - Η παράμετρος ερωτήματος πρέπει να ταιριάζει βάσει προθέματος, ανάλογα με την τιμή του IsCaseSensitive. Υποστηρίζονται μόνο μεμονωμένες παράμετροι ερωτήματος. Αν υπάρχουν πολλαπλές παράμετροι ερωτήματος με το ίδιο όνομα, η αντιστοίχιση αποτυγχάνει. Exists - Η παράμετρος ερωτήματος πρέπει να υπάρχει και να περιέχει οποιαδήποτε μη κενή τιμή. Contains - Η παράμετρος ερωτήματος πρέπει να περιέχει την τιμή για να υπάρξει αντιστοίχιση, ανάλογα με την τιμή του IsCaseSensitive. Υποστηρίζονται μόνο μεμονωμένες παράμετροι ερωτήματος. Αν υπάρχουν πολλαπλές παράμετροι ερωτήματος με το ίδιο όνομα, η αντιστοίχιση αποτυγχάνει. NotContains - Η παράμετρος ερωτήματος δεν πρέπει να περιέχει καμία από τις τιμές αντιστοίχισης, ανάλογα με την τιμή του IsCaseSensitive. Υποστηρίζονται μόνο μεμονωμένες παράμετροι ερωτήματος. Αν υπάρχουν πολλαπλές παράμετροι ερωτήματος με το ίδιο όνομα, η αντιστοίχιση αποτυγχάνει.

IsCaseSensitive

Υποδεικνύει αν η αντιστοίχιση τιμών πρέπει να γίνεται με διάκριση ή χωρίς διάκριση πεζών-κεφαλαίων. Η προεπιλογή είναι false, δηλαδή χωρίς διάκριση.

Encoding

Η συμβολοσειρά ερωτήματος του αιτήματος αναλύεται και αποκωδικοποιείται πριν από την αντιστοίχιση με τους κανόνες της διαδρομής.

"route8" : { "ClusterId": "cluster1", "Match": { "Path": "{**catch-all}", "QueryParameters": [ { "Name": "queryparam8", "Values": [ "another value" ], "Mode": "Exact" } ] }

Αντιστοιχίζεται σε

?queryparam8=another%20value

ή

?queryparam8=another+value

Παραδείγματα

Αυτά τα παραδείγματα χρησιμοποιούν τη διαμόρφωση που ορίστηκε παραπάνω.

Σενάριο 1 - Ακριβής αντιστοίχιση παραμέτρου ερωτήματος

Ένα αίτημα με την ακόλουθη παράμετρο ερωτήματος θα ταιριάξει με το route1.

?QueryParam1=Value1

Πολλαπλές παράμετροι ερωτήματος με το ίδιο όνομα δεν υποστηρίζονται προς το παρόν και δεν θα ταιριάξουν.

?QueryParam1=Value1&QueryParam1=Value2

Σενάριο 2 - Πολλαπλές τιμές

Το route2 όρισε πολλαπλές τιμές προς αναζήτηση σε μια παράμετρο ερωτήματος ("1prefix", "2prefix"), οποιαδήποτε από τις τιμές είναι αποδεκτή. Όρισε επίσης το Mode ως Prefix, οπότε οποιαδήποτε παράμετρος ερωτήματος ξεκινά με αυτές τις τιμές είναι αποδεκτή. Οποιαδήποτε από τις ακόλουθες παραμέτρους ερωτήματος θα ταιριάξει με το route2.

?QueryParam2=1prefix

?QueryParam2=2prefix

?QueryParam2=1prefix-extra

?QueryParam2=2prefix-extra

Πολλαπλές παράμετροι ερωτήματος με το ίδιο όνομα δεν υποστηρίζονται προς το παρόν και δεν θα ταιριάξουν.

?QueryParam2=2prefix&QueryParam2=1prefix

Σενάριο 3 - Exists

Το route3 απαιτεί μόνο η παράμετρος ερωτήματος "QueryParam3" να υπάρχει με οποιαδήποτε μη κενή τιμή. Το ακόλουθο είναι ένα παράδειγμα που θα ταιριάξει με το route3.

?QueryParam3=value

Μια κενή παράμετρος ερωτήματος δεν θα ταιριάξει.

?QueryParam3 ?QueryParam3=

Αυτή η λειτουργία υποστηρίζει παραμέτρους ερωτήματος με πολλαπλές τιμές και πολλαπλές παραμέτρους ερωτήματος με το ίδιο όνομα, αφού δεν εξετάζει το περιεχόμενο της παραμέτρου ερωτήματος. Το ακόλουθο θα ταιριάξει.

?QueryParam3=value1&QueryParam3=value2

Σενάριο 4 - Πολλαπλές παράμετροι ερωτήματος

Το route4 απαιτεί τόσο το QueryParam4 όσο και το QueryParam5, καθένα να ταιριάζει σύμφωνα με το καθορισμένο Mode. Οι ακόλουθες παράμετροι ερωτήματος θα ταιριάξουν με το route4:

?QueryParam4=value1&QueryParam5=AnyValue

?QueryParam4=value2&QueryParam5=AnyValue

Οι παρακάτω δεν θα ταιριάξουν με το route4 επειδή τους λείπει μία από τις απαιτούμενες παραμέτρους ερωτήματος:

?QueryParam4=value2

?QueryParam5=AnyValue Σημείωση: Ο συγγραφέας δημιούργησε αυτό το άρθρο με τη βοήθεια AI. Μάθετε περισσότερα

Προσαρμογή από Microsoft Learn , με άδεια CC BY 4.0 .