路由问题或参数问题?

时间:2016-05-11 14:50:15

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

我创建了3种测试属性路由的方法 我的2 GET方法似乎正在运行,但我无法理解如何让我的post方法工作。

我的路线方法是错误的,还是错误地将错误的数据传递给方法?

我的控制器:

JSON

在我的JS中我有:

 [RoutePrefix("api/myTest")]
    public class JobController : ApiController
    {
        [Route("{id:int}")]
        [HttpGet]
        public string GetJob(int id)
        {
            return String.Format("Job-{0}", id.ToString());
        }

        [Route("GetJob2/{id:int}")]
        [HttpGet]
        public string GetJob2(int id)
        {
            return String.Format("New and improved Job-{0}", id.ToString());
        }

        [Route("NewJob/{data}")]
        [HttpPost]
        public HttpResponseMessage NewJob(HttpRequestMessage request)
        {
           // Read and process xml
        }
    }

更新:

$.get('api/myTest/' + $("#jobID").val())  // Works
$.get('api/myTest/GetJob2/' + $("#jobID").val()) // Works
var data = "<root><name>Bob</name></root>";
$.post('api/myTest/NewJob/', data)  // Fails 404 Error

更新2:

    [Route("NewJob/{data}")]
    [HttpPost]
    public HttpResponseMessage NewJob(string request)

2 个答案:

答案 0 :(得分:1)

直接来自webapi Attribute Routing documentation,并且在同一链接中也有受支持的约束表。

路线约束

  

路径约束允许您限制路径模板中的参数匹配方式。一般语法是&#34; {parameter:constraint}&#34;。例如:

[Route("users/{id:int}"]
public User GetUserById(int id) { ... }

[Route("users/{name}"]
public User GetUserByName(string name) { ... }
  

此处,只有&#34; id&#34;才会选择第一条路线。 URI的一个整数。否则,将选择第二条路线。

如果是XML,则不会通过url传递任何数据,因此这就是您的路径

[Route("NewJob")]
[HttpPost]
public HttpResponseMessage NewJob(HttpRequestMessage data)
{
               // Read and process xml
}

并在jQuery POST中指定xml

var url = "";
var data = "";
$.ajax({
            contentType: "text/xml",
            dataType: "xml",
            type: "post",
            url: url,
            data: data
        });

此外,您之前的电话是

$.post('api/myTest/NewJob/', data) it should be '+' instead of ','
$.post('api/myTest/NewJob/'+ data) 

较低的一个会给url无效,即400而不是404

答案 1 :(得分:0)

您的客户端发送的请求应与NewJob名称的操作匹配,但您的操作所期望的param类型为HttpRequestMessage类型,请求中的参数属于string类型。

所以将动作更改为:

    [Route("NewJob/{data}")]
    [HttpPost]
    public HttpResponseMessage NewJob(string data)
    {
       // Read and process xml
    }

现在应该可以了。