在 Web 的接口设计中，一般会有：请求（Request）、响应（Response）、会话状态（SessionState）三块信息。出于多用途的角度考虑，Solon 的 Context 将三者合为一体。

* 还可用于定时任务
* 还可用于带配置的方法注入
* 还可用于有元信息的 socket 通讯
* 还可用于有元信息的 websocket 通讯

### 1、关于 Web 请求的数据

主要的两个部分：头与主体（http 协议结构体）

* 头信息

| 接口 | 描述 | 
| -------- | -------- |
| `headerMap() -> MultiMap<String>`     | 请求头集     | 
| `cookieMap() -> MultiMap<String>`     | 请求cookie集合（是从头集合里，解析出来的）     |

* 主体信息

| 接口 | 描述 | 
| -------- | -------- | 
| `fileMap() -> MultiMap<UploadedFile> `    | 文件集合（由特定编码的主体解码后产生）     | 
| `paramMap() -> MultiMap<String> `    | 参数集合（由特定编码的主体解码后产生），也包含了查询字符串参数     | 
| `body() `    | 请求主体（如果已解被解码，它会是个空流）    |

如何修改请求数据?（其中 MultiMap 的接口参考：<a href="https://solon.noear.org/api/org/noear/solon/core/util/MultiMap.html" target="_blank">MultiMap</a>）

```java
//MultiMap 集合的修改示例
ctx.headerMap().add("key1", "val1");
ctx.cookieMap().put("key1", "val1");

//body 的修改示例
ctx.bodyNew(...);
```


### 2、关于 Web 响应的数据

主要也是两个部分：头与主体（http 协议结构体）

* 头输出（更多接口参考：[认识请求上下文（Context）](/article/216)）

| 接口 | 描述 | 
| -------- | -------- |
| `headerSet(String key, String value)`     | 设置响应头（替换方式）     | 
| `headerAdd(String key, String value)`     | 添加响应头（增量方式）     | 
| `cookieSet(String key, ...)`     | 设置小饼（替换方式）     | 
| | |
| `headerOfResponse(String key)`     | 获取设置的响应头单值     | 
| `headerValuesOfResponse(String key, String value)`     | 获取设置的响应头多值     | 


* 主体输出

| 接口 | 描述 | 
| -------- | -------- |
| `output(...)`     | 输出原始数据主体     | 
| `render(...)`     | 通过渲染转换，再输出原始数据主体     | 


如何获取响应数据?

```java
//可以获取响应头
ctx.headerOfResponse("key1");

//可以获取输出文本主体（主要是内部用，未来可能会变）
ctx.attr("output"); 
```
