Metodi API RESTful; TESTA E OPZIONI


94

Sto scrivendo un modulo API RESTful per un'applicazione in PHP e sono un po 'confuso sui verbi HEADe OPTIONS.

  • OPTIONS  Utilizzato per recuperare i verbi HTTP disponibili per una determinata risorsa?
  • HEAD Utilizzato per determinare se una determinata risorsa è disponibile?

Se qualcuno potesse chiarire * questi verbi, sarebbe molto apprezzato.

* Il chiarimento riguardava le architetture API RESTful che ripropongono i verbi HTTP. Da allora sono giunto alla conclusione che entrambi HEADe nonOPTIONS dovrebbero essere riutilizzati, e invece si comportano in modo prevedibile come dovrebbe fare qualsiasi applicazione HTTP. Oh, come cresciamo in 2 anni.


probabilmente perché le specifiche HTTP sono prontamente disponibili sul web.
Gordon

@ Gordon - Abbastanza giusto e, sebbene comprenda che i servizi API RESTful siano destinati a trarre vantaggio dalle specifiche HTTP esistenti, immagino di aver presunto una deviazione parziale per i dettagli di implementazione. Colpa mia.
Dan Lugg

15
Le specifiche per quasi tutto sono prontamente disponibili sul web. Le domande su SO servono per chiarimenti oltre la documentazione. Questo si adatta a questo.
Andrew Ensley,

Risposte:


60

Secondo: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

9.2 OPZIONI

Il metodo OPTIONS rappresenta una richiesta di informazioni sulle opzioni di comunicazione disponibili sulla catena di richiesta / risposta identificata dalla Request-URI. Questo metodo consente al client di determinare le opzioni e / o i requisiti associati a una risorsa o le capacità di un server, senza implicare un'azione di risorsa o avviare un recupero di risorsa.

Le risposte a questo metodo non sono memorizzabili nella cache.

Se la richiesta OPTIONS include un corpo-entità (come indicato dalla presenza di Content-Length o Transfer-Encoding), il tipo di supporto DEVE essere indicato da un campo Content-Type. Sebbene questa specifica non definisca alcun utilizzo per tale corpo, le estensioni future a HTTP potrebbero utilizzare il corpo OPTIONS per eseguire query più dettagliate sul server. Un server che non supporta tale estensione PU scartare il corpo della richiesta.

Se l'URI della richiesta è un asterisco ("*"), la richiesta OPTIONS deve essere applicata al server in generale piuttosto che a una risorsa specifica. Poiché le opzioni di comunicazione di un server dipendono tipicamente dalla risorsa, la richiesta "*" è utile solo come metodo di tipo "ping" o "no-op"; non fa altro che consentire al client di testare le capacità del server. Ad esempio, questo può essere utilizzato per testare un proxy per la conformità HTTP / 1.1 (o la sua mancanza).

Se l'URI della richiesta non è un asterisco, la richiesta OPTIONS si applica solo alle opzioni disponibili durante la comunicazione con quella risorsa.

Una risposta 200 DOVREBBE includere tutti i campi di intestazione che indicano caratteristiche opzionali implementate dal server e applicabili a quella risorsa (ad esempio, Consenti), possibilmente includendo estensioni non definite da questa specifica. Il corpo di risposta, se presente, DOVREBBE includere anche informazioni sulle opzioni di comunicazione. Il formato per tale corpo non è definito da questa specifica, ma potrebbe essere definito da future estensioni a HTTP. La negoziazione del contenuto PU essere utilizzata per selezionare il formato di risposta appropriato. Se il corpo della risposta non è incluso, la risposta DEVE includere un campo Content-Length con un valore di campo "0".

Il campo dell'intestazione della richiesta Max-Forwards PU essere utilizzato per indirizzare un proxy specifico nella catena di richieste. Quando un proxy riceve una richiesta OPTIONS su un absoluteURI per il quale è consentito l'inoltro della richiesta, il proxy DEVE verificare la presenza di un campo Max-Forward. Se il valore del campo Max-Forward è zero ("0"), il proxy NON DEVE inoltrare il messaggio; invece, il proxy DOVREBBE rispondere con le proprie opzioni di comunicazione. Se il valore del campo Max-Forwards è un numero intero maggiore di zero, il proxy DEVE decrementare il valore del campo quando inoltra la richiesta. Se nella richiesta non è presente alcun campo Max-Forward, la richiesta inoltrata NON DEVE includere un campo Max-Forward.

9.4 TESTA

Il metodo HEAD è identico a GET tranne per il fatto che il server NON DEVE restituire il corpo del messaggio nella risposta. Le metainformazioni contenute nelle intestazioni HTTP in risposta a una richiesta HEAD DOVREBBE essere identiche alle informazioni inviate in risposta a una richiesta GET. Questo metodo può essere utilizzato per ottenere metainformazioni sull'entità implicita nella richiesta senza trasferire l'ente-corpo stesso. Questo metodo viene spesso utilizzato per testare la validità, l'accessibilità e le modifiche recenti dei collegamenti ipertestuali.

La risposta a una richiesta HEAD PU essere memorizzabile nella cache nel senso che le informazioni contenute nella risposta POSSONO essere utilizzate per aggiornare un'entità precedentemente memorizzata nella cache da quella risorsa. Se i nuovi valori del campo indicano che l'entità memorizzata nella cache è diversa dall'entità corrente (come sarebbe indicato da una modifica in Content-Length, Content-MD5, ETag o Last-Modified), la cache DEVE trattare la voce della cache come obsoleta.


1
Grazie @sdolgy per il preventivo completo; tuttavia, in pratica ( dovrebbero ) molti moduli API RESTful di successo aderiscono a tutti questi standard HTTP, o esiste una risposta debole accettabile per queste operazioni? Non per pigrizia, ma semplicemente per curiosità; Probabilmente implementerò tutto il necessario per aderire.
Dan Lugg

2
se stai costruendo il tuo, cosa che presumo tu sia, dovresti cercare di mantenere un certo allineamento con gli standard documentati per semplificarti la vita ... e quella delle persone che consumano la tua API ... non seguire Microsoft. Le RFC sono una buona cosa con cui allinearsi
sdolgy

Grazie @sdolgy. Dopo aver informato il documento collegato, ho notato alla fine il CONNECTverbo. Sarebbe una scelta sbagliata utilizzare quel metodo per l'autenticazione RESTful?
Dan Lugg

Non sono sicuro che fosse lo scopo previsto "Questa specifica riserva il nome del metodo CONNECT per l'uso con un proxy che può passare dinamicamente a essere un tunnel (es. Tunneling SSL [44])." ... potrebbe essere utile porre un'altra domanda su uno dei siti stackexchange.com a riguardo ...
sdolgy

2
@DanLugg La tua applicazione potrebbe non essere utilizzata CONNECTin un modo di tunneling SSL, ma immagina cosa succederebbe se un consumatore della tua applicazione avesse un proxy implementato CONNECTnel modo in cui è stato specificato nella RFC, le richieste potrebbero non essere trasmesse al tuo applicazione.
Steve Buzonas

83

OPTIONSil metodo restituisce informazioni sull'API (metodi / tipo di contenuto)

HEADil metodo restituisce informazioni sulla risorsa (versione / lunghezza / tipo)

Risposta del server

OPZIONI

HTTP/1.1 200 OK
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:24:43 GMT
Content-Length: 0

TESTA

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:12:29 GMT
ETag: "780602-4f6-4db31b2978ec0"
Last-Modified: Thu, 25 Apr 2013 16:13:23 GMT
Content-Length: 1270
  • OPTIONS Identificare i metodi HTTP supportati da una risorsa, ad esempio possiamo CANCELLARLA o aggiornarla tramite un PUT?
  • HEADVerificare se una risorsa è cambiata. Ciò è utile quando si mantiene una versione cache di una risorsa
  • HEAD Recupero dei metadati sulla risorsa, ad esempio il tipo di supporto o le sue dimensioni, prima di effettuare un recupero possibilmente costoso
  • HEAD, OPTIONSVerificare se una risorsa esiste ed è accessibile. Ad esempio, convalida dei collegamenti inviati dagli utenti in un'applicazione

Ecco un articolo carino e conciso su come HEAD e OPTIONS si adattano all'architettura RESTful.


9
Ottima risposta, peccato che pagherà la penalità del ritardo alla festa. La risposta accettata con copia incollata non inizia nemmeno ad affrontare specificamente il posto di questi verbi in un'architettura RESTful.
Todd Menier

1
Il tuo collegamento è morto. Ecco la sua ultima istantanea: web.archive.org/web/20160528151316/https://…
kolobok

29

OPZIONI ti dice cose come "Quali metodi sono consentiti per questa risorsa".

HEAD ottiene l'intestazione HTTP che otterresti se facessi una richiesta GET, ma senza il corpo. Ciò consente al client di determinare le informazioni di memorizzazione nella cache, quale tipo di contenuto verrà restituito, quale codice di stato verrà restituito. La disponibilità è solo una piccola parte.


Grazie @Quentin; OPTIONSera quello che immaginavo, e tale implementazione sarà facile con il mio approccio esistente. Secondo la citazione RFC di sdolgy, OPTIONSnon definisce alcuno standard nel formato. Si presume che il formato della risposta sia lo stesso delle altre risposte? ( ad esempio; JSON, XML, ecc. )
Dan Lugg

@ Tomcat Citando la RFC: "La negoziazione del contenuto PU essere utilizzata per selezionare il formato di risposta appropriato." In altre parole: la risposta dovrebbe essere quella richiesta dalla richiesta nell'intestazione.
Gordon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.