Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jersey Grizzly REST service not visible outside localhost

I'm trying to write a REST service in java using Jersey and Glassfish Grizzly. I have a very simple case working internally, but can't seem to call on the server from an external address. I've tried using a variety of different pairs of machines with externally visible IP's, and tried specifying the actual IP address in the server instead of localhost, but nothing works. I'm somewhat loosely following the official user guide here. My resource:

package resources;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/simpleREST")
public class SimpleRESTResource
{
    @GET
    @Produces("text/plain")
    public String getMessage()
    {
        return "Message from server\n";
    }
}

And the server:

import java.io.IOException;
import java.net.URI;

import javax.ws.rs.core.UriBuilder;

import org.glassfish.grizzly.http.server.HttpServer;

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;


public class Main
{
    public static final URI BASE_URI = UriBuilder.fromUri("http://localhost").port(9998).build();

    public static void main(String[] args) throws IOException
    {
        System.out.println("Starting grizzly...");
        ResourceConfig rc = new PackagesResourceConfig("resources");
        HttpServer myServer = GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
        System.out.println(String.format("Jersey app started with WADL available at %s/application.wadl\n" +
                "Try out %s/simpleREST\nHit enter to stop it...", BASE_URI, BASE_URI));
        System.in.read();
        myServer.stop();
    }
}

On the same machine, I can successfully interact with the server using

curl -X GET localhost:9998/simpleREST

OR

curl -X GET [external numeric address]:9998/simpleREST

Many thanks in advance for any suggestions.


SOLUTION

I have fixed this problem by setting the server URI to http://0.0.0.0:9998 instead of localhost, 127.0.0.1, or the actual address.

like image 660
user1596250 Avatar asked Aug 22 '12 16:08

user1596250


3 Answers

To make a server IP adress visible outside of localhost, you must fist open the neccessary firewall ports(if you have one), or use "0.0.0.0" instead of "localhost" in order for the server to listen to all IP addresses and network adapters. Before testing it in your local network, try pinging your server device from your client device to check if there is an actual connection or if the devices are not connected at all.

like image 121
Foivoschr Avatar answered Oct 18 '22 11:10

Foivoschr


With Jersey and Grizzly 2.30, it's simpler:

final ResourceConfig rc = new ResourceConfig().packages("com.rest");

HttpServer httpServer = Grizzly

HttpServerFactory.createHttpServer(URI.create("http://0.0.0.0:9998/api/"), rc);
like image 38
AndyMan Avatar answered Oct 18 '22 12:10

AndyMan


or, you can try these codes below:

    ResourceConfig rc = new PackagesResourceConfig("your-rest-packages");
    HttpHandler handler = ContainerFactory.createContainer(HttpHandler.class, rc);
    server = new HttpServer();
    server.getServerConfiguration().addHttpHandler(handler);
    //attach listeners

    InetAddress localHost = InetAddress.getLocalHost();
    String localHostAddr = localHost.getHostAddress();
    NetworkListener localHostListener = new NetworkListener("localhost", localHostAddr, port);
    server.addListener(localHostListener);
    InetAddress loopback = InetAddress.getLoopbackAddress();
    String loopbackAddr = loopback.getHostAddress();
    NetworkListener loopbackListener = new NetworkListener("loopback", loopbackAddr, port);

now your server could both list to localhost and loopback

like image 1
Hall Wong Avatar answered Oct 18 '22 13:10

Hall Wong