使用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
相关产品推荐
相关产品推荐

