web-dev-qa-db-fra.com

API endpoint POST vs obtenir

Aidez-moi à régler une question interne.

Nous avons un point de terminaison que nous sommes tous d'accord devrait être un get, car tout ce qu'il fait est d'appeler un processus stocké et de retourner un ensemble de données. Cependant, il existe un ensemble de filtres que nous devons passer au point final. Vous trouverez ci-dessous un exemple de ce que les chiffres peuvent ressembler si toutes les options de filtrage sont passées:

{
    "DistributorCode":"6065",
    "Model":"123-xyz",
    "Serial":"654654065",
    "CurrentSMR":"11350.47",
    "SoldbyDistributor":"",
    "ServiceDistributor":"",
    "LatestSMRDate":"02/12/2020",
    "Coverage":"",
    "Customer":"",
    "CoverageExpirayDate":"",
    "SortBy":{
        "name" :"serial",
        "order":"asc"
    },
    "select":["eh","wt","fc"]
} 

Nous pourrions simplement passer à cette chaîne JSON en tant que paramètre QueryString dans l'appel de get, ou nous pourrions avoir chacun d'eux leur propre paramètre (bien que Sortby puisse devenir délicat).

Mais certains craignent que cela rendrait l'URL trop longtemps et nous risquerons de courir dans max query string length les erreurs. Donc, ils veulent faire l'appel A POST à la place. Si c'était un POST Appel, il faudrait alors un objet dans le corps et au moins un paramètre QS (& code =) qui n'est pas négociable (il doit être là.)

Nous avons donc deux options (que je peux penser):

  1. Faites-en un appel avec une URL potentiellement longue due aux paramètres.

    1a) Chaque filtre est son propre paramètre

    1b) La liste des filtres est une chaîne JSON de son propre paramètre

  2. Faites-le un POST appel qui nécessite des paramètres QS et un objet JSON dans le corps

Que feriez-vous et pourquoi?

Merci!

10
Casey Crookston

Faites juste un get avec des paramètres normaux. Vous n'êtes nulle part près de la limite. Vous voudrez peut-être faire une petite fonction d'assistance qui peut prendre un objet arbitraire et la transformer en une chaîne de requête.

Le problème avec 1b il est difficile de déboguer (il suffit de changer un paramètre dans votre débogueur Web devient une corvée). Les journaux aussi seront masqués. Vous perdez la possibilité de filtrer le journal d'accès pour toutes les instances où le paramètrex = y, etc.

Le problème avec 2 est vous manque sur des caractéristiques utiles telles que la mise en cache, etc.

Mettez aussi avec le corps est un hardal Hack. Ne fais pas ça

Également en ce qui concerne le tableau dans votre exemple. Les chaînes de requête prennent en charge le même paramètre plusieurs fois pour que vous puissiez faire? SELECT = EH & SELECT = WT & SELECT = FC

8
Esben Skov Pedersen

Il suffit de faire un POST avec un corps. Vous avez un tableau sans bornes "select":["eh","wt","fc"] qui va être une douleur à Serialise en tant que paramètres de chaîne de requête et peut éventuellement dépasser la restriction de la longueur de l'URL.

Je vous recommande également de supprimer votre SPROC, ayant une méthode plus simple qui a renvoyé plus d'objets et déplacer le filtrage sur le client.

Cela prendra chargement de la base de données et faire une interface utilisateur plus rapide

Vérifiez également CoverageExpirayDate

2
Ewan

Dans ce cas, souvent les deux possibilités sont utilisées:

  • Créez un point de terminaison GET Passer vos conditions de requête dans la chaîne de requête (comme suggestion 1a). Vous pouvez également passer des paramètres de tri facilement dans la chaîne de requête.

Vous ne devez transmettre que les paramètres de requête qui ne sont pas vides ou qui sont différents des valeurs par défaut.

  • Si vous pensez que la chaîne de requête peut devenir trop longue (même si il n'y a pas de limite de spécification , les serveurs auront généralement une limite), vous pouvez créer un fichier POSTO . Vous passez ensuite la requête et les conditions de tri dans le corps, utilisez de préférence le format JSON.

Dans votre exemple, la chaîne de requête ne doit pas être trop longue. Donc, ici le point d'endurance Get est suffisant.

2
bernie