Перевести PHP cURL в JavaScript (подключиться к службе WCF)

0

У меня есть API WCF, с которым я должен подключиться. У меня нет доступа к его коду, но это работает:

$user = "login";

$password = "pwdstr";
$service_credentials = "external_api_user:sometext";

$arg = $user.'|'.sha1($user."somestr".$password);
$url='https://mysteryUrl.svc/projectsapi/' . $arg;

// Get cURL resource        
$curl = curl_init();
// Set some options - we are passing in a useragent too here        
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => $url,
    CURLOPT_USERAGENT => 'Codular Sample cURL Request',
    CURLOPT_HTTPHEADER => array("Authorization: " . base64_encode("Basic " + service_credentials))));
// Send the request & save response to $resp        
$resp = curl_exec($curl);
// Close request to clear up some resources        
curl_close($curl);
echo $resp;  

И я хотел бы, чтобы моя веб-страница получала данные от одного и того же api. Пока мне это удалось:

function requestFromApi() {
    var user = "login";
    var password = "pwdstr";
    var service_credentials = "external_api_user:sometext";
    var arg = user + '|' + sha1(user + "somestr" + password);
    var url = 'https://mysteryUrl.svc/projectsapi/' + arg;

    $.ajax({
      url: url,
      beforeSend: function(xhr) { 
        xhr.setRequestHeader("Authorization",  base64_encode("Basic " + service_credentials));
        xhr.setRequestHeader("User-Agent",'Codular Sample cURL Request');
      },
      type: 'GET',
      dataType: 'json',
      contentType: 'application/json',
      success: function (data) {
        alert(JSON.stringify(data));
      },
      error: function(){
        alert("Cannot get data");
      }
      });
};

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

Консоль Chrome выдает это при загрузке страницы:

Refused to set unsafe header "User-Agent" 
 XMLHttpRequest cannot load http s://verylongUrlAsInTheCodeAbove. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 400. 

Как настроить заголовок? Мне кажется, что хотя бы одна из проблем пытается получить доступ к другому домену, так как я могу это сделать?

Есть ли другой способ получить доступ к этому API с помощью JavaScript? Может ли сделать немой PHP-API, который в основном просто повторит мою работу с данными? Я открыт для предложений. Заранее спасибо!

EDIT: Я использовал JSONP:

 <head>

    <script type="text/javascript" src="js/jquery-2.1.1.js"></script>
    <script type="text/javascript" src="js/jquery.mobile-1.4.5/jquery.mobile-1.4.5.js"></script>
    <script type="text/javascript" src="js/functions.js"></script>

    <script>
    alert('1');
        $(document).ready(function requestFromApi() {
        var user = "login";
        var password = "pwdstr";
        var service_credentials = "external_api_user:sometext";
        var arg = user + '|' + sha1(user + "somestr" + password);
        var url='https://mysteryUrl.svc/projectsapi/' + arg;

       $.ajax({
        url: url+"?callback=?",
        beforeSend: function(xhr) { 
          xhr.setRequestHeader("Authorization",  base64_encode("Basic " + service_credentials) );
          xhr.setRequestHeader("User-Agent",'Codular Sample cURL Request');
            },
        type: 'GET',
        dataType: 'json',
        contentType: 'application/json',
        success: function (dataWeGotViaJsonp) {
            alert(dataWeGotViaJsonp);
        },
        error: function(){
          alert("Cannot get data");
        }
        });

        });
        alert('2');
    </script>

</head>

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

Теги:
curl
wcf

1 ответ

1
Лучший ответ

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

Пример того, как включить CORS в WPF: http://enable-cors.org/server_wcf.html.

  • 0
    Спасибо :) Я использовал JSONP, и я где-то получаю - теперь я получаю ошибку неверного запроса, но это по крайней мере означает, что я отправляю что-то и получаю что-то обратно. Больше кода в моем редактировании начального сообщения!
  • 0
    Кроме того, мой php находится в другом домене, чем wcf, поэтому я не думаю, что нужно что-либо менять на стороне wcf. Я прав?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню