从axios、react和typescript发布到.net核心端点时,GUID为00000000 - 0000 - 0000- 0000 - 0000000000

qfe3c7zg  于 2023-01-09  发布在  iOS
关注(0)|答案(2)|浏览(178)

我有一个.net端点在这里:

public class ListContactRequest
{
    public Guid userId { get; set; }
}

[Authorize]
[HttPost]
[Route("listContacts")]
public async Task<AddressBookListContacts> listContacts([FromBody]ListContactRequest req)
{
     return blah blah....
}

我的react axios在 typescript 中调用

import { Guid } from "guid-typescript";

interface IListContactRequest {
  userId: Guid;
}
const ListContacts = (user: IListContactRequest) => {
  console.log(user);
  return axios
    .post(API_URL + "/listContacts", user, {
      headers: {
        "Content-Type": "application/json",
      },
    })
    .then((response) => {
      return response.data;
    });
};

问题是,当axios方法触发时,它到达.net端点,但是,参数对象中的guid是以0000000 -0000-0000 - 0000 - 0000 - 0000000000的形式到达的
当控制台记录前端时,guid显示正确,但是当它到达后端API时,它似乎没有继续。
有人能给点建议吗?

console.log(JSON.stringify(user))

显示
{“用户ID”:{“值”:“24883 e12 - 439 d-4 e54-aae 5 - 5 b1 d5140833 e”}}

vxbzzdmp

vxbzzdmp1#

您的Guid正在作为具有value属性的对象序列化为JSON,但您的C#模型不匹配。
可以使用Guid.prototype.toString()Guid.prototype.toJSON()方法获取正确的值

axios.post("/listContacts", {
  userId: user.userId.toJSON().value // or user.userId.toString()
}, {
  baseURL: API_URL
});

See https://github.com/snico-dev/guid-typescript#props-and-methods
也许更简洁的选择是将IListContactRequest作为一个类,而不是实现它自己的toJSON()方法

class ListContactRequest {
  constructor(readonly userId: Guid) {}

  toJSON() {
    return {
      userId: this.userId.toJSON().value,
    };
  }
}

const user = new ListContactRequest(Guid.create());
axios.post(url, user);
yacmzcpb

yacmzcpb2#

问题是您的端点需要类似以下的对象:

{
   "userId": "0d7b77dc-4d2a-4793-adb0-ec5a34698958"
}

而你却把

{"userId":{"value":"24883e12-439d-4e54-aae5-5b1d5140833e"}}

因此,它无法将其反序列化为目标类型,而只是为您提供Guid的默认值。
您需要将axios调用更改为:

.post(API_URL + "/listContacts", user.UserId, {

或者,如果您必须这样保留它,则需要将端点参数更改为类似Dictionary<string, ListContactRequest>的值

相关问题