Há ocasiões onde é necessário enviar um conjunto de informações (preenchidas em um formulário por exemplo) para algum serviço rodando em algum Servidor remoto. Uma maneira de fazer isso, é enviar essas informações através do método POST. Normalmente isso é feito através de um formulário HTML armazenado em um servidor web, porém é possível que uma aplicação PowerBuilder envie informações (de uma datawindow por exemplo) da mesma maneira.
No exemplo a seguir, o conteúdo de um formulário simples será enviado através do método POST para um script PHP armazenado em um servidor web. Este script apenas exibirá o conteúdo enviado pela nossa aplicação.
O script PHP
Um script simples em PHP fará o papel do serviço que receberá a requisição POST vinda do PowerBuilder.
testePOST.php
A aplicação PowerBuilder
<?php
print_r($_POST); /* Exibe o conteúdo recebido via POST */
?>
Em uma nova aplicação, crie uma Standard Class do tipo InternetResult. Este objeto manipulará as informações que nossa aplicação receberá do servidor. Salve esta classe com o nome n_cst_internet.
Na função InternetData(blob data) no objeto recém criado, coloque o seguinte código:
// Irá exibir em uma MessageBox o conteúdo retornado pelo servidorEm seguida, crie uma nova janela com dois campos de texto (sle_nome e sle_email) e um botão (cb_enviar).
// que recebeu o POST
MessageBox("O script PHP retornou:", String(data))
RETURN 0
No evento clicked do botão cb_enviar, temos o seguinte código:
String httprequest, ls_header, ls_url, ls_headersRodando esta aplicação, receberemos o retorno do script PHP:
Long ll_ret, ll_length
Blob lblb_args
Inet linet_main
n_cst_internet luo_data
linet_main = CREATE inet
luo_data = CREATE n_cst_internet
String nome
nome = sle_nome.Text
String email
email = sle_email.Text
ls_url = "http://www.meusite.com.br/testePOST.php"
lblb_args = blob("nome=" + nome + "&email=" + email)
ll_length = Len(lblb_args)
ls_headers = "Content-Type: " + &
"application/x-www-form-urlencoded~n" + &
"Content-Length: " + String( ll_length ) + "~n~n"
ll_ret = linet_main.PostURL(ls_url,lblb_args,ls_headers,luo_data)
IF(ll_ret 1) THEN
MessageBox("ERRO", "POST falhou (retorno: " + String(ll_ret))
END IF
Observação: A função PostURL (no PowerBuilder 7) não permite que enviemos informações para uma porta diferente da 80 (não é possível fazer uma chamada para uma página HTTPS configurada na porta 8080 por exemplo). Aparentemente, a partir do PowerBuilder 8 essa limitação foi eliminada (não cheguei a testar).