2009-03-25 5 views
0

Ich habe eine Ressource mit einer URL, die sowohl Menschen als auch Maschinen sollten lesen können:Der beste Weg, um sich für eine XML- oder HTML-Antwort zu entscheiden?

http://example.com/foo-collection/foo001

Was ist der beste Weg zwischen menschlichen Browsern und Maschinen, und kehrt entweder HTML oder eine domäne zu unterscheiden spezifische XML-Antwort?

(1) Das Akzeptieren Feld in der Anfrage?

(2) Ein zusätzliches Bit der URL? zB:

http://example.com/foo-collection/foo001 -> liefert HTML
http://example.com/foo-collection/foo001?xml -> zurückgibt, äh, XML

Ich möchte keine Maschinen Lesen der Ressource verpflichten, HTML (oder XHTML für diese Angelegenheit) zu analysieren. Maschinen wie der Googlebot sollten die HTML-Antwort erhalten.

Es ist vernünftig anzunehmen, dass ich die Maschinenleser kontrolliere.

Antwort

0

Ich würde sagen, das Hinzufügen eines Query String Parameters ist Ihre beste Wette. Die einzige Möglichkeit, automatisch zu erkennen, ob es sich bei Ihrem Client um einen Browser (Mensch) oder eine Anwendung handelt, wäre das Lesen der User-Agent-Zeichenfolge aus der HTTP-Anforderung. Aber dies kann von jeder Anwendung leicht eingestellt werden, um einen Browser nachzuahmen, Sie können nicht garantieren, dass dies funktioniert.

7

Wenn dies unter Ihrer Kontrolle, anstatt einen Abfrageparameter hinzugefügt, warum nicht eine Dateierweiterung hinzufügen:

http://example.com/foo-collection/foo001.html - return HTML 
http://example.com/foo-collection/foo001.xml - return XML 

Abgesehen von allem anderen, das heißt, wenn jemand es mit wget holt oder speichert sie von ihrem Browser Es wird einen passenden Dateinamen ohne viel Aufwand haben.

3

Meine Präferenz ist es, einen erstklassigen Teil der URI zu machen. Dies ist umstritten, da es in gewisser Hinsicht mehrere URIs für dieselbe Ressource gibt. Und ist "Format" wirklich Teil der URI?

http://example.com/foo-collection/html/foo001 
http://example.com/foo-collection/xml/foo001 

Diese sind sehr leicht befassen sich mit in einem Web-Framework, das URI die Anforderung an die richtige Anwendung zu lenken Parsen hat.

3

Wenn dies in der Tat die gleiche Ressource mit zwei verschiedenen Darstellungen ist, lädt das HTTP Sie dazu ein, the Accept-header zu verwenden, wie Sie vorschlagen. Dies ist wahrscheinlich eine sehr zuverlässige Möglichkeit, zwischen den zwei verschiedenen Szenarien zu unterscheiden. Sie können sicher sein, dass Benutzeragenten (einschließlich Suchmaschinen-Spider) den Accept-Header ordnungsgemäß senden.

Über die Maschinenagenten, die Sie XML geben; Sind sie unter Ihrer Kontrolle? In diesem Fall können Sie doppelt sicher sein, dass Accept funktioniert. Wenn sie diesen Header nicht richtig festlegen, können Sie XML als Standard angeben. Benutzeragenten legen die Kopfzeile richtig fest.

Ich würde versuchen, den Akzeptieren heder für diese verwenden, denn das ist genau, was die Accept-Header für da ist.

Das Problem mit zwei verschiedenen URLs ist, dass nicht automatisch ersichtlich ist, dass diese beiden die gleiche zugrunde liegende Ressource darstellen. Dies kann schlecht sein, wenn ein Benutzer eine URL in einem Programm findet, das HTML rendert, und in die andere, die XML benötigt.An dieser Stelle könnte ein intelligenter Benutzer wahrscheinlich die URL entsprechend ändern, aber dies ist nur eine Fehlerquelle, die Sie nicht benötigen.

+0

Da jedes Programm, das XML benötigt, ein Programm ist, das ich kontrolliere, kann es nicht immer eine eingefügte URL ändern? (Ich bin ein bisschen ein Verteidiger des Teufels - ich mag den Klang dieses Schemas). –

+0

Sicher, Sie könnten immer auf zusätzliche Konventionen, aber das wäre immer "Johns Sonderangebot". Mit dem Accept-Header kommunizieren Sie eindeutig, dass es sich um eine Ressource handelt, und Sie unterscheiden nach dem einzigen relevanten Kriterium - welches Format benötigen Sie zu einem bestimmten Zeitpunkt? –

Verwandte Themen