terça-feira, 23 de fevereiro de 2016

Verificação de internet ativa para carregar libs JS remotas ou locais

Normalmente libs JS fornecem um caminho CDN e é uma boa prática usá-la porque como o browser faz cache do que baixa se outra aplicação usar a mesma lib o seu carregamento será mais rápido já que esta lib já está no cache do browser.

E hoje normalmente é mais difícil ficar sem internet, mas para evitar contratempos, ainda mais se você trabalha remoto com algum deslocamento é bom verificar se a internet está ativa e pegar as libs do CDN ou local.

Segue abaixo algumas sugestões variando conforme as linguagens de programação utilizadas:

PHP:
$internetON = @fsockopen("www.google.com", 80);

JS:
Algumas libs como jQuery e Angular criam um objeto que pode ser verificado. Esta metodologia não gosto muito porque se tiver que carregar um CSS do bootstrap por exemplo irei ter que tentar carregar a lib js na tab head e depois o css, sendo que, a boa prática recomenda carregar os CSS na tag head e os JS antes do fechamento da tag body.

<script src="http://code.jquery.com/jquery-1.11.3.min.js"/>
<script>
var internetON = (window.jQuery !== undefined);
if (internetON) {
      document.write('<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" >');
} else {
      document.write('<link rel="stylesheet" type="text/css" href="css/libs/bootstrap-3.3.6-dist/css/bootstrap.min.css">');
}
</script>

JSP / JAVA:
ApplicationUtil.java
    public static boolean internetON() {
        try {
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();
            Object objData = urlConnect.getContent();
        } catch (Exception e) { 
            return false;
        }
        
        return true;
    }

JSP
<%@ page import="br.com.lexsis.improvement.ApplicationUtil" %>
<%
    boolean internetON = false;
    if (request.getLocalName().equalsIgnoreCase("localhost")) {
        internetON = ApplicationUtil.internetON();
    } else {
        internetON = true;
    }
%>
...
<% if (internetON) { %>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<% } else { %>
<link rel="stylesheet" type="text/css" href="js/libs/bootstrap-3.3.6-dist/css/bootstrap.min.css">
<% } %>

JS / JAVA / RESTfull:
Aqui seria uma mescla do JS com JSP / JAVA. Fazer o load do AngularJS e fazer uma requisição RESTful para verificar se a internet está ON, se tiver faz a carga dos demais CSS e JS.


quinta-feira, 18 de fevereiro de 2016

Problema em decode JSON de um PUT em PHP + AngularJS

Numa aplicação PHP+AngularJS estou usando RESTful e aí no POST e PUT o decode estou fazendo da seguinte forma:

$params = json_decode(file_get_contents("php://input"));

no meu ambiente local (XAMPP e PHP versão 5.6.14) funciona 100%.

Já no server da DialHost que o PHP tem a versão 5.5.30 o PUT não funciona, pois chega os dados originais e não os novos se alterar para POST e fazendo um update, o que não é o correto para RESTful, funciona.

Abri chamado com a DialHost que sugeriram usar 

parse_str(file_get_contents("php://input"), $params);

o que funcionou num exemplo de POST e PUT que criaram, mas para mim foi pior, o POST deixou de funcionar.

Olhando melhor o código vi que eu tinha duas linhas iguais com json_decode bem afastadas, deixei só uma e funcionou. Interessante que na minha máquina como comentei acima funciona 100% mas no server gerava problema com o PUT.

Fica a dica.

Vlw pessoal da DialHost pelo pronto atendimento.


terça-feira, 2 de fevereiro de 2016

Route com templateUrl dinâmico

Normalmente os atributos templatetemplateUrl que vemos nos exemplos por aí retornam uma string, mas também pode ser uma function que retorna uma string e recebe um parâmetro com todos os atributos colocados no path. Então pode-se ter o seguinte:

when('/transpextraform/:idEmpresa/:id', {
    templateUrl: function(params) { 
        return 'ag0001.php?id_empresa=' + params.idEmpresa + "&id=" + params.id;
    },
    controller: 'TranspExtraCtrl'
})

Saiba mais: