2013-03-26 4 views
0

У меня есть вызов ajax. Я хотел бы стать перекрестным доменом, как я могу это сделать? Скрипт нижеСделать перекрестный домен ajax

$.ajax({ 
     type: "GET", 
     url: url, 
     data: {sendername: sendername, email: email, subject: subject, message: message}, 
     dataType: "jsonp", 
     crossDomain: "true", 
     success: function (data) { 
      if (data == 'success') { 
       // show thank you remember to add a dialog inside 
       $contactpage.find('.contact-thankyou').show(); 
       $contactpage.find('.contact-form').hide(); 
      } else { 
       alert('Unable to send your message. Please try again.'); //remember to add a dialog inside 
      } 
     } 
    }); 

URL возвращает следующую echo json_encode($result); значение $result может быть успешным в случае успеха, и что-нибудь еще, если безуспешными.

РНР заканчивается этим echo $_GET['callback']."(".json_encode($result).");";

+0

Установка 'crossDomain: true' не будет работать магически, если заголовок CORS не установлен на хосте. Это должно быть автоматически обнаружено. –

+0

Возможный дубликат [JQuery ajax cross domain] (http://stackoverflow.com/questions/3506208/jquery-ajax-cross-domain) – Nix

+1

@AndrewMao ok не уверен, что заголовок CORS, но у меня есть много других скриптов, которые работа перекрестного домена, и единственная разница, которую я вижу, заключается в том, что существует тип данных обратного вызова и jsonp datatype –

ответ

0

Вы можете запросить и получить JSONP ТОЛЬКО ЕСЛИ веб-сервис вы ударяете настроен для междоменного доступа, так что ваш Аякса вызов должен быть правильным и вебсервис должен быть правильно.

Аякса вызов

  $.ajax({ 
      type: "GET", 
      cache: false, 
      dataType: 'jsonp', 
      // we are setting base_url at the top, like http://www.MyDomain.com/MyPage.svc/ 
      url: base_url + "GetGfeQuote?strJsonRequestObject=" + JSON.stringify(LoadedGetQuoteObject()), 
      contentType: "text/plain", 
      success: function (theJson) { 
       // I make sure I got json 
       if (theJson.indexOf('{') > -1) { 
        glb_the_quote = $.parseJSON(theJson); 
        if (glb_the_quote.errorMessage.length == 0) { 
         PopulateResultsPage();        
        } else { 
         alert('There was an error getting the quote: ' + glb_the_quote.errorMessage); 
        } 
       } else { 
        alert(theJson) 
       } 
      }, 
      error: function (req, status, error) { 
       if(status == "timeout"){ 
        ShowNoInternetConnectionWarning(); 
       } else { 
        alert("There was an internet error = " + status + ", " + error); 
       } 
      }, 
      // this gives the webservice 7 seconds to return 
      timeout: 7000 
     }); 
     // end ajax; 

Сейчас вебсервис: В какой-то момент казалось, что я должен был иметь веб-конфигурации, правильно настроить, в том же директории, что и код WebService - в SVC-файл - так что это то, что я делаю.

Это все, что я положил в мой SVC файл:

<%@ ServiceHost Language="C#" Factory="System.ServiceModel.Activation.WebServiceHostFactory" Debug="true" Service="gfeWebService.ws.wsGfe" CodeBehind="wsGfe.svc.cs" %> 

И WebConfig должен иметь такие вещи, как следующее (обратите внимание crossDomainScriptAccessEnabled = "истинный")

<system.serviceModel> 
      <behaviors> 
        <endpointBehaviors> 
         <behavior name="webHttpBehavior"> 
          <webHttp /> 
         </behavior> 
        </endpointBehaviors> 
       </behaviors> 

       <bindings> 
        <webHttpBinding> 
         <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" /> 
        </webHttpBinding> 
       </bindings> 

       <!-- the names have to be fully qualified. If you get an error that says, I can't find blah blah, you don't have the names right --> 
       <services> 
        <service name="gfeWebService.ws.wsGfe"> 
         <endpoint address="" 
            binding="webHttpBinding" 
            bindingConfiguration="webHttpBindingWithJsonP" 
            contract="gfeWebService.ws.IwsGfe" 
            behaviorConfiguration="webHttpBehavior" 
         > 
         </endpoint> 
        </service> 
       </services> 

</system.serviceModel> 

Советы

  • положил точку останова в вас код js возле строки url: возьмите значение, которое заканчивается в URL: ... другими словами, захватить, как это решает

    base_url + "GetGfeQuote? StrJsonRequestObject =" + JSON.stringify (LoadedGetQuoteObject())

и вставить его в адресную строку вашего браузера. Таким образом вы получаете более значимое сообщение об ошибке.

  • У Fiddler работает, пока вы работаете над этим, и проверьте, что отправляется n.

НТН

+0

OP использует PHP –

0

Вы можете использовать YQL обойти CORS, до тех пор, пока вы только делаете запросы GET, а не с помощью сессий или что-нибудь хитрое.

$.getJSON("http://query.yahooapis.com/v1/public/yql?" + 
     "q=select%20*%20from%20html%20where%20url%3D%22" + encodeURIComponent(base_url + "GetGfeQuote?strJsonRequestObject=" + JSON.stringify(LoadedGetQuoteObject())) + 
     "%22&format=xml'&callback=?", 
     function (theJson) { 
      // ... 
     } 
    ); 
+0

жаль, что я не хочу использовать этот API –

+0

с точки зрения php есть что-то, что мне нужно включить в мой php-скрипт, видя, что у меня нет способа фактически «получать» данные, отправленные в службу. Однако в firebug я даже не дошел настолько далеко, чтобы добраться до веб-службы –

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