{"id":439,"date":"2013-01-28T06:29:17","date_gmt":"2013-01-28T09:29:17","guid":{"rendered":"https:\/\/www.erudio.com.br\/blog\/?p=439"},"modified":"2018-03-18T11:40:32","modified_gmt":"2018-03-18T14:40:32","slug":"verificacao-de-data-online-via-web-services-usando-xstream","status":"publish","type":"post","link":"https:\/\/www.erudio.com.br\/blog\/verificacao-de-data-online-via-web-services-usando-xstream\/","title":{"rendered":"Verifica\u00e7\u00e3o de data online via web-services usando XStream."},"content":{"rendered":"<p>O objetivo desse post \u00e9 oferecer dicas de como trabalhar com web-services usando as bibliotecas <strong>XStream<\/strong>  e <strong>HttpClient 4.x<\/strong>, que j\u00e1 abordamos em um <a href=\"https:\/\/www.erudio.com.br\/blog\/?p=450\">post anterior<\/a>, e al\u00e9m disso verificar a data corrente online. As vezes pode ser necess\u00e1rio verificar de tempos em tempos se a data de uma aplica\u00e7\u00e3o cliente \u00e9 exatamente a mesma de uma aplica\u00e7\u00e3o servidora. N\u00e3o \u00e9 algo t\u00e3o corriqueiro, entretanto tem uma import\u00e2ncia razo\u00e1vel visto que uma bateria de BIOS ruim ou um usu\u00e1rio mal intencionado ou por erro podem alterar a data da m\u00e1quina. Dentre as v\u00e1rias solu\u00e7\u00f5es para verificar essa data a mais l\u00f3gica \u00e9 verificar essa data online. Verificar a data na aplica\u00e7\u00e3o servidora n\u00e3o \u00e9 muito interessante pois o cliente pode, ocasionalmente, perder  a comunica\u00e7\u00e3o com a aplica\u00e7\u00e3o servidora. Diante disso a sa\u00edda \u00e9 consumir algum web-service que disponibilize essas informa\u00e7\u00f5es. Como era de se esperar n\u00e3o encontrei um no Brasil (mesmo que existisse provavelmente seria pago como \u00e9 o caso do CEP). Dos v\u00e1rios web-services internacionais o mais interessante, par esse prop\u00f3sito, \u00e9 o disponibilizado pelo <a href=\"http:\/\/www.earthtools.org\/\">Earth Tools.org<\/a>. Ele oferece uma s\u00e9rie de informa\u00e7\u00f5es sobre clima e outras coisas e claro tamb\u00e9m sobre data.<\/p>\n<p>Partindo para o desenvolvimento a primeira coisa que precisamos \u00e9 definir as depend\u00eancias no nosso POM. As depend\u00eancias mais importantes de nosso projeto s\u00e3o as do HttpClient e a XStream. As primeiras s\u00e3o necess\u00e1rias para podermos nos comunicar com o web-service j\u00e1 a segunda converte XML em objetos Java.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;project xmlns=&quot;http:\/\/maven.apache.org\/POM\/4.0.0&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\r\n         xsi:schemaLocation=&quot;http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd&quot;&gt;\r\n \r\n    &lt;!-- VERIFIQUE O POM COMPLETO NO GITHUB https:\/\/github.com\/leandrocgsi\/DateSynchronizer --&gt;\r\n \r\n    &lt;dependencies&gt;\r\n \r\n        &lt;!-- DEPEND\u00caNCIA DA XSTREAM RESPONS\u00c1VEL POR CONVERTER XML EM OBJETOS --&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;com.thoughtworks.xstream&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;xstream&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.4.3&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n             \r\n        &lt;!-- DEPEND\u00caNCIA DA JERSEY --&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;com.sun.jersey&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;jersey-server&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.8&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        \r\n        &lt;!-- DEPEND\u00caNCIA DO ASM --&gt; \r\n        &lt;dependency&gt;\r\n            &lt;artifactId&gt;asm&lt;\/artifactId&gt;\r\n            &lt;groupId&gt;asm&lt;\/groupId&gt;\r\n            &lt;type&gt;jar&lt;\/type&gt;\r\n            &lt;version&gt;3.1&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n         \r\n        &lt;!-- DEPEND\u00caNCIA DO HTTP CLIENT --&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.apache.httpcomponents&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;httpclient&lt;\/artifactId&gt;\r\n            &lt;version&gt;4.0.3&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n          \r\n        &lt;!-- DEPEND\u00caNCIA DO HTTP MIME --&gt;   \r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.apache.httpcomponents&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;httpmime&lt;\/artifactId&gt;\r\n            &lt;version&gt;4.0.3&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n         \r\n        &lt;!-- DEPEND\u00caNCIA DO HTTP CORE --&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.apache.httpcomponents&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;httpcore&lt;\/artifactId&gt;\r\n            &lt;version&gt;4.0.1&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n             \r\n        &lt;!-- DEPEND\u00caNCIA DA JMONKEYENGINE--&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;com.projectdarkstar.ext.com.jmonkeyengine&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;jme-xml&lt;\/artifactId&gt;\r\n            &lt;version&gt;2.0-S1&lt;\/version&gt;\r\n            &lt;type&gt;jar&lt;\/type&gt;\r\n        &lt;\/dependency&gt;\r\n    &lt;\/dependencies&gt;\r\n&lt;\/project&gt;\r\n<\/pre>\n<p>Agora partindo para as classes Java precisamos acessar a seguinte URL <a href=\"http:\/\/www.earthtools.org\/timezone\/-18.5134\/-46.512809\" class=\"broken_link\">http:\/\/www.earthtools.org\/timezone\/-18.5134\/-46.512809<\/a> que recebe como par\u00e2metro em sua parte final dois n\u00fameros correspondentes a longitude e latitude de onde estamos acessando. Se acessarmos essa URL via browser veremos um XML similar ao da imagem abaixo.<\/p>\n<p><a href=\"https:\/\/www.erudio.com.br\/blog\/verificacao-de-data-online-via-web-services-usando-xstream\/estrutura-do-xml\/\" rel=\"attachment wp-att-440\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2013\/01\/Estrutura-do-XML-300x124.png\" alt=\"Estrutura do XML\" width=\"520%\" height=\"520%\" class=\"alignnone size-medium wp-image-440\" srcset=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2013\/01\/Estrutura-do-XML-300x124.png 300w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2013\/01\/Estrutura-do-XML-768x316.png 768w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2013\/01\/Estrutura-do-XML-1024x422.png 1024w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2013\/01\/Estrutura-do-XML.png 1192w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Podemos identificar, no XML, a necessidade de criarmos dois <strong>beans<\/strong> respons\u00e1veis por armazenar as informa\u00e7\u00f5es do XML. O primeiro deles assinalado com o numero 1 (timezone) dar\u00e1 origem ao <strong>bean <\/strong><strong>Timezone<\/strong>, que al\u00e9m de uma s\u00e9rie de atributos simples possui um atributo composto por outro objeto (location) que por sua vez dar\u00e1 origem ao <strong>bean Location<\/strong>. Na cria\u00e7\u00e3o do <strong>bean<\/strong> ao adicionarmos a anota\u00e7\u00e3o <strong>@XStreamAlias<\/strong> indicamos que aquele objeto representa um n\u00f3 do arquivo XML. Fora isso nossas classes n\u00e3o possuem nada demais apenas geters, setters, serializa\u00e7\u00e3o e construtor.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage br.com.semeru.datesynchronizer.beans;\r\n\r\nimport com.thoughtworks.xstream.annotations.XStreamAlias;\r\nimport java.io.Serializable;\r\n\r\n\/\/ Anota\u00e7\u00e3o que indica para a XStream que timezone\r\n\/\/ \u00e9 um n\u00f3 de um arquivo XML ou seja ele \u00e9 um objeto\r\n@XStreamAlias(&quot;timezone&quot;)\r\npublic class Timezone implements Serializable{\r\n\r\n    \/\/Atributo para serializa\u00e7\u00e3o do bean\r\n    private static final long serialVersionUID = 1L;\r\n    \r\n    \/\/Atributo do XML\r\n    private String version;\r\n\r\n    \/*Essa anota\u00e7\u00e3o indica que o atributo XML abaixo \r\n    \u00e9 um atributo um pouco mais complexo e representa\r\n    um objeto dentro de timezone*\/\r\n    @XStreamAlias(&quot;location&quot;)\r\n    private Location location;\r\n    \r\n    \/\/Outro atributo do XML\r\n    private String offset;\r\n    private String suffix;\r\n    private String localtime;\r\n    private String isotime;\r\n    private String utctime;\r\n    private String dst;\r\n\r\n    \/\/ Construtor, getters e setters omitidos\r\n        \r\n}\r\n\r\n<\/pre>\n<p>Observe que o <strong>bean<\/strong> Timezone se relaciona de 1 para 1 com Location.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage br.com.semeru.datesynchronizer.beans;\r\n\r\nimport com.thoughtworks.xstream.annotations.XStreamAlias;\r\nimport java.io.Serializable;\r\n\r\n\/* Anota\u00e7\u00e3o que indica para a XStream que location\r\n\u00e9 um n\u00f3 de um arquivo XML ou seja ele \u00e9 um objeto *\/\r\n@XStreamAlias(&quot;location&quot;)\r\npublic class Location implements Serializable{\r\n    \r\n    private static final long serialVersionUID = 1L;\r\n    \r\n    private String latitude;\r\n    private String longitude;\r\n\r\n    \/\/ Construtor, getters e setters omitidos\r\n        \r\n}\r\n<\/pre>\n<p>Feito isto \u00e9 s\u00f3 nos acessarmos a URL e converter o XML em objetos. Inicialmente definimos a URL e um main que invoca um outro m\u00e9todo (readXMLURL) que por sua vez se conecta \u00e0 URL e recupera um inputStream que por sua vez \u00e9 passado como par\u00e2metro na invoca\u00e7\u00e3o do m\u00e9todo parserXMLToObject que recupera o XML do inputStream e converte-o em objeto retornando um objeto do tipo Timezone que agora podemos usar na aplica\u00e7\u00e3o.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage br.com.semeru.datesynchronizer;\r\n\r\nimport br.com.semeru.datesynchronizer.beans.Timezone;\r\nimport com.thoughtworks.xstream.XStream;\r\nimport com.thoughtworks.xstream.io.xml.DomDriver;\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport org.apache.http.HttpResponse;\r\nimport org.apache.http.HttpStatus;\r\nimport org.apache.http.client.HttpClient;\r\nimport org.apache.http.client.methods.HttpGet;\r\nimport org.apache.http.impl.client.DefaultHttpClient;\r\n\r\npublic class RecoveryDateWitchURL {\r\n\r\n    \/\/Determino a URL de onde ser\u00e1 recuperada a informa\u00e7\u00e3o do webservice\r\n    private static String url = &quot;http:\/\/www.earthtools.org\/timezone\/-18.5134\/-46.512809&quot;;\r\n        \r\n    \/\/M\u00e9todo main\r\n    public static void main(String[] args) throws IOException, ClassNotFoundException {\r\n        \r\n        \/\/Invoco o m\u00e9todo passando como par\u00e2metro a URL\r\n        readXMLURL(url);\r\n    }\r\n\r\n    \/\/ M\u00e9todo respons\u00e1vel por recuperar um inputstream a\r\n    \/\/ partir de uma URL e converter o resultado em objeto\r\n    private static void readXMLURL(String url) throws IOException {\r\n        \r\n        \/\/Crio uma instancia de cliente HTTP\r\n        HttpClient client = new DefaultHttpClient();\r\n        \r\n        \/\/Crio uma instancia de HTTPGet passando a URL como par\u00e2metro\r\n        HttpGet method = new HttpGet(url);\r\n        \r\n        \/\/Atribuo \u00e0 HTTP response o resutado da execu\u00e7\u00e3o do m\u00e9todo get\r\n        HttpResponse httpResponse = client.execute(method);\r\n        \r\n        \/\/Declaro uma vari\u00e1vel que recebe o c\u00f3digo de status da requisi\u00e7\u00e3o HTTP\r\n        int statusCode = httpResponse.getStatusLine().getStatusCode();\r\n        \r\n        \/\/Verifico se o c\u00f3digo do status \u00e9 igual a SC_OK (200)\r\n        if (statusCode == HttpStatus.SC_OK) {\r\n            \r\n            \/\/Se for significa que a requisi\u00e7\u00e3o foi bem sucedida e ent\u00e3o\r\n            \/\/crio uma instancia de InputStream pegando o conte\u00fado da response\r\n            InputStream inputStream = httpResponse.getEntity().getContent();\r\n            \r\n            \/\/Invoco o m\u00e9todo parserXMLToObject passando o inputStream como par\u00e2metro\r\n            parserXMLToObject(inputStream);\r\n        }\r\n    }\r\n    \r\n    \/\/M\u00e9todo que efetivmente converte o input stream em XML e depois em objeto\r\n    private static Timezone parserXMLToObject(InputStream inputStream) {\r\n        \r\n        \/\/Crio uma instancia de XStream que recebe via\r\n        \/\/construtor uma instancia de DomDriver\r\n        XStream xStream = new XStream(new DomDriver());\r\n        \r\n        \/\/Processa as anota\u00e7\u00f5es da classe Timezone\r\n        xStream.processAnnotations(Timezone.class);\r\n        \r\n        \/\/Crio uma instancia de Timezone que recebe um cast para Timezone \r\n        \/\/do inputstream convertido para XML e depois para Objetc\r\n        Timezone timezone = (Timezone) xStream.fromXML(inputStream);\r\n        \r\n        \/\/Imprimo algumas informa\u00e7\u00f5es de timezone para testar\r\n        System.out.println(&quot;O TimeZone \u00c9: &quot; + timezone.getLocaltime() + &quot; - &quot; + timezone.getUtctime() + &quot;\\n&quot;\r\n                + &quot;e as Cordenadas s\u00e3o: &quot; + timezone.getLocation().getLatitude() + &quot; de Latitude Sul&quot; + timezone.getLocation().getLongitude() + &quot; de Longitude Oeste. :-&amp;gt;&quot;);\r\n        \r\n        \/\/Retorno um objeto do tipo Timezone que poder\u00e1\r\n        \/\/ser usado em outras partes da aplica\u00e7\u00e3o.\r\n        return timezone;\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>Posteriormente pretendo fazer mais posts abordando outros aspectos de web-services. Lembrando sempre que se voc\u00ea ficou alguma d\u00favida relacionada ao conte\u00fado desse post sinta-se a vontade para comentar, criticar e\/ou contribuir com o seu coment\u00e1rio. Al\u00e9m disso voc\u00ea pode acessar todo o c\u00f3digo fonte desse projeto atrav\u00e9s do <a href=\"https:\/\/github.com\/leandrocgsi\/DateSynchronizer\">GitHub<\/a>.<\/p>\n<h2>Treinamentos relacionados com este post<\/h2>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_java\" target=\"_blank\" rel=\"noopener\"><br \/><img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0  AWS com Spring Boot 3, Java e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/07-rest-spring-java.png\" \/><br \/><\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_microservices_java\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microservices do 0 com Spring Cloud, Spring Boot e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/14-microservices-java.png\" \/><br \/><\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_kotlin\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0 AWS com Spring Boot 3, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/18-rest-spring-kotlin.png\" \/><br \/><\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_ms_kotlin\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microsservi\u00e7os do 0 com Spring Cloud, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/22-ms-kotlin.png\" \/><br \/><\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker do 0 \u00e0 Maestria: Cont\u00eaineres Desmistificados mais 3 B\u00d4NUS\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/09-docker.png\" \/><br \/><\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker_para_aws\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker para Amazon AWS Implante Apps Java e .NET com Travis CI\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/10-docker-to-aws.png\" \/><br \/><\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_kotlin\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Kotlin para DEVs Java: Aprenda a Linguagem Padr\u00e3o do Android\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/20-kotlin.png\" \/><br \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O objetivo desse post \u00e9 oferecer dicas de como trabalhar com web-services usando as bibliotecas XStream e HttpClient 4.x, que j\u00e1 abordamos em um post anterior, e al\u00e9m disso verificar a data corrente online. As vezes pode ser necess\u00e1rio verificar de tempos em tempos se a data de uma aplica\u00e7\u00e3o cliente \u00e9 exatamente a mesma [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7,9,42,120,122],"tags":[128,130,168,247,249],"_links":{"self":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/439"}],"collection":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/comments?post=439"}],"version-history":[{"count":4,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/439\/revisions"}],"predecessor-version":[{"id":1153,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/439\/revisions\/1153"}],"wp:attachment":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/media?parent=439"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/categories?post=439"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/tags?post=439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}