Различать запрос HTTP и запрос Ajax

В настоящее время я работаю над ASP.NET WebApi и Angularjs

У WebApi есть метод

[System.Web.Http.AcceptVerbs("POST")]
 [System.Web.Http.HttpPost]
 public HttpResponseMessage SearchAddress(SearchDetails searchDetail)
 {
 //13.03993,80.231867
 try
 {
 if (!WebSecurity.IsAuthenticated)
 {
 HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.NotAcceptable);
 return response;
 }
 List<collegeaddress> CollegeAddress = addressService.GetAddressFromDistance(17.380498, 78.4864948, 2000);
 HttpResponseMessage responseData = Request.CreateResponse(HttpStatusCode.Accepted, CollegeAddress);
 return responseData;
 }
 catch (Exception e)
 {
 HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.NotFound);
 return response;
 }
 }
</collegeaddress>

И я должен вызвать этот метод с клиентской стороны.

Когда я вызываю этот метод с помощью Ajax, он не работает, параметр метода searchDetail всегда равен null, если я использую Ajax.

$.ajax({
 method: 'POST',
 url: rootUrl + '/api/Address/SearchAddress',
 async: false,
 data: searchDetail,
 type: "json",
 headers: {
 'Content-Type': "application/json; charset=utf-8"
 }
 }).success(function (response) {
 return response;

 }).error(function () {
 toastr.error('Somthing is wrong', 'Error');
 })

Но когда я вызываю этот метод через HTTP запрос, он работает.

$http({
 method: 'POST',
 url: rootUrl + '/api/Address/SearchAddress',
 data: searchDetail,
 headers: {
 'Content-Type': "application/json; charset=utf-8"
 }
 }).success(function (response) {
 toastr.success('Account Created successfully!', 'Account Created');
 return response;
 }).error(function () {
 toastr.error('Somthing is wrong', 'Error');
 })

<span>Зачем?</span> <span>В чем разница между ними?</span> <span>Почему Ajax не работает и HTTP?</span>

3 ответа

jQuery ajax() отправляет данные с Content-type: x-www-form-urlencoded. Угловой $http отправляет данные с Content-type: application/json

Очевидно, что ваш сервер ожидает JSON, но для этого неправильно $.ajax() вызов $.ajax().

Согласно документам:

  • Свойство method, похоже, не существует.
  • Свойство type должно определять тип запроса (например, "GET", "POST" и т.д.).
  • Чтобы изменить тип контента по умолчанию на application/json вы можете использовать свойство contentType.

Я сам не пробовал, но что-то вроде этого должно работать:

$.ajax({
 type: 'POST',
 url: rootUrl + '/api/Address/SearchAddress',
 async: false,
 data: searchDetail,
 contentType: 'application/json; charset=utf-8'
});


$.ajax({
 method: 'POST',
 url: rootUrl + '/api/Address/SearchAddress',
 async: false,
 data: searchDetail,

Я предполагаю, что searchDetail является объектом. Это то, что говорят документы о свойстве data:

... Он преобразуется в строку запроса, если не является уже строкой.

Поэтому, если сервер ожидает JSON, вам нужно сначала преобразовать его в JSON:

data: JSON.stringify(searchDetail),

А поскольку @ExpertSystem указала, что вам нужно изменить method для type.


Сначала вы дублируете HttpPost, поэтому просто держите второй (и удаляете пространство имен). Во-вторых, вы хотите, чтобы детали поиска приходили из тела, чтобы украсить его с помощью [FromBody]

[HttpPost]
 public HttpResponseMessage SearchAddress([FromBody]SearchDetails searchDetail)
 {

licensed under cc by-sa 3.0 with attribution.