execute和fetch

关于execute和fetch这两个阶段,到底是怎么区分的,一直感到迷惑,做个测试,可以大概看个明白:

SQL> alter session set events '10046 trace name context forever,level 12';

Session altered.

SQL> select count(*) from t1;

  COUNT(*)
----------
    651001

SQL> select count(*) from t1;

  COUNT(*)
----------
    651001

SQL> insert into t1 select * from t1 where rownum<=10000;

10000 rows created.

insert into t1 select  from t1 where rownum=10000


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.02          0          0          0           0
Execute      1      1.47       5.04       6512       7998      29743       10000
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      1.47       5.06       6512       7998      29743       10000

select count(*)
from
 t1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        2      0.00       0.00          0          0          0           0
Execute      2      0.00       0.00          0          0          0           0
Fetch        4      8.57       9.03        115      26041          1           2
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        8      8.58       9.04        115      26041          1           2

可见,对于dml操作,真正的执行就是在execute阶段,而对于select操作,真正的执行应该是fetch阶段。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-662437/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10972173/viewspace-662437/

<think>我们正在解决一个关于使用fetchAPI发送POST请求时出现的错误:`Failed toexecute 'fetch'on 'Window':Request withGET/HEAD methodcannot havebody`。根据引用[2]的分析,这个错误的原因是:GET或HEAD请求不能包含请求体(body),而我们在发送POST请求时却出现了这个错误,说明我们可能错误地将请求方法设置成了GET或HEAD,或者没有正确设置方法。根据引用[2]引用[3]的提示,解决方法有两种:1.确保使用POST方法(或其他允许使用body的方法,如PUT)并正确设置请求方法。2.如果确实需要GET请求,那么参数应该放在URL中,而不是请求体中。因此,我们首先需要检查我们的fetch请求是否正确地设置了method为'POST'(或'PUT'等),并且确保我们没有在GET请求中使用body。下面是一个正确的POST请求的fetch示例:```javascriptfetch('https://example.com/api',{method:'POST', //这里必须是允许有body的方法headers:{'Content-Type':'application/json'//根据实际情况设置Content-Type},body: JSON.stringify({key:'value' })//这里设置请求体}).then(response =>response.json()) .then(data=> console.log(data)) .catch(error=> console.error('Error:',error));```如果我们的请求方法设置正确(比如为'POST')但仍然出现这个错误,那么我们需要检查是否在请求中不小心将方法写成了'GET'或'HEAD',或者没有设置方法(因为fetch的默认方法是GET)。另外,根据引用[2],在Swagger测试中遇到这个问题是因为在Get路由中试图传递form-data数据(即body),而Get请求不能有body。所以,如果我们在使用Swagger测试POST接口,那么应该确保在Swagger中选择了POST方法,并且将参数填写在body中。总结步骤:1.确认请求方法(method)设置正确,不是GET或HEAD,而是POST、PUT等允许有body的方法。2.检查请求头(headers)是否设置正确,特别是Content-Type,它应该与body的数据格式匹配(如application/json、application/x-www-form-urlencoded等)。3.确保在GET请求中不要传递body。如果问题仍然存在,请检查代码中是否有拼写错误,例如将'method'拼写错误,或者将'POST'写成了小写(应该是大写,但fetch通常也接受小写,但为了规范建议大写)。根据以上分析,我们可以尝试修正代码。相关问题:1.如何正确使用fetch发送POST请求?2.fetch API中哪些HTTP方法允许使用请求体?3.在使用Swagger测试接口时,如何避免方法不匹配的错误?</think>### 解决 Fetch POST 请求报错:`Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body` #### 错误原因分析 1. **HTTP 方法冲突**: - GET/HEAD 请求**不能包含请求体**(body),这是 HTTP 协议规范 - 当使用 `fetch()` 发送请求时,如果方法被设置为 `GET` 或 `HEAD`(显式或默认),但同时又提供了 `body` 参数,就会触发此错误[^1][^2] 2. **常见错误场景**: ```javascript // ❌ 错误示例:默认方法为GET,但提供了body fetch('/api', { body: JSON.stringify({ data: 'test' }) // 缺少 method 定义 }); // ❌ 错误示例:显式使用GET方法却包含body fetch('/api', { method: 'GET', body: JSON.stringify({ data: 'test' }) // 矛盾 }); ``` --- #### 解决方案 ##### 方法 1:正确设置 POST 方法(推荐) ```javascript fetch('https://api.example.com/data', { method: 'POST', // ✅ 明确指定为POST headers: { 'Content-Type': 'application/json' // 必须声明内容类型 }, body: JSON.stringify({ key: 'value' }) // 此时body允许存在 }); ``` ##### 方法 2:GET 请求改用 URL 传参 ```javascript // ✅ GET请求通过URL传参(无body) const params = new URLSearchParams({ id: 123, type: 'test' }); fetch(`https://api.example.com/data?${params}`); ``` ##### 方法 3:检查第三方工具配置 * 在 **Swagger** 等测试工具中: - 确认接口定义为 `POST` 而非 `GET` - 参数应放在 **Body** 标签页而非 **Query** 标签页[^3] * 在 **Postman** 中: - 检查请求方法下拉菜单选择 `POST` - Body 数据格式需与 `Content-Type` 匹配 --- #### 关键注意事项 1. **方法必须显式声明**: ```javascript // ✅ 明确指定方法(即使默认是GET也要显式声明) fetch(url, { method: 'POST', body: ... }) ``` 2. **Content-Type 必须匹配**: | Body 类型 | Content-Type 头 | |----------|----------------| | JSON | `application/json` | | FormData | `multipart/form-data` | | URL编码 | `application/x-www-form-urlencoded` | 3. **框架中的特殊处理**: ```javascript // Axios 示例(自动处理方法) axios.post('/api', { data: 'test' }); // ✅ // Vue/React 中常见错误: const res = await fetch('/api', { body: data, // ❌ 缺少 method headers }); ``` > **最佳实践**:始终明确声明 `method`, `headers`, `body` 三者,避免依赖默认值[^2]。 --- #### 调试技巧 ```javascript // 打印请求配置检查 console.log({ method: 'POST', // 确认是POST headers: { 'Content-Type': 'application/json' }, // 确认存在 body: JSON.stringify(payload) // 确认是字符串 }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值