Estou usando este código com sucesso para enviar HTTP
solicitações com alguns parâmetros via GET
método
void sendRequest(String request)
{
// i.e.: request = "http://example.com/index.php?param1=a¶m2=b¶m3=c";
URL url = new URL(request);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Type", "text/plain");
connection.setRequestProperty("charset", "utf-8");
connection.connect();
}
Agora, talvez eu precise enviar os parâmetros (por exemplo, param1, param2, param3) via POST
método, porque eles são muito longos. Eu estava pensando em adicionar um parâmetro extra para esse método (ou seja, String httpMethod).
Como posso alterar o código acima o mínimo possível para enviar parâmetros via GET
ou POST
?
Eu estava esperando que a mudança
connection.setRequestMethod("GET");
para
connection.setRequestMethod("POST");
teria feito o truque, mas os parâmetros ainda são enviados pelo método GET.
Tem HttpURLConnection
algum método que ajudaria? Existe alguma construção Java útil?
qualquer ajuda seria muito bem vinda.
http://example.com/index.php
)Respostas:
Em uma solicitação GET, os parâmetros são enviados como parte da URL.
Em uma solicitação POST, os parâmetros são enviados como um corpo da solicitação, após os cabeçalhos.
Para fazer um POST com HttpURLConnection, você precisa gravar os parâmetros na conexão depois de abrir a conexão.
Este código deve começar:
fonte
byte[] data = urlParameters.getBytes(Charset.forName("UTF-8"))
:).conn.getResponseCode()
ouconn.getInputStream()
não, pois ele não enviará nenhum dado.Aqui está um exemplo simples que envia um formulário e despeja a página de resultado em
System.out
. Altere a URL e os parâmetros do POST conforme apropriado, é claro:Se você deseja que o resultado seja
String
impresso em vez de impresso diretamente, faça:fonte
UTF-8
, o que nem sempre é o caso. Para recuperar o conjunto de caracteres, deve-se obter o cabeçalhoContent-Type
e analisar o conjunto de caracteres. Quando esse cabeçalho não está disponível, use o padrão http:ISO-8859-1
.<meta charset="...">
ou<meta http-equiv="Content-Type" content="...">
dentro do documento que precisa ser analisado.response += line;
é fenomenalmente lento e come quebras de linha. Adicionei à resposta um exemplo de como obter uma resposta de string.Não consegui que o exemplo de Alan realmente fizesse o post, então acabei com isso:
fonte
Acho
HttpURLConnection
realmente complicado de usar. E você precisa escrever um monte de clichê, código propenso a erros. Eu precisava de um invólucro leve para meus projetos do Android e criei uma biblioteca que você também pode usar: DavidWebb .O exemplo acima pode ser escrito assim:
Você pode encontrar uma lista de bibliotecas alternativas no link fornecido.
fonte
Eu li as respostas acima e criei uma classe de utilitário para simplificar a solicitação HTTP. Espero que ajude você.
Chamada de método
Classe de utilidade
fonte
Vejo algumas outras respostas que deram a alternativa, pessoalmente acho que intuitivamente você está fazendo a coisa certa;). Desculpe, no devoxx, onde vários oradores têm discutido sobre esse tipo de coisa.
É por isso que eu pessoalmente uso as bibliotecas HTTPClient / HttpCore do Apache para fazer esse tipo de trabalho; acho que sua API é mais fácil de usar do que o suporte HTTP nativo do Java. YMMV, é claro!
fonte
fonte
import java.net.*;
!Eu tive o mesmo problema. Eu queria enviar dados via POST. Eu usei o seguinte código:
Eu usei o Jsoup para análise:
fonte
Os métodos GET e POST são definidos desta maneira ... Dois tipos para api chamando 1) get () e 2) post (). Método get () para obter valor da matriz api json para obter valor e o método post () use em nosso post de dados em url e obtenha resposta.
fonte
Tente este padrão:
fonte
Esta resposta cobre o caso específico da chamada POST usando um Java POJO customizado.
Usando dependência maven para o Gson serializar nosso objeto Java para JSON.
Instale o Gson usando a dependência abaixo.
Para aqueles que usam gradle pode usar o abaixo
Outras importações utilizadas:
Agora, podemos seguir em frente e usar o HttpPost fornecido pelo Apache
O código acima retornará com o código de resposta recebido da chamada POST
fonte
aqui enviei jsonobject como parâmetro // jsonobject = {"name": "lucifer", "pass": "abc"} // serverUrl = " http://192.168.100.12/testing " //host=192.168.100.12
fonte
Eu recomendo o http-request baseado no apache http api.
Para o seu caso, você pode ver um exemplo:
Se você não está interessado no corpo de resposta
Para envio geral de solicitação de postagem com solicitação http : Leia a documentação e veja minhas respostas Solicitação HTTP POST com JSON String em JAVA , Enviando solicitação HTTP POST em Java , HTTP POST usando JSON em Java
fonte
Olá pls use esta classe para melhorar seu método de postagem
fonte
Peguei a resposta de Boann e a usei para criar um construtor de cadeias de consulta mais flexível que suporta listas e matrizes, assim como o método http_build_query do php:
fonte
Para aqueles com problemas para receber a solicitação em uma página php usando $ _POST porque você espera pares de valores-chave:
Embora todas as respostas tenham sido muito úteis, faltava algum entendimento básico sobre qual string realmente seria publicada, pois no antigo apache HttpClient eu usava
e então poderia usar $ _POST no php para obter os pares de valores-chave.
No meu entendimento agora, construímos essa string manualmente antes de postar. Portanto, a string precisa se parecer com
mas, em vez disso, basta adicioná-lo ao URL que é postado (no cabeçalho).
A alternativa seria usar uma string json:
e puxe-o em php sem $ _POST:
Aqui você encontra um código de exemplo no Kotlin:
fonte
Parece que você também precisa chamar
connection.getOutputStream()
"pelo menos uma vez" (e tambémsetDoOutput(true)
) para que ele seja tratado como um POST.Portanto, o código mínimo necessário é:
Você pode até usar os parâmetros de estilo "GET" no urlString, surpreendentemente. Embora isso possa confundir as coisas.
Você também pode usar o NameValuePair aparentemente.
fonte