Jquery ajax не вызывает действие типа публикации Web API - PullRequest
0 голосов
/ 26 мая 2018

Вот так выглядит мое действие web api.

[System.Web.Http.HttpPost, System.Web.Http.Route("BookAppointment/{email}/{id}")]
public System.Net.Http.HttpResponseMessage BookAppointment(string email, int id = 0)
{
    System.Net.Http.HttpResponseMessage retObject = null;

    if (id > 0 && email!="")
    {
        UserAppointmentService _appservice = new UserAppointmentService();
        bool success = _appservice.BookAppointment(email,id);

        if (!success)
        {
            var message = string.Format("error occur for updating data", id);
            HttpError err = new HttpError(message);
            retObject = Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, err);
            retObject.ReasonPhrase = message;
        }
        else
        {
            retObject = Request.CreateResponse(System.Net.HttpStatusCode.OK, "SUCCESS");
        }
    }
    else
    {
        var message = string.Format("doc id and emial can not be zero or blank");
        HttpError err = new HttpError(message);
        retObject = Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, err);
        retObject.ReasonPhrase = message;

    }
    return retObject;
}

Это мой код jquery ajax, который предполагает вызывать действие web api, но выдает ошибку.ошибка:

Не найден ресурс HTTP, соответствующий URI запроса 'http://localhost:58782/api/Appointments/BookAppointment'.

Мой код jjery ajax выглядит следующим образом.

    $('#tblAppointments').on('click', '#btnbook', function () {
        var docid = $(this).closest('tr').find("input[id*='hdndocid']").val();
        var email = $(this).closest('tr').find("input[id*='hdnpatientemail']").val();

        var baseurl = '@ConfigurationManager.AppSettings["baseAddress"]' + 'api/Appointments/BookAppointment';
        // + encodeURIComponent(email) + '/' + docid;
        alert(baseurl);
        $.ajax({
            url: baseurl,
            type: 'POST',
            dataType: 'json',
            contentType: "application/json",
            data: JSON.stringify({ email: encodeURIComponent(email), id: docid}),
            success: function (data, textStatus, xhr) {
                console.log(data);

            },
            error: function (xhr, textStatus, errorThrown) {
                var err = eval("(" + xhr.responseText + ")");
                alert('Error ' + err.Message);
                console.log(textStatus);
            }

        }).done(function () {


        });
    });

У меня есть только маршрут по умолчанию в конфигурации веб-API.Пожалуйста, скажите мне, какую ошибку я совершил, из-за чего она не работает.спасибо

1 Ответ

0 голосов
/ 26 мая 2018

Есть еще проблемы с вашим кодом, поэтому я постараюсь объяснить их шаг за шагом.

1. Исходя из предоставленного вами кода, вы, должно быть, украсили свой контроллер таким маршрутом, как

[RoutePrefix("api/appointments")] 

для правильного вызова метода BookAppointment.Если вы украсите свой контроллер этим атрибутом, тогда вы можете просто вызвать

http://localhost/api/appointments/BookAppointment/testemail@domain.com/1

, и метод будет вызван на 100%.

2. Следующий код:

var baseurl = '@ConfigurationManager.AppSettings["baseAddress"]' + 'api/Appointments/BookAppointment';
            // + encodeURIComponent(email) + '/' + docid;

переводится во что-то вроде

http://localhost/api/Appointments/BookAppointment

, поэтому необходимая часть (адрес электронной почты / идентификатор) не указана (поэтому выдается сообщение об ошибке).

3. Код JavaScript делаетPOST с JSON в теле, но ваш API не принимает тело JSON.Я рекомендую вам создать отдельный класс, подобный этому:

 public class BookAppointmentRequest
  {
    public string Email { get; set; }
    public int ID { get; set; }
  }

И после этого вы модифицируете метод, чтобы указать, что вы принимаете данные из тела.

[HttpPost, Route("BookAppointment")]
public HttpResponseMessage BookAppointment([FromBody] BookAppointmentRequest request)

После этого вы можете просто сделать POST для api / Appointments / BookAppointment с JSON из вашего кода JavaScript.

Я рекомендую вам использовать IHttpActionResult вместо HttpResponseMessage.См. эту ссылку.
...