316

I have an HTML page with a button on it. When I click on that button, I need to call a REST Web Service API. I tried searching online everywhere. No clue whatsoever. Can someone give me a lead/Headstart on this? Very much appreciated.

1
  • 2
    Your call to REST service is just a request to the server , I guess it's gonna be an ajax request. Use jQuery for instance api.jquery.com/jquery.ajax Commented May 2, 2016 at 5:43

10 Answers 10

398

I'm surprised nobody has mentioned the new Fetch API, supported by all browsers except IE11 at the time of writing. It simplifies the XMLHttpRequest syntax you see in many of the other examples.

The API includes a lot more, but start with the fetch() method. It takes two arguments:

  1. A URL or an object representing the request.
  2. Optional init object containing the method, headers, body etc.

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

Recreating the previous top answer, a 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 } 
Sign up to request clarification or add additional context in comments.

5 Comments

How does the button action look like with this solution?
What about DELETE and PUT?
@asmaier did you get an answer on how the button action will look like? Thanks
button.addEventListener('click', userAction); or <button onclick="userAction()" />
Is there a way to use similar javascript inside stored procedure or UDF in CosmosDB ?
130

Your 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"); } 

Your Button action::

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

For more info go through the following link (Updated 2017/01/11)

6 Comments

Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help xhr.spec.whatwg.org
Since you are doing a synchronized call, you need to call xhttp.open("POST", "Your Rest URL Here", false);, otherwise xhttp.responseText will not contain the result. But as said before, it will be soon deprecated.
If this is a POST request, where are you actually posting the data?
"xhttp.setRequestHeader("Content-type", "application/json");" — This is a lie. You aren't passing any JSON to the send() method.
You will regret using an XMLHttpRequest object instead of using fetch() when you try to use Service Workers. There are polyfills for fetch() for use in older browsers. Learn to use fetch().
|
22

Here is another Javascript REST API Call with authentication using 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> 

4 Comments

didn't you face any cross domain issues? I am calling an api hosted somewhere else from localhost and it is giving cross domain issues.
I am also face same cors issue..plz help
@HaritVishwakarma - it will if the api you are calling doesn't have Access-Control-Allow-Origin for your domain(localhost). Try creating your own proxy, send req to the proxy and forward the request to your destination. Since this will be a server to server communication, the request wont be blocked(CORS is blocked by browsers). Send back this response with the allow-origin header set to all
@HaritVishwakarma and NitinWahale and future devs you can disable web security on your local browser for testing purposes only though - this won't work as a production solution. Ref here: stackoverflow.com/questions/3102819/…
18
 $("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); } }); }); 

Comments

11

I think add if (this.readyState == 4 && this.status == 200) to wait is better:

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(); 

1 Comment

That won't work if the client and the API are not in the same domain, right?
1

If that helps anyone, if you are ok with an external library then I can vouch for Axios, which has a pretty clean API and rich documentation to deal with REST calls, here's an example below:-

const axios = require('axios'); axios.get('/user?ID=12345') .then(function (response) { // handle success console.log(response); }); 

Comments

0

Before we try to put anything on the front end of the website, let's open a connection the API. We'll do so using XMLHttpRequest objects, which is a way to open files and make an HTTP request.

We'll create a request variable and assign a new XMLHttpRequest object to it. Then we'll open a new connection with the open() method - in the arguments we'll specify the type of request as GET as well as the URL of the API endpoint. The request completes and we can access the data inside the onload function. When we're done, we'll send the request.
// Create a request variable and assign a new XMLHttpRequest object to it. 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 Comment

Similar answers have been given before. Why did you add your answer? A short description might help
0

By far, the easiest for me is Axios. You can download the node module or use the CDN for your simpler projects.

CDN:

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> 

Code example for GET/POST:

let postData ={key: "some value"} axios.get(url).then(response =>{ //Do stuff with the response. }) axios.post(url, postData).then(response=>{ //Do stuff with the response. }); 

Comments

-2

Without a doubt, the simplest method uses an invisible FORM element in HTML specifying the desired REST method. Then the arguments can be inserted into input type=hidden value fields using JavaScript and the form can be submitted from the button click event listener or onclick event using one line of JavaScript. Here is an example that assumes the REST API is in file REST.php:

<body> <h2>REST-test</h2> <input type=button onclick="document.getElementById('a').submit();" value="Do It"> <form id=a action="REST.php" method=post> <input type=hidden name="arg" value="val"> </form> </body> 

Note that this example will replace the page with the output from page REST.php. I'm not sure how to modify this if you wish the API to be called with no visible effect on the current page. But it's certainly simple.

Comments

-4

Usual way is to go with PHP and ajax. But for your requirement, below will work fine.

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.