2012-06-22 7 views
10

Połączyłem interfejs API, który odpowiada na żądanie POST, umieszczając zawartość nowego zasobu w treści odpowiedzi oraz adres URL nowego zasobu w nagłówku odpowiedzi HTTP lokalizacji.Reakcja REST - czy powinienem umieścić adres URL nowego zasobu w nagłówku, treści lub obu?

Zamówienie próbki:

POST /api/v1/widgets HTTP/1.1 
Content-type: application/json; 
Accept: application/json; 

{ 
    "name": "[email protected]", 
    "price": "10", 
} 

odpowiedź próbki:

HTTP 201 Created 
Location: http://example.com/api/v1/widgets/123456 

{ 
    'widget': 
    { 
     'id': "123456", 
     'created': "2012-06-22T12:43:37+0100", 
     'name': "[email protected]", 
     'price': "10", 
    }, 
} 

Ktoś podniósł kwestię, że adres URL powinien być również w ciele odpowiedzi. Czy jest na to najlepsza praktyka?

+0

(Zapraszam do zabicia tego, jeśli jest zbyt subiektywny - nie jestem pewien, czy to narusza ducha SO, czy nie) –

Odpowiedz

6

Umieściłbym go w nagłówku (jako Lokalizacja: http://blah.blah.com/blah). Możesz umieścić to również w swoim ciele, jeśli chcesz (w dowolnym odpowiednim formacie, który wysyłasz), a to nie byłoby niewłaściwe.

Numer atompub REST API jest zazwyczaj dobrym odnośnikiem dobrego interfejsu API REST. Umieścili to w obu.

HTTP/1.1 201 Created 
Date: Fri, 7 Oct 2005 17:17:11 GMT 
Content-Length: nnn 
Content-Type: application/atom+xml;type=entry;charset="utf-8" 
Location: http://example.org/edit/first-post.atom 
ETag: "c180de84f991g8" 

<?xml version="1.0"?> 
<entry xmlns="http://www.w3.org/2005/Atom"> 
    <title>Atom-Powered Robots Run Amok</title> 
    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> 
    <updated>2003-12-13T18:30:02Z</updated> 
    <author><name>John Doe</name></author> 
    <content>Some text.</content> 
    <link rel="edit" 
     href="http://example.org/edit/first-post.atom"/> 
</entry> 
+0

Dzięki za odpowiedź - posiadanie testu porównawczego, takiego jak atompub, jest właśnie tym, czego szukałem. –

+2

Tak, ale zauważ, że URI w przykładowym zwróconym ciele z AtomPub pokazanego powyżej jest w rzeczywistości linkiem, który mówi odbiorcy, jakiego URI użyć, jeśli chce "edytować" zasób (zgodnie z zasadą HATEOAS). Nie jest to, ściśle rzecz biorąc, koniecznie to samo, co URI samego zasobu (to znaczy niekoniecznie taki sam jak wartość w nagłówku Location :, który mówi, gdzie można zdobyć zasoby). Zdarza się, że w tym przykładzie identyfikator URI do pobrania zasobu i ten używany do edycji zasobu jest taki sam. –

+0

Dobrze, dobrze wiedzieć. Przyjąłem, że zawsze będą takie same. PO powinien wziąć to pod uwagę. – smcg

7

Jest powód, dla nie oddanie lokalizację (URL) nowo utworzonego zasobu) w organizmie: adres URL jest metadane potrzebne do interakcji wiadomości wśród konsumentów i usług serwisowych, to nie jest „danych biznesowych” . Istnieje wzorzec projektowania SOA o nazwie "Messaging Metadata", który sugeruje, że adresy URL, poświadczenia bezpieczeństwa, identyfikatory korelacji, identyfikatory transakcji i inne dane kontekstowe wiadomości i kompozycji powinny być umieszczone w nagłówkach, a nie w treści wiadomości. Rzeczywiście, http już zapewnia standardową lokalizację nagłówka.

OTOH, jeśli twoja usługa REST używa HATEOAS, odpowiedź może zawierać jeden lub więcej adresów URL, które są bezpośrednimi linkami do operacji, które chcesz zaoferować konsumentom do dynamicznego wiązania i wywoływania.

Uważam, że najgorszym rozwiązaniem jest posiadanie adresu URL w nagłówku i treści. Nadmiarowe dane są w dłuższej perspektywie podatne na niespójności.

Powiązane problemy