Content Negotiation
ã³ã³ãã³ãã»ãã´ã·ã¨ã¼ã·ã§ã³ã«ã¤ãã¦ã
ã³ã³ãã³ãã»ãã´ã·ã¨ã¼ã·ã§ã³ã¨ã¯ï¼
HTTPã«ããè³æºæä¾ã®ä»çµã¿ã«ããã¦ããããåãåãå´ã¨ãªãå ¨ã¦ã®å©ç¨è ã¯å好çãåãã§ã¯ãªãããå ¨ã¦ã®UAãå ¨ã¦ã®æ å ±ãçããè§£æã表ç¾ã§ããããã§ã¯ãªããã¤ã¾ãæä¾è å´ã¯ãåãæã®å©ç¨è å´ã®è¦æ±ã«å¯¾å¿ããæãå©ç¨å¯è½ãªè¡¨ç¾ãã¦ã¼ã¶ã«ä¾çµ¦ããã®ãæã¾ããã
ã³ã³ãã³ãã»ãã´ã·ã¨ã¼ã·ã§ã³ã¨ã¯ãè¤æ°ã®ç°ãªãï¼ä¾ãã°ãè±èªã¨æ¥æ¬èªã¨ãã£ãç°ãªãè¨èªï¼è¡¨ç¾ãããæã«ããã«å¿ããæé©ãªè¡¨ç¾ãæä¾ããçºã®å¦çã®ä»çµã¿ã®ãã¨ã§ãHTTPã§ã¯ããµã¼ãé§ååãã´ã·ã¨ã¼ã·ã§ã³ã¨ã¨ã¼ã¸ã§ã³ãé§ååãã´ã·ã¨ã¼ã·ã§ã³ã®äºç¨®é¡ã®ã³ã³ãã³ãã»ãã´ã·ã¨ã¼ã·ã§ã³ãå¯è½ã§ããã
æ¨ä»ãä¸ççãªã¤ã³ã¿ã¼ãããã®ççºçãªæ®åã¨å ±ã«ãæ§ã ãªäººãæ§ã ãªå ´æããHTTPã«æ¥ç¶ããããã«ãªããå©ç¨è å´ã®ç°å¢ãå¤ç¨®å¤æ§ã¨ãªã£ããã¾ããæä¾ããå´ãæ å ±è³æºã®è¡¨ç¾ã®å½¢å¼ï¼HTMLãXHTMLãgzipãªã©ã®å§ç¸®ãªã©ï¼çã夿§åããä¾ãã°ãã³ã³ãã³ãã«ãã£ã¦ã¯UAå´ã§å¦çå¯è½ãªã¤ã³ã¿ããªã¿è¨èªï¼JavaScriptçï¼ãHTMLã«åãè¾¼ããã¨ã§OSããã©ã¦ã¶ã®ç¨®é¡ãã¾ããã®ãã¼ã¸ã§ã³ãªã©ãå¤å¥ãã¦ç°ãªã表ç¾ã¸ã¨å°ãå¦çï¼ã¯ã©ã¤ã¢ã³ãé§ååãã´ã·ã¨ã¼ã·ã§ã³ï¼ãè¡ã£ã¦ããå ´åãè¦åããããã
ã³ã³ãã³ããã´ã·ã¨ã¼ã·ã§ã³ã¯ã©ã¹
ã¯ã©ã¹ã®ä½æçµç·¯
æ¬ãµã¤ãã§ã¯ããµã¼ããµã¤ãXSLT夿ãè¡ãéã®å¤æçµæï¼åºåï¼ã®é¸æã« [RFC2616] ã§å®ç¾©ããã¦ããã³ã³ãã³ãã»ãã´ã·ã¨ã¼ã·ã§ã³ã¨ããä»çµã¿ãåãå ¥ãããã¨ãã®ã¯ã©ã¹ã使ãã¾ããã
ContentNegotiationã¯ã©ã¹
public class ContentNegotiation extends Objectæ§é
ã¡ã½ãã
PHP 5
public void addTypeMap(String uri [, String media_type [, String charset [, String language [, String qvalue [, String description]]]]])- ã¿ã¤ããããï¼ããªã¢ã³ãã®æ å ±ï¼ã®è¿½å ã
- 弿°
String uri- ãã¡ã¤ã«ã®URI
String media_type- ã¡ãã£ã¢ã¿ã¤ã [media-type]
- ã¡ãã£ã¢ã¿ã¤ãã '
text/html' ã®å ´åã®ã¿ã";" åºåãã§ã¡ãã£ã¢ã¿ã¤ãã®ãã¼ã¸ã§ã³ï¼levelï¼ãæå®å¯è½ String charset- æåã»ãã [charset]
String language- è¨èªã»ãã [language-tag]
String qvalue- åè³ªä¿æ° [qvalue]
- 0 ãã 1 ã¾ã§ã®æµ®åå°æ°ç¹ï¼å°æ°ç¹ä»¥ä¸ä¸æ¡ã¾ã§ï¼ã0 ã¯æå°å¤ã§ 1 ã¯æå¤§å¤
String description- ããªã¢ã³ãã説æããæç«
public void httpResponseHeader([Boolean $body])- HTTPã¬ã¹ãã³ã¹ããããéä¿¡ããã
- 弿°
Boolean $body- HTMLã³ã¼ãã®çæã®å¯å¦ã
httpResponseHeaderã¡ã½ããã¯ãè¿ãã¹ãè³æºï¼é©åãªããªã¢ã³ãï¼ãç¡ãã¨å¤æããå ´åã«ãâ406 (Not Acceptable) ã¹ãã¼ã¿ã¹ã³ã¼ãâãè¿ããå ¨ã¦ã®ããªã¢ã³ãã®ä¸è¦§ãæä¾ã§ãã¾ããã¾ãããã´ã·ã¨ã¼ã·ã§ã³å®è¡ä»¥åãªãã"300 Multiple Choices" ãéä¿¡ãã¾ãã
public Array negotiate([String Accept [, String Accept_Charset [, String Accept_Language]]])- ãã´ã·ã¨ã¼ã·ã§ã³ã«ããæé©ãªè¡¨ç¾ã®é¸æã
- 弿°
String Accept- Acceptãªã¯ã¨ã¹ãããããã£ã¼ã«ã
String Accept_Charset- Accept-Charsetãªã¯ã¨ã¹ãããããã£ã¼ã«ã
String Accept_Language- Accept-Languageãªã¯ã¨ã¹ãããããã£ã¼ã«ã
- 弿°ãæå®ãããã¨ãã§ãã¾ãããããã¯ãããã°ä½æ¥ãèæ ®ãã¦ã®ãã®ã§ããåä½ç¢ºèªã®éãªã©ã«å¼æ°ãæå®ããå ´åã«ã¯ã[RFC2616] Hypertext Transfer Protocol -- HTTP/1.1 ã®æ¸å¼ã§åå¤ãè¨å®ã§ãã¾ãã
- è¿ãå¤
- ãã´ã·ã¨ã¼ã·ã§ã³ã¢ã«ã´ãªãºã ã®å¦çã®çµæãæé©ãªããªã¢ã³ããããã°ãã®æ
å ±ãé
åã§ãä½ã鏿ãããªãã£ãå ´åã«ã¯
FALSEãè¿ãã¾ãã
PHP 4
public void addTypeMap(String uri [, String media_type [, String charset [, String language [, String qvalue [, String description]]]]])- ã¿ã¤ããããï¼ããªã¢ã³ãã®æ å ±ï¼ã®è¿½å ã
- 弿°
String uri- ãã¡ã¤ã«ã®URI
String media_type- ã¡ãã£ã¢ã¿ã¤ã [media-type]
String charset- æåã»ãã [charset]
String language- è¨èªã»ãã [language-tag]
String qvalue- åè³ªä¿æ° [qvalue] ï¼â»0 ãã 1 ã¾ã§ã®æµ®åå°æ°ç¹ï¼å°æ°ç¹ä»¥ä¸ä¸æ¡ã¾ã§ï¼ã0 ã¯æå°å¤ã§ 1 ã¯æå¤§å¤ï¼
String description- ããªã¢ã³ãã説æããæç«
public void httpResponseHeader([Boolean $status_code])- HTTPã¬ã¹ãã³ã¹ããããéä¿¡ããã
- 弿°
Boolean $status_code- ã¹ãã¼ã¿ã¹ã³ã¼ãè¦ç´ ã®éä¿¡ã®å¯å¦ã
httpResponseHeaderã¡ã½ããã¯ãè¿ãã¹ãè³æºï¼é©åãªããªã¢ã³ãï¼ãç¡ãã¨å¤æããå ´åã«ãâ406 (Not Acceptable) ã¹ãã¼ã¿ã¹ã³ã¼ãâãè¿ããå ¨ã¦ã®ããªã¢ã³ãã®ä¸è¦§ãæä¾ã§ãã¾ãã$status_code夿°ãFALSEã«ãããã¨ã§ãã®è¡¨ç¤ºãæå¶ã§ãã¾ããæ¨å¥¨è´ãã¾ããã
public Array negotiate([Boolean Accept [, Boolean Accept_Charset [, Boolean Accept_Language]]])- ãã´ã·ã¨ã¼ã·ã§ã³ã«ããæé©ãªè¡¨ç¾ã®é¸æã
- 弿°
Boolean Accept- Acceptãªã¯ã¨ã¹ãããããã£ã¼ã«ãã«ããæ¨æ¸¬ã®å¯å¦ã
Boolean Accept_Charset- Accept-Charsetãªã¯ã¨ã¹ãããããã£ã¼ã«ãã«ããæ¨æ¸¬ã®å¯å¦ã
Boolean Accept_Language- Accept-Languageãªã¯ã¨ã¹ãããããã£ã¼ã«ãã«ããæ¨æ¸¬ã®å¯å¦ã
- è¿ãå¤
- ãã´ã·ã¨ã¼ã·ã§ã³ã¢ã«ã´ãªãºã ã®å¦çã®çµæãæé©ãªããªã¢ã³ããããã°ãã®æ
å ±ãé
åã§ãä½ã鏿ãããªãã£ãå ´åã«ã¯
FALSEãè¿ãã¾ãã
ã¯ã©ã¹ã®ä½¿ç¨ä¾
次ã®ä¾ã¯ãContentNegotiationã¯ã©ã¹ã使ç¨ãããµã³ãã«ã§ãã
<?php
ini_set("include_path", "./");
// require_once("org/purl/net/osamurai/http/ContentNegotiation.php"); // for PHP 4
require_once("http/ContentNegotiation.php"); // for PHP 5
$cn = new ContentNegotiation;
// type-map: URI, media-type, charset, language-tag, qvalue, description
$cn->addTypeMap("foo");
$cn->addTypeMap("foo.html", "text/html");
$cn->addTypeMap("foo.ja.html.sjis", "text/html", "shift_jis", "ja");
$cn->addTypeMap("foo.en.html", "text/html", "iso-8859-1", "en");
$cn->addTypeMap("foo.ja.xhtml.utf8", "application/xhtml+xml", "utf-8", "ja", "0.9");
$cn->addTypeMap("foo.txt", "text/plain", "", "", "0.8");
$cn->addTypeMap("foo.dc.rdf", "application/rdf+xml", "utf-8", "", "0.5", "Dublin Core Metadata [RDF/XML]");
$result = $cn->negotiate();
$cn->httpResponseHeader();
if (!empty($result['uri'])) {
$filename = $result['uri'];
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
print($contents);
}
unset($cn);
?>ä¸è¨ã®æ§ã«ãã¦ãåã«è¤æ°ã®ãã¡ã¤ã«ããã²ã¨ã¤ã鏿ããå¦çã«ç¨ããå ´åã«ã¯ããµã¼ããã³ã³ãã³ããã´ã·ã¨ã¼ã·ã§ã³ã®æ©è½ããµãã¼ããã¦ãããããªãã°ããã¡ãã®æ©è½ã使ç¨ããæ¹ãããã©ã¼ãã³ã¹ã¯è¯ããã¨æãã¾ãã
PHPãç¨ãã¦ãHTTP GET åã³ POST ãã¯ããã¼çã®æ å ±ãå©ç¨ãã¦æé©ãªããªã¢ã³ãã鏿ããããå ´åã«ã¯ã次ã®è¨è¿°ã®æ§ã«ãã¦ã¿ã¤ããããã追å ããã¨è¯ãã§ãããã
...
// ä¾ï¼ãã¡ã¤ã«ã®URIã«ã¯ã¨ãªã¼æåãå«ãå ´å
$cn->addTypeMap("foo.php", "", "", "", "", "Muliple");
$cn->addTypeMap("foo.php?type=html401", "text/html"); // HTML 4.01
$cn->addTypeMap("foo.php?type=xhtml10", "text/html", "", "", "0.9"); // XHTML 1.0
$cn->addTypeMap("foo.php?type=xhtml10", "application/xhtml+xml"); // XHTML 1.0
$cn->addTypeMap("foo.php?type=xhtml1", "application/xhtml+xml", "", "", "0.9"); // XHTML 1.1
$cn->addTypeMap("foo.php?type=xhtml2", "application/xhtml+xml", "", "", "0.5"); // XHTML 2 (WD)
...ã¡ãªã¿ã«ããã®URIã®å ¨ã¦ã®ããªã¢ã³ãã®ä¸è¦§ã確èªãããã¨ãã§ãã¾ãã
注é
- ãå©ç¨ã®éã®æ³¨æäºé ãªã©ãã覧ä¸ããã