jQuery ajax call to REST service

JqueryRest

Jquery Problem Overview


I'm trying to make an ajax call from jquery to a rest service. The rest service used is right from a tutorial of mkyong's blog, this one: http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

The service works, but when i try to make a call from jQuery, in Firebug there is a 200 status code, but in the response section, nothing.

Here is the html page with the ajax call:

<html>
<head>
	<script type="text/javascript" src="jquery-1.6.2.min.js"></script>
</head>

<body>	

<button id="ajax">ajax call</button>
<button id="json">json</button>

<script type="text/javascript">
	$('#json').click(function(){ 
		alert('json');
		 $.getJSON("http://localhost:8080/restws/json/product/get",
		 function(data) {
			alert(data);		 
		  });	
	});

	$('#ajax').click(function(){ 
		alert('ajax');
		 $.ajax({ 
			 type: "GET",
			 dataType: "json",
			 url: "http://localhost:8080/restws/json/product/get",
			 success: function(data){		 
				alert(data);
			 }
		 });
	});

</script>



</body>

</html>

I can't figure it out where I went wrong, could you please tell me what i am doing wrong?

Thanks!

Jquery Solutions


Solution 1 - Jquery

You are running your HTML from a different host than the host you are requesting. Because of this, you are getting blocked by the same origin policy.

One way around this is to use JSONP. This allows cross-site requests.

In JSON, you are returned:

{a: 5, b: 6}

In JSONP, the JSON is wrapped in a function call, so it becomes a script, and not an object.

callback({a: 5, b: 6})

You need to edit your REST service to accept a parameter called callback, and then to use the value of that parameter as the function name. You should also change the content-type to application/javascript.

For example: http://localhost:8080/restws/json/product/get?callback=process should output:

process({a: 5, b: 6})

In your JavaScript, you will need to tell jQuery to use JSONP. To do this, you need to append ?callback=? to the URL.

$.getJSON("http://localhost:8080/restws/json/product/get?callback=?",
   function(data) {
     alert(data);         
   });

If you use $.ajax, it will auto append the ?callback=? if you tell it to use jsonp.

$.ajax({ 
   type: "GET",
   dataType: "jsonp",
   url: "http://localhost:8080/restws/json/product/get",
   success: function(data){        
     alert(data);
   }
});

Solution 2 - Jquery

From the use of 8080 I'm assuming you are using a tomcat servlet container to serve your rest api. If this is the case you can also consider to have your webserver proxy the requests to the servlet container.

With apache you would typically use mod_jk (although there are other alternatives) to serve the api trough the web server behind port 80 instead of 8080 which would solve the cross domain issue.

This is common practice, have the 'static' content in the webserver and dynamic content in the container, but both served from behind the same domain.

The url for the rest api would be http://localhost/restws/json/product/get

Here a description on how to use mod_jk to connect apache to tomcat: http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

Solution 3 - Jquery

I think there is no need to specify

'http://localhost:8080`" 

in the URI part.. because. if you specify it, You'll have to change it manually for every environment.

Only

"/restws/json/product/get" also works

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDaJackalView Question on Stackoverflow
Solution 1 - JqueryRocket HazmatView Answer on Stackoverflow
Solution 2 - Jqueryuser1526458View Answer on Stackoverflow
Solution 3 - JqueryAmitView Answer on Stackoverflow