Як викликати API веб-служби REST з JavaScript?


166

У мене HTML-сторінка з кнопкою на ній. Коли я натискаю на цю кнопку, мені потрібно викликати API веб-сервісу REST. Я намагався шукати в Інтернеті всюди. Ніякого поняття ні про що. Чи може хтось дати мені ведучий / Headstart з цього приводу? Дуже цінується.


Ваш дзвінок до служби REST - це лише запит на сервер, я думаю, це буде запит ajax. Використовуйте jQuery, наприклад, api.jquery.com/jquery.ajax
— ikos23

Відповіді:


172

Я здивований, що ніхто не згадав про новий API Fetch, який підтримували всі браузери, крім IE11 під час написання. Це спрощує синтаксис XMLHttpRequest, який ви бачите у багатьох інших прикладах.

API включає в себе набагато більше , але почніть з fetch()методу. Це бере два аргументи:

  1. URL-адреса або об'єкт, що представляє запит.
  2. Необов’язковий об'єкт init, що містить метод, заголовки, тіло тощо.

Простий GET:

const userAction = async () => {
  const response = await fetch('http://example.com/movies.json');
  const myJson = await response.json(); //extract JSON from the http response
  // do something with myJson
}

Відтворюючи попередню головну відповідь , POST:

const userAction = async () => {
  const response = await fetch('http://example.com/movies.json', {
    method: 'POST',
    body: myBody, // string or object
    headers: {
      'Content-Type': 'application/json'
    }
  });
  const myJson = await response.json(); //extract JSON from the http response
  // do something with myJson
}

2
Як виглядає дія кнопки з цим рішенням?
— asmaier

3
Що щодо DELETE та PUT?
— Кшиштоф

2
@asmaier Ви отримали відповідь про те, як буде виглядати дія кнопки? Спасибі
— Angel Esguerra

1
button.addEventListener('click', userAction);або<button onclick="userAction()" />
— Брендан Макгілл

105

Ваш Javascript:

function UserAction() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
         if (this.readyState == 4 && this.status == 200) {
             alert(this.responseText);
         }
    };
    xhttp.open("POST", "Your Rest URL Here", true);
    xhttp.setRequestHeader("Content-type", "application/json");
    xhttp.send("Your JSON Data Here");
}

Ваша дія кнопки ::

<button type="submit" onclick="UserAction()">Search</button>

Для отримання додаткової інформації перейдіть за наступним посиланням (оновлено 2017/01/11)


19
Синхронний XMLHttpRequest в головному потоці застарілий через його згубний вплив на досвід кінцевого користувача. Для отримання додаткової допомоги xhr.spec.whatwg.org
— jeet.chanchawat

Оскільки ви здійснюєте синхронізований дзвінок, вам потрібно зателефонувати xhttp.open("POST", "Your Rest URL Here", false);, інакше xhttp.responseText не буде містити результат. Але, як було сказано раніше, воно скоро буде застарілим.
— Олександр Феньо

Якщо це запит POST, де ви фактично публікуєте дані?
— EFC

" xhttp.setRequestHeader("Content-type", "application/json");" - Це брехня. Ви не передаєте send()метод JSON .
— Квентін

Ви відредагували цей код, щоб запит більше не був синхронним, але ви намагаєтесь прочитати відповідь так, як ніби.
— Квентін

17

Ось ще один дзвінок API REST API з аутентифікацією за допомогою json:

<script type="text/javascript" language="javascript">

function send()
{
    var urlvariable;

    urlvariable = "text";

    var ItemJSON;

    ItemJSON = '[  {    "Id": 1,    "ProductID": "1",    "Quantity": 1,  },  {    "Id": 1,    "ProductID": "2",    "Quantity": 2,  }]';

    URL = "https://testrestapi.com/additems?var=" + urlvariable;  //Your URL

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = callbackFunction(xmlhttp);
    xmlhttp.open("POST", URL, false);
    xmlhttp.setRequestHeader("Content-Type", "application/json");
    xmlhttp.setRequestHeader('Authorization', 'Basic ' + window.btoa('apiusername:apiuserpassword')); //in prod, you should encrypt user name and password and provide encrypted keys here instead 
    xmlhttp.onreadystatechange = callbackFunction(xmlhttp);
    xmlhttp.send(ItemJSON);
    alert(xmlhttp.responseText);
    document.getElementById("div").innerHTML = xmlhttp.statusText + ":" + xmlhttp.status + "<BR><textarea rows='100' cols='100'>" + xmlhttp.responseText + "</textarea>";
}

function callbackFunction(xmlhttp) 
{
    //alert(xmlhttp.responseXML);
}
</script>


<html>
<body id='bod'><button type="submit" onclick="javascript:send()">call</button>
<div id='div'>

</div></body>
</html>

ви не стикалися з проблемами між домену? Я дзвоню api, розміщений десь ще з localhost, і він надає проблеми між домену.
— Харіт Вішвакарма

Я також зіткнувся з тими ж проблемами з корсами. Plz довідка
— Нітін Вахале

@HaritVishwakarma - це буде, якщо api, яку ви телефонуєте, не має Access-Control-Allow-Origin для вашого домену (localhost). Спробуйте створити власний проксі, надішліть req до проксі і переадресуйте запит до місця призначення. Оскільки це буде зв’язок між сервером і сервером, запит не буде заблокований (CORS блокується браузерами). Відправте цю відповідь за допомогою заголовка дозволеного походження для всіх
— sss999

@HaritVishwakarma та NitinWahale та майбутні розробники ви можете відключити веб-безпеку у вашому локальному браузері лише для тестування - це не працюватиме як виробниче рішення. Посилання тут: stackoverflow.com/questions/3102819/…
— KDT

12
    $("button").on("click",function(){
      //console.log("hii");
      $.ajax({
        headers:{  
           "key":"your key",
     "Accept":"application/json",//depends on your api
      "Content-type":"application/x-www-form-urlencoded"//depends on your api
        },   url:"url you need",
        success:function(response){
          var r=JSON.parse(response);
          $("#main").html(r.base);
        }
      });
});

8

Я думаю, додати, якщо (this.readyState == 4 && this.status == 200) почекати, краще:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
       // Typical action to be performed when the document is ready:
        var response = xhttp.responseText;
        console.log("ok"+response);
    }
};
xhttp.open("GET", "your url", true);

xhttp.send();

Це не спрацює, якщо клієнт та API не знаходяться в одному домені, правда?
— Девід Броссар

0

Перш ніж ми спробуємо розмістити що-небудь на передньому кінці веб-сайту, давайте відкриємо з'єднання API. Ми зробимо це за допомогою об'єктів XMLHttpRequest, це спосіб відкрити файли та зробити HTTP-запит.

Ми створимо змінну запиту і призначимо їй новий XMLHttpRequest об’єкт. Тоді ми відкриємо нове з'єднання методом open () - в аргументах ми вкажемо тип запиту як GET, а також URL кінцевої точки API. Запит завершується, і ми можемо отримати доступ до даних всередині функції завантаження. Коли ми закінчимо, ми надішлемо запит.
// Створіть змінну запиту та призначте їй новий XMLHttpRequest об’єкт. var запит = новий XMLHttpRequest ()

// Open a new connection, using the GET request on the URL endpoint
request.open('GET', 'https://ghibliapi.herokuapp.com/films', true)

request.onload = function () {
  // Begin accessing JSON data here
  }
}

// Send request
request.send()

1
Подібні відповіді були раніше. Чому ви додали свою відповідь? Короткий опис може допомогти
— slfan

-1

Звичайний спосіб - це їхати з PHP та ajax. Але для вашої вимоги, нижче буде добре працювати.

<body>

https://www.google.com/controller/Add/2/2<br>
https://www.google.com/controller/Sub/5/2<br>
https://www.google.com/controller/Multi/3/2<br><br>

<input type="text" id="url" placeholder="RESTful URL" />
<input type="button" id="sub" value="Answer" />
<p>
<div id="display"></div>
</body>

<script type="text/javascript">

document.getElementById('sub').onclick = function(){

var url = document.getElementById('url').value;
var controller = null; 
var method = null; 
var parm = []; 

//validating URLs
function URLValidation(url){
if (url.indexOf("http://") == 0 || url.indexOf("https://") == 0) {
var x = url.split('/');
controller = x[3];
method = x[4]; 
parm[0] = x[5]; 
parm[1] = x[6];
 }
}

//Calculations
function Add(a,b){
return Number(a)+ Number(b);
}
function Sub(a,b){
return Number(a)/Number(b);
}
function Multi(a,b){
return Number(a)*Number(b);
}  

//JSON Response
function ResponseRequest(status,res){
var res = {status: status, response: res};
document.getElementById('display').innerHTML = JSON.stringify(res);
}


//Process
function ProcessRequest(){

if(method=="Add"){
    ResponseRequest("200",Add(parm[0],parm[1]));
}else if(method=="Sub"){
    ResponseRequest("200",Sub(parm[0],parm[1]));
}else if(method=="Multi"){
   ResponseRequest("200",Multi(parm[0],parm[1]));
}else {
    ResponseRequest("404","Not Found");
 }

}

URLValidation(url);
ProcessRequest();

};
</script>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.