首页 新闻 会员 周边

关于api的Post方法

0
悬赏园豆:10 [已解决问题] 解决于 2020-12-03 16:42

这是我的api中的post方法,有一个int Id参数和Student类参数

这是我失败的post方法
错误提示:

这是成功的post方法

我想请问一下为什么不能用我失败的那个方法,用那个方法报错"Message":"请求的资源不支持 http 方法“POST”。
必须要在url地址后面加Id吗,"api/Values/66",为什么不能把int Id一起写在post的参数列表里

godcloudy的主页 godcloudy | 初学一级 | 园豆:18
提问于:2020-12-03 11:51
< >
分享
最佳答案
0

api/Value 跟你貼的代碼是同一個??
你貼的代碼要求參數int Id, Student student
你呼叫api/Value 的參數卻是Id, Name
要不要先去確認一下你呼叫的到底是哪個API

收获园豆:10
RosonJ | 老鸟四级 |园豆:4910 | 2020-12-03 13:14

是同一个,Id在api/values/66,66就是,student里有属性Id和name

godcloudy | 园豆:18 (初学一级) | 2020-12-03 14:38

@godcloudy:
實測這樣OK,給你參考

$.post("/api/Value", { Id: 77, student: { Id: 66, Name: 'sadf' } }, function(data){
    //...
});
RosonJ | 园豆:4910 (老鸟四级) | 2020-12-03 14:48

@RosonJ: 我是这样传的参数,但是就是出错了

godcloudy | 园豆:18 (初学一级) | 2020-12-03 14:49

@godcloudy:
你仔細看看,我有做修改

RosonJ | 园豆:4910 (老鸟四级) | 2020-12-03 14:57

@RosonJ:
除了post参数里的student和data区别和控制器名字Value和Values,其他没有差别,而且改成student也没用

godcloudy | 园豆:18 (初学一级) | 2020-12-03 15:03

@godcloudy:
Value 的部份是我拼錯了哈哈
如果這樣傳你的API 還是接不到
建議你把Route 貼出來看看

RosonJ | 园豆:4910 (老鸟四级) | 2020-12-03 15:04

@RosonJ: Route没有改过默认的

godcloudy | 园豆:18 (初学一级) | 2020-12-03 15:11

@godcloudy:
那我有疑問
預設的Route 怎麼將你的請求從api/Values 映射到 Post
沒有特別設定的話,你的請求Url 應該是"Controller名稱/Post"才對啊

RosonJ | 园豆:4910 (老鸟四级) | 2020-12-03 15:15

@RosonJ: 我用的框架是.net framework,不是.net core,我的方法名字是POST就会自动匹配,api一开始设计就是根据语义匹配方法,.net core好像要在方法上加特性

godcloudy | 园豆:18 (初学一级) | 2020-12-03 15:23

@godcloudy:
你的Controller名稱是?

RosonJ | 园豆:4910 (老鸟四级) | 2020-12-03 15:33

@RosonJ: Values

godcloudy | 园豆:18 (初学一级) | 2020-12-03 15:38

@godcloudy:

WebAPI 預設的參數規則如表格
如果要讓基本型別(如你案例中的Id)可以從Body傳送,可以加上[FromBody]

RosonJ | 园豆:4910 (老鸟四级) | 2020-12-03 16:03

@RosonJ:给int Id也加上的话报错就成了这样

godcloudy | 园豆:18 (初学一级) | 2020-12-03 16:23

@godcloudy:
目前測試最優解應該是如下
Model

public class Parameter
{
    public int Id { get; set; }

    public Student student { get; set; }
}

public class Student
{
    public int Id { get; set; }

    public string Name { get; set; }
}

API

public IEnumerable<Student> Post(Parameter param)
{
    return new List<Student>
    {
        new Student
        {
            Id = 1,
            Name = "Test"
        }
    };
}

JS

$.post("/api/Values", { Id: 77, student: { Id: 66, Name: 'sadf' } }, function(data){
    //...
});

問題在於WebAPI對多參數的支援不夠靈活,建議改變實作方式

RosonJ | 园豆:4910 (老鸟四级) | 2020-12-03 16:35

@RosonJ: 正解!感谢感谢

godcloudy | 园豆:18 (初学一级) | 2020-12-03 16:41
其他回答(3)
-1

把Id写道post参数列表,需要跟Student封装成一个类

不知道风往哪儿吹 | 园豆:2035 (老鸟四级) | 2020-12-03 13:21

请问怎么封装

支持(0) 反对(0) godcloudy | 园豆:18 (初学一级) | 2020-12-03 14:40
0

断点看看,是不是进入都到这个方法里去了,感觉压根不是这个方法

刘下来 | 园豆:919 (小虾三级) | 2020-12-03 14:11

确实没有进入这个方法,提示Status Code: 405 Method Not Allowed ,应该是参数不匹配,但是我这样写确实是把Id和student属性值都传过去了,,

支持(0) 反对(0) godcloudy | 园豆:18 (初学一级) | 2020-12-03 14:43

@godcloudy: 看看进入到哪个方法中去了,你现在都没进去,怎么知道传过去了,还有用JSON.stringify把你的参数包起来

支持(0) 反对(0) 刘下来 | 园豆:919 (小虾三级) | 2020-12-03 14:55
0

 是不是路由定向错了?

华临天下 | 园豆:1501 (小虾三级) | 2020-12-03 14:18

没有错,报错显示"Message":"请求的资源不支持 http 方法“POST”,似乎是和参数不匹配

支持(0) 反对(0) godcloudy | 园豆:18 (初学一级) | 2020-12-03 14:39

api里只有一个post方法

支持(0) 反对(0) godcloudy | 园豆:18 (初学一级) | 2020-12-03 14:45

@godcloudy: 新建的时候,人家默认的路由配置,你可以修改成你想要的的

 
支持(0) 反对(0) 华临天下 | 园豆:1501 (小虾三级) | 2020-12-03 14:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册