междоменная проблема с Jquery - PullRequest
6 голосов
/ 13 января 2012

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

Я искал в Интернете, и там так много статей, но ни одна из них не читается таким новичком, как я.: (

Может кто-нибудь помочь мне, как получить доступ к веб-сервису ??

следующий мой код.

//variables for Add Contacts
var addAccountServiceUrl = 'http://crm.eyepax.net/organization.asmx?op=WriteOrg'; // Preferably write this out from server side
var OrganizationID=123;
var ParentID=123    ;
var AccountManagerID="123";
var OrganizationName="Testapple";
var IncorporationNo="23";
var PostAddress="asdfklj asldfj";
var CountryID="LK";
var VisitAddress="asldkf asldkf asldfas dfasdf";
var VisitCountryID="LK";
var VisitSwithboard="242344";
var VisitFax="234234";
var Www="http://www.eyepax.com";
var Active=true;
var RegBy=345345345345;
var ConfigurationCode="28BC9CC3@BFEBFBFF0001067A";
var Flag=1;
var LicenceOrganazationID=1;
var sErr;

function addContact()
{
//this is to be commented soon! 
alert("function called");
//update the webservice soapmesg

var soapMessage =
'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> \
<soap:Body> \
    <WriteOrg xmlns="http://eyepax.crm.com/Organization"> \
      <OrganizationID>'+OrganizationID+'</OrganizationID> \
      <ParentID>'+ParentID+'</ParentID> \
      <AccountManagerID>'+AccountManagerID+'</AccountManagerID> \
      <OrganizationName>'+OrganizationName+'</OrganizationName> \
      <IncorporationNo>'+IncorporationNo+'</IncorporationNo> \
      <PostAddress>'+PostAddress+'</PostAddress> \
      <CountryID>'+CountryID+'</CountryID> \
      <VisitAddress>'+VisitAddress+'</VisitAddress> \
      <VisitCountryID>'+VisitCountryID+'</VisitCountryID> \
      <VisitSwithboard>'+VisitSwithboard+'</VisitSwithboard> \
      <VisitFax>'+VisitFax+'</VisitFax> \
      <Www>'+Www+'</Www> \
      <Active>'+Active+'</Active> \
      <RegBy>'+RegBy+'</RegBy> \
      <ConfigurationCode>'+ConfigurationCode+'</ConfigurationCode> \
      <Flag>'+Flag+'</Flag> \
      <LicenceOrganazationID>'+LicenceOrganazationID+'</LicenceOrganazationID> \
    </WriteOrg> \
  </soap:Body> \
</soap:Envelope>';

$.ajax({
url: addAccountServiceUrl,
type: "POST",
dataType: "xml",
data: soapMessage,
success: endAddContact,
error: function(jqXHR, textStatus, errorThrown) {alert("failure"); console.log(textStatus);console.log(errorThrown);},
contentType: "text/xml; charset=\"utf-8\""
});

return false;
}

function endAddContact(xmlHttpRequest, status)
{
    console.log(xmlHttpRequest);
    console.log(status);
    alert("webservice called!");
 $(xmlHttpRequest.responseXML)
    .find('WriteOrgResponse')
    .each(function()
 {
   var orgres = $(this).find('WriteOrgResult').text();
   var error = $(this).find('vstrError').text();

   alert(orgres +' -'+ error);
 });

 var a = $(xmlHttpRequest.responseXML).find('WriteOrgResult');
 var b = $(xmlHttpRequest.responseXML).find('vstrError');
 console.log("a"+a.text());
 console.log("b"+b.text());
}

Ответы [ 2 ]

5 голосов
/ 13 января 2012

Браузеры не разрешают междоменные вызовы AJAX. Разрешены только междоменные JSONP запросы.

Чтобы использовать запросы JSONP, необходимо изменить свойство dataType на jsonp. Это означает, однако, что вы не можете запрашивать XML, а только JSONP.


Немного о JSONP:

Тег <script> обходит междоменные ограничения. Это означает, что вы можете использовать этот тег для получения данных с других серверов. Этот тег не поддерживает все виды языков, поэтому XML не поддерживается.

JSONP - это, в основном, JSON, но с вызовом функции вокруг него так:

functionname({"property":"value"})

Я вижу, вы удивляетесь: «Что там делает это имя функции?»

В этом ИМЕННО разница с JSON. Поскольку функция обернута вокруг нее, вы можете использовать фактические данные!

<script type="text/javascript">
var functionname = function(json) {
    alert(json.property);
}
</script>
<script type="text/javascript" src="http://www.domain.com/jsonp"></script>

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

<script type="text/javascript">
var functionname = function(json) {
    alert(json.property);
}

functionname({"property":"value"});
</script>

Хотите верьте, хотите нет, но эта небольшая разница фактически позволяет нам сделать междоменные запросы намного безопаснее.

Еще одна тема о JSONP

3 голосов
/ 13 января 2012

Для междоменной связи с использованием Javascript вам нужно либо использовать локальный прокси-сервер для передачи запросов во внешние домены, либо использовать JSON с отступом, также известный как JSONP .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...