# HTTP请求和响应
HTTP请求和响应封装在Nette \ Http \ Request和Response对象中,这些对象提供了舒适的API,并且还充当了杀毒过滤器。
## HTTP Request
Nette框架清除用户从控制和无效字符发送的数据。 它也删除任何magic_quotes。
HTTP请求,它是类Nette \ Http \ Request的对象,我们不直接创建,但是我们从DI容器接收它作为服务。
~~~
$httpRequest = $container->getByType('Nette\Http\Request');
~~~
请求的URL可用为Nette \ Http \ UrlScript实例:
~~~
$url = $httpRequest->getUrl();
echo $url; // e.g. https://nette.org/en/documentation?action=edit
echo $url->host; // nette.org
~~~
确定当前的HTTP方法:
~~~
echo $httpRequest->getMethod(); // GET, POST, HEAD, PUT
if ($httpRequest->isMethod('GET')) ...
~~~
连接是否已加密(HTTPS)?
~~~
echo $httpRequest->isSecured() ? 'yes' : 'no';
~~~
这是一个AJAX请求吗?
~~~
echo $httpRequest->isAjax() ? 'yes' : 'no';
~~~
用户的IP地址是什么?
~~~
echo $httpRequest->getRemoteAddress(); // user's IP address
echo $httpRequest->getRemoteHost(); // and its DNS translation
~~~
用户来自哪个URL? 作为Nette \ Http \ Url对象返回。
~~~
echo $httpRequest->getReferer()->host;
~~~
请求参数:
~~~
$get = $httpRequest->getQuery(); // array of all URL parameters
$id = $httpRequest->getQuery('id'); // returns GET parameter 'id' (or NULL)
$post = $httpRequest->getPost(); // array of all POST parameters
$id = $httpRequest->getPost('id'); // returns POST parameter 'id' (or NULL)
$cookies = $httpRequest->getCookies(); // array of all cookies
$sessId = $httpRequest->getCookie('sess_id'); // returns the cookie (or NULL)
~~~
上传的文件封装到Nette \ Http \ FileUpload对象中:
~~~
$files = $httpRequest->getFiles(); // array of all uploaded files
$file = $httpRequest->getFile('avatar'); // returns one file
echo $file->getName(); // name of the file sent by user
echo $file->getSanitizedName(); // the name without dangerous characters
~~~
还可以访问HTTP标头:
~~~
// returns associative array of HTTP headers
$headers = $httpRequest->getHeaders();
// returns concrete header (case-insensitive)
$userAgent = $httpRequest->getHeader('User-Agent');
~~~
一个有用的方法是detectLanguage()。 你可以传递一个数组的应用程序支持的语言,它返回浏览器首选的一个。 这不是魔术,方法只是使用Accept-Language头。
~~~
// Header sent by browser: Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3
$langs = ['hu', 'pl', 'en']; // languages supported in application
echo $httpRequest->detectLanguage($langs); // en
~~~
### RequestFactory和URL过滤
对象保持当前HTTP请求由Nette \ Http \ RequstFactory创建。 其行为可以修改。 可以通过使用过滤器来清除可能进入其中的字符的URL,因为在其他网站上执行的评论系统效果不佳:
~~~
$requestFactory = new Nette\Http\RequestFactory;
// remove spaces from path
$requestFactory->urlFilters['path']['%20'] = '';
// remove dot, comma or right parenthesis form the end of the URL
$requestFactory->urlFilters['url']['[.,)]$'] = '';
// clean the path from duplicated slashes (default filter)
$requestFactory->urlFilters['path']['/{2,}'] = '/';
~~~
然后我们让工厂生成一个新的http请求,并将它存储在系统容器中:
~~~
// $container is a system container
$container->addService('httpRequest', $requestFactory->createHttpRequest());
~~~
### HTTP响应
HTTP响应,它是一个类Nette \ Http \ Response的对象,我们不直接创建,但是我们从DI容器接收它作为服务。
~~~
$httpResponse = $container->getByType('Nette\Http\Response');
~~~
是否仍然可能发送头或更改状态代码告诉isSent()方法。 如果它返回TRUE,将不可能发送另一个头或更改状态代码。
响应状态代码可以这样发送和检索:
~~~
$httpResponse->setCode(Nette\Http\Response::S404_NOT_FOUND);
echo $httpResponse->getCode(); // 404
~~~
为了更好的源代码可读性,建议使用预定义常量而不是实际数字:
~~~
Http\IResponse::S200_OK
Http\IResponse::S204_NO_CONTENT
Http\IResponse::S300_MULTIPLE_CHOICES
Http\IResponse::S301_MOVED_PERMANENTLY
Http\IResponse::S302_FOUND
Http\IResponse::S303_SEE_OTHER
Http\IResponse::S303_POST_GET
Http\IResponse::S304_NOT_MODIFIED
Http\IResponse::S307_TEMPORARY_REDIRECT
Http\IResponse::S400_BAD_REQUEST
Http\IResponse::S401_UNAUTHORIZED
Http\IResponse::S403_FORBIDDEN
Http\IResponse::S404_NOT_FOUND
Http\IResponse::S410_GONE
Http\IResponse::S500_INTERNAL_SERVER_ERROR
Http\IResponse::S501_NOT_IMPLEMENTED
Http\IResponse::S503_SERVICE_UNAVAILABLE
~~~
方法setContentType($ type,$ charset = NULL)changes Content-Type响应头:
~~~
$httpResponse->setContentType('text/plain', 'UTF-8');
~~~
重定向到另一个URL是通过redirect($ url,$ code = 302)方法。 不要忘了终止脚本!
~~~
$httpResponse->redirect('http://example.com');
exit;
~~~
要设置文档到期日期,我们可以使用setExpiration()方法。 参数是文本数据,秒数或时间戳:
~~~
// browser cache expires in one hour
$httpResponse->setExpiration('+ 1 hours');
~~~
现在我们发送HTTP响应头:
~~~
$httpResponse->setHeader('Pragma', 'no-cache');
// or if we want to send the same header more times with different values
$httpResponse->addHeader('Pragma', 'no-cache');
~~~
发送标头也可用:
~~~
// returns associative array of headers
$headers = $httpResponse->getHeaders();
// returns concrete header (case-insensitive)
$pragma = $httpResponse->getHeader('Pragma');
~~~
有两种cookie操作方法:setCookie()和deleteCookie()。
~~~
// setCookie($name, $value, $time, [$path, [$domain, [$secure, [$httpOnly]]]])
$httpResponse->setCookie('lang', 'en', '100 days'); // send cookie
// deleteCookie($name, [$path, [$domain, [$secure]]])
$httpResponse->deleteCookie('lang'); // delete cookie
~~~
这两个方法可以使用更多的参数:$ path(cookie将可用的子目录),$ domain和$ secure。 他们的详细描述可以在setcookie函数的PHP手册中找到。
- Nette简介
- 快速开始
- 入门
- 主页
- 显示文章详细页
- 文章评论
- 创建和编辑帖子
- 权限验证
- 程序员指南
- MVC应用程序和控制器
- URL路由
- Tracy - PHP调试器
- 调试器扩展
- 增强PHP语言
- HTTP请求和响应
- 数据库
- 数据库:ActiveRow
- 数据库和表
- Sessions
- 用户授权和权限
- 配置
- 依赖注入
- 获取依赖关系
- DI容器扩展
- 组件
- 字符串处理
- 数组处理
- HTML元素
- 使用URL
- 表单
- 验证器
- 模板
- AJAX & Snippets
- 发送电子邮件
- 图像操作
- 缓存
- 本土化
- Nette Tester - 单元测试
- 与Travis CI的持续集成
- 分页
- 自动加载
- 文件搜索:Finder
- 原子操作