apihttpstripe-paymentsstandardshttp-verbs

Why does Stripe use the Post method for updating resources


According to the RFC Put is used to update an existing resource.

But, the Stripe API uses Post to update objects. Why is this?

For example, in the Stripe Node Library

  update: stripeMethod({
    method: 'POST',
    path: '{id}',
  }),

the update method calls POST

I understand that there is no Patch method since the entire resource must be sent on every call, by why is the Put HTTP Verb not used in that case?

(Unlike this example from an SO question about the Facebook API, the resource is identifiable by a single ID that is passed in the URL) eg the URL is simply /v1/customers/:id

Stripe Customer Update API Docs


Solution

  • Interesting question! From your link:

    The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. [emphasis mine]

    This means you must PUT the entire resource (changes and and non-changes alike). Very few APIs are designed that way.

    From the spec for POST:

    The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. POST is designed to allow a uniform method to cover the following functions:

    • Annotation of existing resources;

    Many/most APIs have adopted POST as the way to update objects.

    Some additional thoughts here: https://stackoverflow.com/a/25909372/379538