17天:API
以前在symfonyob娱乐下载
使用应用程序只是把在线昨天,我们已经有了很多关于特性的反馈调整和添加。用户输入基本的web 2.0应用程序的设计,即使应用程序的概念是新的,它必须尽快尝试了。
但我们会在21天添加的功能。在此之前,我们已经安排少数先进的web应用程序开发技术通过使用给你,第一个是今天透露外部API的编程要求一个HTTP身份验证。
正如我们昨天做了相当多的小修改,建议你从今天开始的教程下载一个新的版本的使用16天标记版本在使用存储库中。
API
一个应用程序编程接口,或API特定服务是一个开发人员的接口,在您的应用程序,以便它可以包含在外部网站。思考谷歌地图或Flickr,用于扩展很多网站在互联网上由于api。
Askeet毫无例外,我们相信,为了增加服务的受欢迎,它必须是用于其他网站。发达在RSS提要天11是第一个方法的要求,但我们可以做得更好。
使用将会提供一个API由用户回答问的一个问题。这个API的访问将被限制在注册使用用户,通过HTTP身份验证。API的响应格式选择具象状态传输或者休息——这意味着响应是一个简单的XML块最主要的输出相似的web api:
< ? xml版本=“1.0”编码=“utf - 8”? ><负责统计=“ok”版本=“1.0”><问题href=“http://www.askeet.com/question/what-shall-i-do-tonight-with-my-girlfriend”时间=“2005 - 11 - 21 - t21:19:18z”><标题>我今晚和我的女朋友吗?< /名称><标签><标签>活动< /标签><标签>亲戚< /标签><标签>女孩< /标签><标签><答案><回答相关性=“50”时间=“2005 - 11 - 22 - t12:21:53z”>你可以试着读她的诗。小鸡喜欢这一类的东西。< /回答><回答相关性=“0”时间=“2005 - 11 - 22 - t15:45:03z”>不要带她去一家甜甜圈店。永远。女孩不喜欢被吃用手指——尽管很高兴。< /回答>< /答案>< /问题>< /负责>
我们将实现API的新模块前端
应用程序,因此使用命令行构建模块框架:
美元ob娱乐下载symfony init-module前端api
HTTP身份验证
我们选择的限制使用API来注册使用的用户。为此,我们将使用HTTP身份验证过程,这是一个内置的HTTP协议的认证机制。它不同于web身份验证之前我们已经看到了,因为它甚至不需要一个web页面——所有的交流发生在HTTP头。
我们需要认证方法包括在一个定制的验证器第六天,首先我们会做一些重构及重置登录代码UserPeer
模型类:
公共静态函数getAuthenticatedUser(美元的登录,美元的密码){$ c=新标准();$ c- >添加(UserPeer::昵称,美元的登录);$ user= UserPeer::doSelectOne($ c);/ /昵称存在吗?如果($ user){/ /密码好吗?如果(sha1($ user- >getSalt()。美元的密码)= =$ user- >getSha1Password()){返回$ user;}}返回零;}
新类的方法UserPeer: getAutenticatedUser ()
现在可以使用吗myLoginValidator.class.php
(我们将离开你)和新api /索引
web服务:
< ? php类apiActions扩展sfActions{公共函数preExecute(){sfConfig::集(“sf_web_debug”,假);}公共函数executeIndex(){$ user=这个美元- >authenticateUser();如果(!$ user){这个美元- >error_code=1;这个美元- >error_message=“登录失败”;这个美元- >向前(“api”,“错误”);}/ /做一些东西}私人函数authenticateUser(){如果(收取($ _SERVER(“PHP_AUTH_USER”])){如果($ user= UserPeer::getAuthenticatedUser($ _SERVER(“PHP_AUTH_USER”],$ _SERVER(“PHP_AUTH_PW”])){这个美元- >getContext()- >getUser()- >signIn($ user);返回$ user;}}头(' WWW-Authenticate:基本领域=“askeet API”);头(“HTTP / 1.0 401未授权”);}公共函数executeError(){}}? >
首先,在执行任何操作的API模块(因此preExecute ()
方法),我们关掉网络调试工具栏。这个动作的视图的XML,插入工具栏的代码会产生无效的响应。
的第一件事指数
动作要做的是检查是否提供了登录名和密码,如果他们匹配现有使用帐户。如果不是这样,authenticateUser ()
方法响应HTTP头设置为“401”。这将导致一个HTTP身份验证用户的浏览器窗口弹出;用户将不得不重新提交登录和密码的请求。
/ /第一个请求API,没有身份验证得到/ API /指数HTTP / 1.1主持人:mysite.example.com用户代理:Mozilla / 5.0 (Windows;U;Windows NT 5.1;fr;房车:Firefox 1.8)壁虎/ 20051111 / 1.5接受:text / xml, xml应用程序/,application / xhtml + xml、text / html; q = 0.9,文本/平原;q = 0.8,图像/ png, * / *; q = 0.5……/ / API返回一个HTTP / 1 401头没有内容。x 401授权所需时间:星期四,2005年12月15日格林尼治时间10:32:44服务器:Apache WWW-Authenticate:基本领域内容长度=“顺序回答食”:401点火电极:超时= 15,max = 100连接:维生的content - type: text / html;charset = iso - 8859 - 1 / /一个登录框将出现在用户的窗口。/ /用户输入他的登录名及密码后,一个新的获得发送到服务器/ api /指数HTTP / 1.1主持人:mysite.example.com用户代理:Mozilla / 5.0(窗口;U; Windows NT 5.1; fr; rv:1.8) Gecko/20051111 Firefox/1.5 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 ... Authorization: Basic ZmFicG90OnN5bWZvbnk=
一个授权
属性添加到HTTP请求,再次发送。它包含一个基地64登录:密码的字符串进行编码。这就是$ _SERVER (“PHP_AUTH_USER”)
和$ _SERVER (“PHP_AUTH_PW”)
寻找在我们的authenticateUser ()
方法。
请注意
Base64不输出一个加密版的输入。解码一个base64编码的字符串非常容易在清楚,它揭示了密码。例如,解码字符串ZmFicG90OnN5bWZvbnk =
给了fabpot:ob娱乐下载 symfony
。所以你必须考虑到清晰的密码通过互联网(当在web表单中输入),可以拦截。HTTP身份验证必须限制为这个原因非关键内容和服务。添加保护能获得通过要求HTTPS协议API调用。
如果登录名和密码提供的和用户数据库中存在,那么指数
动作执行。否则,它向前错误
行动(空的)和显示errorSuccess.php
模板:
< ? php回声' < ?”xml version = ? >“1.0”编码=“utf - 8”? ><负责统计=“失败”version =“1.0”= > <错误代码“< ?php echo $ error_code ? > "味精=“< ?php echo $ error_message ? > "/ > < /负责>
当然,你必须设置所有的意见api
模块一个XML内容类型,并停用装饰。这是通过添加一个view.yml
文件使用/应用程序/前端/模块/ api / config /
目录:
所有:has_layout: http_metas: - type: text / xml
请注意
的原因指数
操作返回一个(“api”,“错误”)
而不是sfView:错误
是因为在出错的情况下所有的行动api
模块使用相同的观点。想象一下,我们两指数
例如,行动和另一个受欢迎的
,结束了sfView:错误
:我们会为两个相同的错误观点(indexError.php
和popularError.php
相同的内容。的选择转发()
限制了重复的代码。然而,它迫使另一个动作的执行。
API的反应
构建一个XML响应是完全一样建立一个XHTML页面。所以没有以下应该惊喜你既然已经16天的symfony支持你。ob娱乐下载
api /索引
行动
公共函数executeQuestion(){$ user=这个美元- >authenticateUser();如果(!$ user){这个美元- >error_code=1;这个美元- >error_message=“登录失败”;这个美元- >向前(“api”,“错误”);}如果(!这个美元- >getRequestParameter(“stripped_title”)){这个美元- >error_code=2;这个美元- >error_message=“API返回一个特定问题的答案。请提供stripped_title参数”;这个美元- >向前(“api”,“错误”);}其他的{/ /获取问题美元问题= QuestionPeer::getQuestionFromTitle(这个美元- >getRequestParameter(“stripped_title”));如果(美元问题- >getUserId()! =$ user- >getId()){这个美元- >error_code=3;这个美元- >error_message=“你只能使用API的问题你问的;这个美元- >向前(“api”,“错误”);}其他的{/ /得到答案这个美元- >答案=美元问题- >getAnswers();这个美元- >问题=美元问题;}}}
questionSuccess.php
模板
< ? php回声' < ?”xml version = ? >“1.0”编码=“utf - 8”? ><负责统计=“ok”version =“1.0”href = > <问题“< ?php echo url_for (@question ? stripped_title = '。$问题- > getStrippedTitle(),真的)? > "时间=“< ?php echo strftime (' % Y - % m - H % dT %: % m: %深圳',$问题- > getCreatedAt (' U ')) ? > "> <标题> < ? php回声美元问题- >getTitle()? > < /名称> <标记>< ? phpforeach(sf_user美元- >getSubscriber()- >getTagsFor(美元问题)作为美元的标记):? ><标记> < ? php回声美元的标记? > < / >标记< ? phpendforeach? ><回答> < / >标签< ? phpforeach(美元的答案作为美元的答案):? ><回答相关性=“< ?php echo $回答- > getRelevancyUpPercent () ? > "时间=“< ?php echo strftime (' % Y - % m - H % dT %: % m: %深圳',$回答- > getCreatedAt (' U ')) ? > "> < ? php回声美元的答案- >getBody()? > < /回答>< ? phpendforeach? >< /答案> < /问题> < /负责>
添加一个新的路由规则API调用:
api_question: url: / / api /问题:stripped_title参数:{模块:api,行动:问题}
测试它
REST API的反应是简单的XML,可以用一个简单的浏览器测试要求:
http://askeet/api/question/what-shall-i-do-tonight-with-my-girlfriend
集成外部API
集成外部API是没有比用PHP读取XML。因为没有直接的利益整合现有的外部API使用,我们将在几句话描述如何将使用API集成在一个外国网站,是否用symfony。ob娱乐下载
PHP5捆绑在一起,SimpleXML,一个非常易于使用的工具集来解释和遍历XML文档。SimpleXML,元素名称会自动映射到一个对象上的属性,并递归地发生这种情况。属性映射到迭代器访问。
重组的回答一个问题列表API提供的成一个简单的页面,只需要几行PHP:
< ? php$ xml=:(目录名(__FILE__)。' / question.xml ')? ><标题> < ? php回声$ xml- >问题- >标题? > < / h1 > < p >上发表< ? php回声$ xml- >问题(“时间”]? > < / p > < h2 >标记< / h2 > < ul >< ? phpforeach($ xml- >问题- >标签- >标签作为美元的标记):? ><李> < ? php回声美元的标记李? > < / >< ? phpendforeach? >< / ul > < h2 >这个问题的答案来自用户使用< / h2 > < ul >< ? phpforeach($ xml- >问题- >答案- >回答作为美元的答案):? ><李>< ? php回声美元的答案? >< br / >相关性:< ? php回声美元的答案(“相关性”]? > % -发表< ? php回声美元的答案(“时间”]? >李< / >< ? phpendforeach? >< / ul >
贝宝捐赠
当我们谈论外部api,其中一些非常简单的集成,可以带来很多你的网站。的贝宝捐赠API是一个简单的HTML代码的电子邮件会计必须包括在内。
不是很慷慨地使用用户回答问题的一个良好的动机能够收到所有的快乐小捐赠用户找到他们的答案有用吗?“捐献”按钮将出现在用户的个人档案页面,并链接到他/她的贝宝捐赠页面。
首先,添加一个has_paypal
列的用户
表中schema.xml
:
<列的名字=“has_paypal”类型=“布尔”默认的=“0”/ >
重建模型,和添加用户/显示
模板下面的代码:
< ? php如果(美元的用户- >getHasPaypal()):? >< p >如果你欣赏这个用户的贡献,能给予他一个小小的捐款。< / p > <表单动作= = " https://www.paypal.com/cgi-bin/webscr "方法" post " > < input type = "隐藏" name =“cmd”价值= " _xclick " > < input type =“隐藏”名称=“业务”值= " < ?php echo $用户- > getEmail () ? > " > < input type = "隐藏" name =“item_name”价值= "使用" > < input type =“隐藏”n