2013-06-06 2 views
2

Я пытаюсь научиться программировать веб-сервис с ServiceStack и называть его через ajax в JavaScript. Я сделал это, наблюдая за фильмами с множественным числом изображений, и я думаю, что я почти понял, как это сделать, кроме передачи данных в качестве параметров с помощью служебного вызова.

Я пытаюсь вызвать службу с этим Ajax-вызов:

var request = { }; 
    request.Amount = 32; 

    $.ajax({ type: 'POST', 
      contentType: 'application/jsonp; charset=utf-8', 
      url: "http://localhost:1879/entry", 
      dataType: 'jsonp', 
      data: {request: request}, 
      success: function(result){ 
       alert(result.Id); 
      }}); 

Служба выглядит следующим образом:

public class EntryService : Service 
{ 
    public object Post(Entry request) 
    { 
     return new EntryResponse() { Id = request.Amount }; 
    } 
} 

[Route("/entry", "POST")] 
public class Entry 
{ 
    public int Amount { get; set; } 
} 

public class EntryResponse 
{ 
    public int Id { get; set; } 
} 

Я ожидаю, что предупреждение в обратный вызов, чтобы показать номер 32, но он показывает число 0. И когда я отлаживаю свою службу, я вижу, что request.Amount равно 0, поэтому я думаю, что я делаю что-то неправильно в вызове службы Ajax, но я не могу понять, что. Поэтому мне интересно, что я делаю неправильно здесь.

+0

ли вы настроите ваш сервис, чтобы быть совместимым с JSONP в JQuery? Вы знаете, что обработчик обратного вызова имеет определенное имя и т. Д. – adrian

+0

Две вещи, которые нужно попробовать: 1) попробуйте изменить данные: {запрос: запрос} на данные: запрос 2), если вам нужно jsonp добавить SetConfig (новый EndpointHostConfig {AllowJsonpRequests = true}); к вашему AppHost (https://github.com/ServiceStack/ServiceStack/wiki/Configuration-options) – paaschpa

+0

(В ответ на ваш удаленный ответ) Возможно, вы слишком усложняете вещи? То, что вы пытаетесь сделать, совсем не сложно. Я вернусь к более старым техникам и попробую попробовать asmx или page methods. Они работают с jQuery.Кстати, вам не нужен другой порт для веб-службы. –

ответ

1

Вы не можете писать сообщения с JsonP. Если вы пытаетесь выполнить кросс-доменную POST, вам нужно посмотреть на корс и убедиться, что она включена для службы, к которой вы отправляете POST.

Post data to JsonP

+0

Я нашел вариант jsonp в качестве решения для того, чтобы вообще не получать предупреждения от обратного вызова ajax. поэтому я изменил json на jsonp. Если я изменю его обратно на json, я не вижу предупреждения вообще. У меня нет большого опыта, когда речь идет о веб-сервисах, поэтому я не знаю, пытаюсь ли я делать перекрестный домен или нет. Все, что я хочу, это веб-служба, которую я могу вызвать с параметрами, могу что-то сделать с этими параметрами и получить ответ от веб-службы с некоторым результатом, основанным на параметрах или сообщении, независимо от ситуации. – Cornelis

+0

Итак, что, если вы пытаетесь подключиться к службе в другом домене (когда у вашего веб-сервиса нет того, к чему вы пытаетесь подключиться к нему как части одного и того же домена url), вам необходимо включить cors, чтобы правильно выполнять перекрестный домен ajaxing , Можете ли вы дать мне более полное представление о том, с какой настройкой вы работаете (какой веб-сервис вы пытаетесь получить и откуда вы пытаетесь получить к нему доступ)? –

+0

Для веб-сайта, который я хочу построить в будущем, я хочу, чтобы коммуникация действовала так (или что-то еще возможно). У меня есть веб-сайт: http://www.mywebsite.com, который построен в html + jquery + angular js. Я также получил веб-сервис, размещенный в том же домене: http://www.mywebsite.com/mywebservice/ (и если требуется номер порта, он добавлен c.). Через $ .ajax я пытаюсь получить и передать данные в этот веб-сервис, который обрабатывает данные и возвращает данные, когда это необходимо. И чтобы узнать, как настроить связь, я пытаюсь сделать это с помощью кода в моем первом сообщении, где входным является вывод. – Cornelis

1

Я только использовал JSONP, потому что я прочитал и выразил надежду, что это может быть решением для моей проблемы. Но, основываясь на ваших объяснений я не нужен, так что я изменил код так:

var request = { }; 
    request.Amount = 32; 

    $.ajax({ type: 'POST', 
      contentType: 'application/json; charset=utf-8', 
      url: "http://localhost:1879/json/reply/Entry", 
      dataType: 'json', 
      data: request, 
      success: function(result){ 
       alert(result.Id); 
      }, 
      error: function(xhr, ajaxOptions, thrownError){ 
       alert("Failure!"); 
       alert(xhr.status); 
       alert(thrownError); 
      }}); 

Сначала я должен был этот вызов без части ошибок и ничего не произошло, не тревога, нет ошибки, ничего. Поэтому я предположил, что ошибка была израсходована вместо показа, поэтому я добавил обратный вызов ошибки, и мое предположение оказалось правильным. Теперь я получаю 3 предупреждения, а последние 2 предупреждения показывают «400» и «плохой запрос».

Я искал эти ошибки и пытался, но ни одно из возможных решений, которые я нашел, не исправил мою проблему. Я попробовал 2 urls:/json/reply/Entry и/entry после части localhost, но оба они не работали. Так что я делаю неправильно?

+0

Если вы используете конечную точку ServiceStack по умолчанию «api», попробуйте http : // localhost: 1879/api/Entry –

+0

Спасибо за помощь, но она не работает. Если я изменил URL-адрес на то, что вы предлагали, я получаю ошибку 404. Как я могу выяснить, использую ли я конечную точку ServiceStack по умолчанию? – Cornelis

+0

Зависит от того, как вы размещаете - если вы размещаете через ASP.NET, проверьте свой web.config. Вы должны увидеть настройку обработчика http с помощью path = "api *". Если это просто path = "*", попробуйте localhost: 1879/Entry. Проверьте эту страницу https://github.com/ServiceStack/ServiceStack/wiki/Create-your-first-webservice - а также попытайтесь найти свою страницу метаданных (localhost: 1879/api/metadata) –

2

автор этого курса Pluralsight здесь. Надеюсь, я могу вам помочь.

Первое, что вам нужно сделать, это убедиться, что API работает правильно.

Перейдите по этой ссылке: http://localhost:1879/entry В вашем веб-браузере вы должны увидеть страницу с информацией о сервисе. Если вы не ошибаетесь в своем URL-адресе или неправильно настроен ServiceStack.

Предполагая, что URL-адрес верен, все, что вам нужно сделать, это обернуть ваши данные в JSON.Stringify(). Когда вы делаете сообщение, данные должны быть в формате JSON в виде строки JSON. Вы отправляете объект JSON.

Кроме того, скорее всего, вы можете упасть немного LOCALHOST от вашего URL в вызове $ .ajax и просто сделать «запись»