JavaScript에서 REST 웹 서비스 API를 호출하는 방법은 무엇입니까?


166

버튼이있는 HTML 페이지가 있습니다. 해당 버튼을 클릭하면 REST 웹 서비스 API를 호출해야합니다. 나는 모든 곳에서 온라인 검색을 시도했다. 단서가 없습니다. 누군가 나에게 이것에 대해 리드 / 헤드 스타트를 줄 수 있습니까? 대단히 감사합니다.


REST 서비스에 대한 호출은 서버에 대한 요청 일뿐입니다. 아약스 요청 일 것입니다. 예를 들어 jQuery 사용 api.jquery.com/jquery.ajax
ikos23

답변:


173

글을 쓰는 시점에 IE11을 제외한 모든 브라우저에서 지원되는 새로운 Fetch API를 언급 한 사람이 아무도 없습니다. 다른 많은 예제에서 볼 수있는 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
삭제 및 PUT은 어떻습니까?
Krzysztof

2
@asmaier 버튼 동작의 모양에 대한 답변을 받았습니까? 감사합니다
Angel Esguerra

1
button.addEventListener('click', userAction);또는<button onclick="userAction()" />
Brendan McGill

105

자바 스크립트 :

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에 결과가 포함되지 않습니다. 그러나 앞에서 말했듯이 곧 더 이상 사용되지 않을 것입니다.
Alexandre Fenyo

POST 요청 인 경우 실제로 데이터를 어디에 게시합니까?
EFC

" xhttp.setRequestHeader("Content-type", "application/json");"— 이것은 거짓말입니다. JSON을 send()메소드에 전달하지 않습니다 .
Quentin

요청이 더 이상 동기화되지 않도록이 코드를 편집했지만 응답을 마치 마치 읽으려고합니다.
Quentin

17

다음은 json을 사용한 인증을 사용하는 또 다른 Javascript REST API 호출입니다.

<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>

교차 도메인 문제에 직면하지 않았습니까? localhost에서 다른 곳에서 호스팅되는 API를 호출하고 있으며 도메인 간 문제가 발생합니다.
Harit Vishwakarma

나는 또한 같은 cors 문제에 직면하고 있습니다. plz 도움말
Nitin Wahale

@HaritVishwakarma-호출하는 API에 도메인 (localhost)에 대한 액세스 제어 허용 원본이없는 경우입니다. 자신의 프록시를 작성하고 프록시에 요청을 보내고 요청을 목적지로 전달하십시오. 이는 서버 간 통신이므로 요청이 차단되지 않습니다 (CORS는 브라우저에 의해 차단됨). allow-origin 헤더를 all로 설정하여이 응답을 다시 보냅니다.
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

기다릴 add (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가 동일한 도메인에 있지 않으면 작동하지 않습니다.
David Brossard

0

웹 사이트의 프런트 엔드에 무언가를 배치하기 전에 API 연결을 열어 보겠습니다. 파일을 열고 HTTP 요청을하는 방법 인 XMLHttpRequest 객체를 사용합니다.

요청 변수를 만들고 새 XMLHttpRequest 객체를 할당합니다. 그런 다음 open () 메소드를 사용하여 새 연결을 엽니 다. 인수에서 요청 유형을 API 엔드 포인트의 URL과 GET으로 지정합니다. 요청이 완료되고 onload 함수 내부의 데이터에 액세스 할 수 있습니다. 완료되면 요청을 보냅니다.
// 요청 변수를 만들고 새 XMLHttpRequest 객체를 할당합니다. var request = new 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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.