2016-05-11 6 views
0

Я создал 3 метода для проверки маршрутизации атрибутов.
Мои методы GET, похоже, работают, но я не понимаю, как заставить мой почтовый метод работать.Проблема маршрутизации или параметр?

Является ли мой маршрут неправильным для метода post или я неправильно передаю неправильные данные методу?

Мой контроллер:

[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 
     } 
    } 

В моих JS У меня есть:

$.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 

UPDATE:

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

UPDATE 2:

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

     } 

var data = "<root><name>Bob</name></root>"; 
     $.post('api/myTest/NewJob/', data) 
     .done(function (result) { alert("done"); }) 
     .fail(function (xhr, status, err) { 
      alert(xhr.responseText); 
     }); 
+0

Параметр 'NewJob' должен быть типа' string'. – aff

+0

Какая ошибка? есть дополнительная информация, следующая за ошибкой «Fails 404» –

+0

Я просто вижу 404 - Не найдено – PrivateJoker

ответ

1

Прямо от webapi Attribute Routing documentation и есть таблица поддерживаемых ограничений тоже по той же ссылке.

Маршрутные Ограничения

Маршрутные ограничения позволяют ограничить, как параметры в шаблоне маршрута совпадают. Общий синтаксис «{параметр: constraint}». Например:

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

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

Здесь первый маршрут будет выбран только тогда, когда «идентификатор» сегмент URI представляет собой целое число. В противном случае будет выбран второй маршрут.

В случае XML, вы не проходя никаких данных через URL, так это то, как ваш маршрут

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

и указать XML в JQuery POST

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

+0

Все еще получаю 404 - См. Edit – PrivateJoker

+0

@JDS вы можете проверить изменения – brykneval

+0

Спасибо! Теперь он делает этот звонок. – PrivateJoker

0

Что происходит, так это то, что ваш клиент отправляет запрос, который должен соответствовать действию с именем NewJob, но тип параметра, который ожидает ваше действие, имеет тип HttpRequestMessage, а параметр в запросе - string.

Так изменить действие для этого:

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

Он должен теперь работает.

+0

Разве это не то же самое, что у меня выше? – PrivateJoker

+0

Ах, наши комментарии и изменения перечеркнуты. – PrivateJoker

+0

Я все еще получаю 404 ... – PrivateJoker

Смежные вопросы