You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React自定义useHttp Hook:GET正常POST调用response.json()报错

问题分析与解决

你的问题核心在于:response.json() 会尝试解析HTTP响应体的内容,而你的服务器在POST请求成功后,返回的响应体是纯文本 "OK"(甚至可能是不带引号的 OK),这不是合法的JSON格式,所以解析时抛出了错误。

注意:response.statusText 是HTTP状态码对应的描述文本(比如200状态码默认就是"OK"),和服务器返回的响应体是完全独立的两个东西——你看到的"OK"只是状态描述,而真正被json()解析的是服务器主动返回的响应体内容。

解决方法

方案1:根据响应类型动态处理解析逻辑

修改你的自定义useHttp Hook,先检查响应的Content-Type头,再决定用json()还是text()解析:

const useHttp = () => {
  const sendRequest = async (url, method = 'GET', body = null, headers = {}) => {
    try {
      const response = await fetch(url, {
        method,
        body: body ? JSON.stringify(body) : null,
        headers: body ? { 'Content-Type': 'application/json', ...headers } : headers
      });

      // 先获取响应内容类型
      const contentType = response.headers.get('Content-Type');
      let data;
      
      // 区分JSON和文本响应
      if (contentType?.includes('application/json')) {
        data = await response.json();
      } else {
        data = await response.text();
      }

      if (!response.ok) {
        throw new Error(data.message || data || '请求失败');
      }

      return data;
    } catch (error) {
      throw error;
    }
  };

  return { sendRequest };
};

方案2:直接使用text()解析POST响应

如果你确定POST请求的服务器只会返回文本(比如"OK"),可以在POST请求时单独处理,跳过json():

// 在调用sendRequest时,或者在Hook内部针对POST方法做判断
const handlePost = async () => {
  try {
    const response = await fetch('/your-post-url', {
      method: 'POST',
      body: JSON.stringify(yourData),
      headers: { 'Content-Type': 'application/json' }
    });
    
    if (!response.ok) throw new Error('请求失败');
    
    // 用text()替代json()
    const data = await response.text();
    console.log(data); // 输出"OK"
  } catch (err) {
    console.error(err);
  }
};

方案3:协调后端返回合法JSON

最规范的方式是和后端开发沟通,让他们返回合法的JSON格式响应,比如:

{"message": "OK"}

这样response.json()就能正常解析,不会报错。

内容的提问来源于stack exchange,提问作者miso1655

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:13:07