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

使用JavaScript从Web API 2获取字符串响应失败求助

解决Fetch无法获取Web API返回的Token问题

我帮你排查出了代码里的几个关键问题,这就是你拿不到返回字符串的原因,咱们一步步修正:

1. 你没有调用json()方法,只是引用了它

response.json是一个异步方法,必须加()执行它,它会返回一个Promise,解析完成后才会拿到服务器返回的数据。你现在只是把方法本身传下去了,自然拿不到实际的响应内容。

2. 错误分支没有终止Promise链

当response.ok不成立时,你只弹出了提示并dispatch失败action,但没有让Promise进入reject状态。这会导致Promise继续走到下一个then,此时response是undefined,所以response.json肯定也是undefined。

3. 解析后的数据使用错误

服务器返回的是纯字符串(token)或者布尔值false,json()解析后直接就是这个值,你不需要再去访问.json属性——这个属性根本不存在,所以才会是undefined。


修正后的前端代码

export const login = (user) => (dispatch) => {
  dispatch({ type: 'LOGIN_STARTED' });
  return fetch(`${httpApiUrl}/api/userdata/verify`, {
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(user)
  })
  .then((response) => {
    if (!response.ok) {
      // 抛出错误,让catch分支处理,同时终止Promise链
      throw new Error('User or password is incorrect');
    }
    // 调用json()方法,返回解析后的Promise
    return response.json();
  })
  .then((data) => {
    // 这里的data就是服务器返回的token或者false
    if (data === false) {
      // 服务器返回false,说明验证失败
      Alert.alert('ERROR', 'User or password is incorrect');
      dispatch({ type: 'LOGIN_FAILED', data: 'User or password is incorrect' });
    } else {
      // 验证成功,data就是token字符串
      dispatch({ type: 'LOGIN_SUCCEEDED', data: data });
    }
  })
  .catch(error => {
    dispatch({ type: 'LOGIN_FAILED', data: error.message });
  });
};

额外优化建议

关于前端解析方式

因为服务器返回的是纯字符串或布尔值,你也可以用response.text()替代response.json(),这样更直接,避免JSON解析可能出现的小问题:

// 把return response.json();换成下面这行
return response.text();

关于服务器响应格式

建议统一返回JSON结构,比如成功时返回{ "token": "你的token字符串" },失败时返回{ "success": false, "message": "验证失败" },这样前端逻辑会更清晰。修改服务器代码示例:

[HttpPost]
[Route("verify")]
[AllowAnonymous]
public HttpResponseMessage VerifyUser(HttpRequestMessage request, UserDataView data)
{
  return CreateHttpResponse(request, () => {
    HttpResponseMessage response = null;
    if (service.wasUpdated(data))
    {
      // 返回带token的JSON对象
      response = request.CreateResponse(HttpStatusCode.OK, new { token = JwtManager.GenerateToken(data.username) });
    }
    else
    {
      // 返回带错误信息的JSON对象,同时用BadRequest状态码更规范
      response = request.CreateResponse(HttpStatusCode.BadRequest, new { success = false, message = "User or password is incorrect" });
    }
    return response;
  });
}

对应的前端就可以直接取data.token或者判断data.success,逻辑更严谨。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:07:46