Ir para o conteúdo

 Voltar a Linguagem Lua
Tela cheia

Chamada POST através da classe TCP

29 de Dezembro de 2009, 19:05 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 108 vezes

Olá a todos,

 estou desenvolvendo alguns scripts em NCLua que realizam a comunicação com um servidor de aplicação Java, normalmente realizo apenas requisições utilizando o método GET, mas, uma das provas de conceito que estou trabalhando utiliza chamadas POST, gostaria de saber se algum de vocês já tentou fazer requisições POST utilizando a classe TCP e se fizeram, por favor me digam como, abaixo o código que tentei utilizar e que não estava funcionando.

tcp.send('POST http://carlosrj.s215.eatj.com/AdviceServer/AdviceServlet\nadviceNumber=1\n')

Essa chamada funciona normalmente, exceto pelo fato de que os parâmetros da requisição não estão chegando ao servlet, utilizando um formulário HTML, os dados são enviado corretamente, acredito que seja a forma como estou especificando os parâmetros.

Qualquer ajuda é bem vinda.

 Grato. 

Autor: João Carlos Tosta dos Santos


66 comentários

  • 5a82d82e341eb9065577cf78128f296a?only path=false&size=50&d=404Marcelo Moreno(usuário não autenticado)
    4 de Janeiro de 2010, 12:14

     

    Ola, Joao Carlos   Não tenho como testar aqui no momento, mas me parece que sua mensagem HTTP não está bem formada. Entre cabeçalhos e corpo da mensagem deve haver uma linha em branco. Para finalizar o corpo da mensagem, também é necessária uma linha em branco. Além disso, é sempre bom colocar a versão do protocolo. Use de preferência HTTP 1.1. Veja que HTTP 1.1 exige o cabeçalho 'Host:' em toda requisição. Tente a seguinte string:'POST /AdviceServer/AdviceServlet HTTP/1.1\nHost: carlosrj.s215.eatj.com\n\nadviceNumber=1\n\n'   Não deixe de explorar também o cabeçalho 'User-Agent:', que permitirá que seu servlet identifique qual cliente fez a requisição. Você poderá especificar comportamentos diferentes se o cliente for seu NCLua ou se for um browser usual.    Referência prática: http://jmarshall.com/easy/http []sMoreno 

    • 5d9385a99490aeb059f46f5f9be88a9e?only path=false&size=50&d=404João Carlos Tosta dos Santos(usuário não autenticado)
      8 de Janeiro de 2010, 11:05

       

      Olá Marcelo,

       obrigado pela ajuda, fiz alguns testes com seu código e após alguns testes descobri o que estava faltando para a requisição POST funcionar corretamente.

      Foi necessário adicionar dois elementos novos ao header http, o content-type e o content-length, ao especificar esses cabeçalhos na requisição os parâmetros chegaram normalmente ao servidor de aplicação.

      Com relação as quebras de linha duplas, as mesmas foram necessárias apenas entre o content-length e os parâmetros, e não são necessárias ao final da string.

      Para facilitar a minha vida, acabei criando uma função, vou disponibiliza-la aqui para ajudar quem tiver problemas como eu tive.

      function sendHttpRequest(method, url, host, params)
      if method == "GET" then
      tcp.send(method..' '..url..'&'..params..'\n')
      elseif method == "POST" then
      tcp.send(method..' '..url..' HTTP/1.1\nHost: '..host..'\ncontent-type: application/x-www-form-urlencoded\nContent-Length: '..string.len(params)..'\n\n'..params)
      else
      error("invalid method")
      end
      end

      • 5a82d82e341eb9065577cf78128f296a?only path=false&size=50&d=404Marcelo Moreno(usuário não autenticado)
        11 de Janeiro de 2010, 0:40

         

        Ola, Joao Carlos   Excelente que tudo funcionou. Ótima contribuição a função Lua para HTTP request.   No caso do GET seria bom colocar a versão do protocolo, que você omitiu. E para ambos os casos, encerre a mensagem com uma linha em branco, conforme dita o padrão. Se seu servidor respondeu, ótimo, mas outros podem não responder.   É sempre bom nos ater fielmente aos padrões para gerar produtos realmente interoperáveis e mutiplataforma. Não é a toa que estamos correndo atrás das normas ABNT para fazer uma implementação de referência do Ginga-NCL integralmente compatível.[]sMoreno

      • A1c22e4a60401f1c0192cbbdf4698988?only path=false&size=50&d=404Paulo Santos(usuário não autenticado)
        12 de Janeiro de 2010, 15:59

         

        João estou também tentando implementar algo desse tipo. Vendo seu poste surgiu algumas dúvidas:

        1 -  Como vc trataria o retorno dessa requisição?

        2 - Vi no forum problemas relacionados com DNS, o seu pelo que notei é um registrado, vc fez este teste localmente?

         

        Aguardo seu retorno, enquanto isso vou tentar fazer.

        • 5d9385a99490aeb059f46f5f9be88a9e?only path=false&size=50&d=404João Carlos Tosta dos Santos(usuário não autenticado)
          12 de Janeiro de 2010, 18:02

           

          Olá Paulo,

           vejamos se consigo elucidar suas dúvidas.

           1- R: Meu Servlet está retornando texto puro para o código Lua, ainda estou definindo como este texto estará formatado, mas, seja qual for, eu farei o parser na função Lua antes de exibir os dados.

          2- R:  Também tive problemas com o DNS, por isso estava utilizando esse servidor externo, recentemente consigo achar uma solução paleativa para esse problema. O problema foi resolvido com a instalação de um servidor DNS em uma das máquinas minha rede local e logo após configurar o nameserver no arquivo /etc/resolv.conf, o código Lua passou a encontrar as minhas máquinas locais.

           Basicamente foi isso, qualquer dúvida entre em contato.

          • A1c22e4a60401f1c0192cbbdf4698988?only path=false&size=50&d=404Paulo Santos(usuário não autenticado)
            16 de Janeiro de 2010, 11:16

             

            Olá João,

            Estou encontrando alguns problemas, vamos vê se vc consegue me ajudar.

            Peguei o código tcp.lua e coloquei no mesmo diretório dos meus scripts, e estou utilizando o metodo que vc disponibilizou, colocando o require 'tcp', porém esta ocorrendo o erro abaixo:

             PANIC: unprotected error in call to Lua API (./tcp.lua:16: assertion failed!)

             Enquanto isso vou tentar resolver.

            Desde já obrigado pela ajuda.

             

             

Concurso ITU-T de Aplicações para IPTV 2012

13 de Agosto de 2012, 19:38, por Desconhecido

Gostaríamos de lembrar aos possíveis interessados que o prazo de registro para participação no Concurso ITU-T de Aplicações para IPTV 2012 (IPTV Application Challenge) se encerra nesta semana, dia 15 de agosto de 2012. Já o prazo para a submissão de aplicações se encerra no dia 07 de setembro de 2012.



NCL Eclipse 1.6 disponível

10 de Janeiro de 2012, 21:19, por Desconhecido

Caros membros da Comunidade Ginga,



Concursos de Aplicações Ginga-NCL

22 de Setembro de 2011, 3:22, por Desconhecido

    Gostaríamos de relembra-los de que há dois concursos de aplicações Ginga-NCL com inscrições ainda abertas. O convite é aberto a toda a comunidade de desenvolvedores de aplicações para o Middleware Ginga-NCL, em nível internacional. São os seguintes concursos:



Novas versões: Ginga e Ginga-NCL Virtual Set-top Box (v.0.12.3)

1 de Agosto de 2011, 20:58, por Desconhecido



Algumas Boas Notícias da Comunidade Ginga

28 de Julho de 2011, 21:31, por Desconhecido

Autor: Roberto Azevedo