如何在c#中定义和调用api Post

时间:2015-03-12 21:11:42

标签: c# asp.net-web-api

我之前在MVC中创建了POST / GET请求。

在我的HomeController中

    [HttpPost]
    public string Index(int Value)
    {
        return Value.ToString();
    }

使用表单数据

设置chrome扩展名POSTMAN

我可以使用值为'1'的变量'Value'调用http://localhost/mvcApp/并获得字符串'1'作为回报​​

但是,当我致电surveyController : ApiController

时,我创建http://localhost/mvcApp/api/survey/时无效
    public string Post(int Value)
    {
        return Value.ToString();
    }
  

“消息”:“找不到与请求URI'http://localhost/mvcApp/api/survey/'匹配的HTTP资源。”,

     

“MessageDetail”:“未在与请求匹配的控制器'调查'中找到任何操作。”

我不确定错误是否与api的创建方式有关,或者是POSTMAN尝试调用api的方式。因为'.'

也可以尝试我的HomeControler索引

client.BaseAddress = new Uri("http://localhost/mvcApp");
var result = client.PostAsync("/api/survey", new
{
   Value = 1                    
}, new JsonMediaTypeFormatter()).Result;

if (result.IsSuccessStatusCode) // here return Not found

2 个答案:

答案 0 :(得分:3)

WebApi控制器的惯例与普通的'MVC控制器'不同。

基本上问题是你不能像你那样指定int参数。

在你的WebApi控制器中试试这个:

// nested helper class
public class PostParams {
    public int Value { get; set; }
} 

public string Post(PostParams parameters) {
    return parameters.Value.ToString();
}

看看它是如何运作的。

这是一篇关于将POST请求中的参数传递给WebAPI控制器的详尽文章: Passing-multiple-POST-parameters-to-Web-API-Controller-Methods

长话短说,这些是惯例,粗略地说:

  • 无法在参数
  • 中捕获POST表单名称 - 值对
  • 如果该类是您方法参数之一的参数类型,则可以在类的属性中捕获它们
  • 可以捕获方法参数中的查询参数

修改

如果您希望使用C#测试WebAPI服务器,可以按照以下步骤操作:

  1. 创建一个漂亮的控制台应用程序(最好在同一个解决方案中)
  2. Web API Client NuGet包添加到此控制台应用程序
  3. 让你的Program.cs做这样的事情。
  4. 以下代码使用C#5.0 async and await运算符。 它还使用Task类和anonymous types。 我已经指出官方MSDN文章(点击链接)你应该对这些东西感兴趣。

    using System.Net.Http;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1 {
        class Program {
    
            public static void Main(string[] args) {
                Test().Wait();
            }
    
            private static async Task Test() {
                HttpClient client = new HttpClient();
    
                await client.PostAsJsonAsync(
                    "http://localhost/mvcApp/api/survey/",
                    new {
                        value = 10
                    }
                );
            }
    
        }
    }
    

答案 1 :(得分:0)

这并不容易。经过大量的阅读后,我就这样解决了。

首先,api控制器需要使用[FromBody]属性

定义输入参数
// POST api/survey
public void Post([FromBody]string value)
{
}

为了测试我在视图中放了一个按钮并使用Ajax / Post,变量名在变量值之前需要是一个空字符串。

$(document).ready(
    $('#post').click(function () {
        var url = 'http://localhost/mvcApi/api/survey';
        var data = { "": 'Hola' };  // Define a simple variable this way

        $.ajax({
            type: "POST",
            url: url,
            data: data,
            success: sucess
            }
        });
    })

或者如果你想发送多个值

data = { "": ["update one", "update two", "update three"] }; 

enter image description here

但是如果你想要收到一个对象

public void Post(Survey data)
{
   string value = data.Value.ToString();
}

$('#post').click(function () {
   ....
   var data =   { value: 25 }

此处有更多信息Sending DataBinding