在javascript和postman中使用POST请求时,API返回的结果不相同

bybem2ql  于 2023-04-19  发布在  Java
关注(0)|答案(2)|浏览(373)

我试图找出一个看起来非常混乱的问题,为什么我不能在我的react native应用程序中获得我的API返回的jwt,但它在postman中工作正常?
这是我的服务器端

[HttpPost("login")]
    public async Task<ActionResult<string>> Login(UserLoginDto request)
    {
        
        // Check if exist
        var existingUser = _dbContext.Users.FirstOrDefault(u => u.Username == request.Username);
        
        if (existingUser == null)
        {
            return BadRequest("User not found");
        }

        if (!VerifyPasswordHash(request.Password, existingUser.PasswordHash, existingUser.PasswordSalt))
        {
            return BadRequest("Wrong password");
        }

        string token = CreateToken(existingUser);
        return Ok(token);
    }

下面是我的react native客户端

Login = async (user: UserLoginDTO) => {  
        try {
          console.log(API + "/auth/login")
          const response = await fetch(API + "/auth/login", {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json'
            },
            body: JSON.stringify(user)
          });
      
          if (!response.ok) {
            throw new Error('Failed to login user');
          }

        //   console.log(JSON.stringify(response, null, 2))
        console.log(response.json())
        }
        catch (error){
          console.log('Handled Error When Login:', error);
        }
      }

当我使用postman时,它工作正常,我得到了我的令牌:

"eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTUxMiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoic2hhZHkyIiwiZXhwIjoxNjgxNjg0NTg4fQ.DHFSqUs8LKWzyFtQLLh_DqniaaLU13CFap_ABHydQovjAszQh1x98bbghcl8w9OipH_GsHx7PwWKio92us5gFg"

但是当我从我的javascript端获取时,这里是我得到的响应:

{
  "type": "default",
  "status": 200,
  "ok": true,
  "statusText": "",
  "headers": {
    "map": {
      "content-type": "application/json; charset=utf-8",
      "date": "Sat, 15 Apr 2023 22:31:42 GMT",
      "server": "Kestrel",
      "transfer-encoding": "Identity"
    }
  },
  "url": "http://localhost:5001/auth/login",
  "bodyUsed": false,
  "_bodyInit": {
    "_data": {
      "size": 312,
      "offset": 0,
      "blobId": "8CC8111D-B26B-4C09-A03B-3E6D8439B7EB",
      "type": "application/json",
      "name": "login.json",
      "__collector": {}
    }
  },
  "_bodyBlob": {
    "_data": {
      "size": 312,
      "offset": 0,
      "blobId": "8CC8111D-B26B-4C09-A03B-3E6D8439B7EB",
      "type": "application/json",
      "name": "login.json",
      "__collector": {}
    }
  }
}

我不明白发生了什么,为什么这和 Postman 不一样?

vx6bjr1n

vx6bjr1n1#

我通过简单地使用response.text()解决了这个问题,这很容易理解,因为API返回的类型是字符串而不是json对象。
谢谢你的回答。

6ie5vjzr

6ie5vjzr2#

response.text()方法和response.json()方法用于从HTTP响应中提取响应正文,但它们在解释响应正文的方式上有所不同。
response.text()以文本字符串的形式返回响应正文。它可用于从响应中提取纯文本,HTML或任何其他非JSON格式。当响应内容类型未知时,或者当您需要提取响应正文中非JSON格式的特定部分时,可以使用此方法。
另一方面,response.json()方法将响应正文解析为JSON并返回JavaScript对象。当已知响应内容类型为JSON时,应使用此方法。它可用于从响应正文中提取任何JSON数据。
因为你的web API没有返回json格式,所以你应该使用text而不是json。

相关问题