понедельник, 9 ноября 2015 г.

JAVA RESTful Service

JAVA RESTful Service


Думаю,что никого уже нельзя удивить такими сервисами ,да и рассказывать, что это такое я не буду.(Если что погуглите)
А я просто хочу показать простой пример создания таких сервисов и клиентов к нему.(может кому нибудь это будет полезно)

Поехали.

Создадим обычный maven проект и добавим следующие зависимости

 
  
        com.sun.jersey
        jersey-server
        1.19
    


Этого достаточно чтобы поднять простой сервис с  Jersey и Jax-RS.
Выглядеть он будет достаточно тривиально,примерно следующим образом:


 
@Path("/")
public class RestService {




    @GET//метод обращения
    @Path("/helloworld")//относительный путь
    @Produces(MediaType.TEXT_PLAIN)//Мы можем указать представление типа MIME для ресурса, используя Produces аннотацию
    public String getClichedMessage() {
        return "Hello World";
    }

    @GET
    @Path("/verify")
    @Produces(MediaType.TEXT_PLAIN)
    public Response verifyRESTService(InputStream incomingData) {
        String result = "Thats ok";
        return Response.status(200).entity(result).build();
    }


    @POST
    @Path("/post")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response post(String incomingData) {
        JSONObject jsonObject;
        try {
            jsonObject = new JSONObject(incomingData);
        } catch (JSONException ex) {
            return Response.status(500).entity("Error while parsing").build();
        }

        System.out.println("Data Received: " + jsonObject.toString());
        return Response.status(200).entity(jsonObject.toString()).build();
    }


    @POST
    @Path("/paramPost")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response postWithParam(@FormParam("data")String incomingData) {
        JSONObject jsonObject;
        try {
            jsonObject = new JSONObject(incomingData);
        } catch (JSONException ex) {
            return Response.status(500).entity("Error while parsing").build();
        }

        System.out.println("Data Received: " + jsonObject.toString());
        return Response.status(200).entity(jsonObject.toString()).build();
    }

    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServerFactory.create("http://localhost:9998/");
        server.start();
        System.out.println("Сервер запущен");
    }
}

Выглядит невероятно просто,возможности конечно значительно шире,чем то что я тут набросал,но это просто пример.

Чтобы создать клиент для проверки нашего сервиса есть 2 варианта.

1.С использованием Apache Http Client


 
  public static void main(String[] argv) throws IOException {
        String jsonObject="{\n" +
                "    \"tutorials\": {\n" +
                "        \"id\": \"Apt\",\n" +
                "        \"topic\": \"REST Service\",\n" +
                "        \"description\": \"This is REST Service\"\n" +
                "    }\n" +
                "}";
        HttpClient httpClient =  HttpClientBuilder.create().build();
        HttpPost postRequest =  new HttpPost(new URIBuilder().setPath("http://localhost:9998/post").toString());
        StringEntity input = new StringEntity(jsonObject);
        input.setContentType("application/json");
        postRequest.setEntity(input);
        HttpResponse response1 = httpClient.execute(postRequest);
        System.out.println(new BasicResponseHandler().handleResponse(response1));


        HttpPost request = new HttpPost("http://localhost:9998/paramPost");
        request.setEntity(new UrlEncodedFormEntity(Collections.singletonList(new BasicNameValuePair("data", jsonObject))));
        HttpResponse response = httpClient.execute(postRequest);
        System.out.println(new BasicResponseHandler().handleResponse(response));

    }


2.Используя Jersey клиент.
Добавим в зависимости

 
  
        com.sun.jersey
        jersey-client
        1.19
    

    
        com.sun.jersey
        jersey-json
        1.19
    


И код самого клиента

 
public class ClientJersey {

    public static void main(String[] args) {
        try {
            String jsonObject="{\n" +
                    "    \"tutorials\": {\n" +
                    "        \"id\": \"Apt\",\n" +
                    "        \"topic\": \"REST Service\",\n" +
                    "        \"description\": \"This is REST Service\"\n" +
                    "    }\n" +
                    "}";
            ClientConfig clientConfig = new DefaultClientConfig();
            clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
            Client clientJersey = Client.create(clientConfig);
            WebResource webResource = clientJersey.resource("http://localhost:9998/post");
            ClientResponse response = webResource.accept("application/json").type("application/json").post(ClientResponse.class, jsonObject);
            if (response.getStatus() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + response.getStatus());
            }
            String output = response.getEntity(String.class);
            System.out.println("Server response .... \n");
            System.out.println(output);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Вот собственно и все,вот так просто.