【问题标题】:Api lost lost paramApi 丢失了丢失的参数
【发布时间】:2017-02-23 00:28:06
【问题描述】:

嗨,我有这段代码来运行我的 api 方法

export class MessageService {

    constructor(private http: Http) {

    }

    addMessage(textToSend: string) {
        return this.http.post("/api/SendMessage", textToSend); //<- Everytime i have some text in textToSend and this is ok 
    }
}

在我的 Api 之后,我的参数等于 null

[HttpPost]
[Route("/api/SendMessage")]
public void SendMessage(string msg) //null value
{
    //some code
}

【问题讨论】:

  • 当然它不会传递任何参数,它是您在方法中请求的查询参数

标签: c# api angular asp.net-core


【解决方案1】:

您的控制器操作正在接受查询参数,而不是路由器参数或模型。

如果你想接受一个路由参数,你需要将它添加到路由中。

如果要在body中传递模型或值,必须用[FromBody]属性标记参数。

[HttpPost]
[Route("/api/SendMessage")]
public void SendMessage([FromBody]string msg)
{
    MessageBox MsgBox = new MessageBox();
    MsgBox.AddMsgToMsgBox(msg);
}

如果您没有定义任何内容,控制器希望参数作为查询 /api/SendMessage?msg=someMessage 传递(您不应该在 REST 服务中这样做,因为它不是很“RESTful”

【讨论】:

    【解决方案2】:

    可能的解决方案1:

    addMessage(textToSend: string) {
        let body = JSON.stringify({ textToSend });
        let headers = new Headers({ 'Content-Type': 'application/json' });
        let options = new RequestOptions({ headers: headers });
    
        return this.http.post("/api/SendMessage/", body, options);
    }
    
    // Server side -1
    [HttpPost]
    [Route("/api/SendMessage")]
    public void SendMessage([FromBody]IDictionary<string, string> msg)
    {
        var textToSend = msg["textToSend"];
    }
    
    // Or create a model and use it
    
    //Server side -2
    public class Model
    {
        public string textToSend { get; set; }
    }
    public void SendMessage([FromBody]Model model)
    

    可能的解决方案2:

    addMessage(textToSend: string) {
        return this.http.post("/api/SendMessage/" + textToSend);
    }
    
    [HttpPost]
    [Route("/api/SendMessage/textToSend")]
    public void SendMessage(string textToSend)
    {
        //some code
    }
    

    【讨论】:

    • 所以我尝试了解决方案 2,我的组件将值作为 textToSend 发送。
    • 当我查看请求时在网络中看到“api/SendMessage/someTextFromMyInput”
    • 因为它将textToSend附加到url的末尾,所以它是预期的。如果您不想要这个,请尝试解决方案 1。您尝试解决方案 1 了吗?
    • 不,因为我不知道在哪里可以找到 Headers 和 RequestOptions,首先我使用第二个解决方案,在第一个解决方案中,我不知道为什么我们有 2 个具有不同参数的相同方法
    • 实际上solution-1 在服务器端有两种可能的解决方案。你可以使用你想要的。
    【解决方案3】:

    试试

     addMessage(textToSend: string) {
        return this.http.post("/api/SendMessage", msg); //<- Everytime i have some text in textToSend and this is ok 
    }
    

    更改了变量的名称以匹配您在控制器中期望的名称

    【讨论】:

    • 你知道在浏览器中运行的 TypeScript 和在服务器中运行的 C# 的区别吗?
    猜你喜欢
    • 2012-11-13
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多