New URL(…).openConnection() implica necessariamente um POST?
Pergunta
Se eu criar um HTTP java.net.URL
e depois ligue openConnection()
nele, isso implica necessariamente que uma postagem HTTP acontecerá?eu sei que openStream()
implica um GET.Em caso afirmativo, como você executa um dos outros verbos HTTP sem precisar trabalhar com a camada de soquete bruta?
Solução
Se você recuperar o URLConnection
objeto usando openConnection()
na verdade, ele não começa a se comunicar com o servidor.Isso não acontece até que você obtenha o fluxo do URLConnection()
.Ao obter a conexão pela primeira vez, você pode adicionar/alterar cabeçalhos e outras propriedades da conexão antes de abri-la.
O ciclo de vida do URLConnection é um pouco estranho.Ele não envia os cabeçalhos ao servidor até que você obtenha um dos fluxos.Se você apenas obtiver o fluxo de entrada, acredito que ele fará um GET, enviará os cabeçalhos e permitirá que você leia a saída.Se você obtiver o fluxo de saída, acredito que ele o enviará como um POST, pois pressupõe que você gravará dados nele (talvez seja necessário chamar setDoOutput(true)
para que o fluxo de saída funcione).Assim que você obtém o fluxo de entrada, o fluxo de saída é fechado e aguarda a resposta do servidor.
Por exemplo, isso deve fazer um POST:
URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
OutputStream os = conn.getOutputStream();
os.write("Hi there!");
os.close();
InputStream is = conn.getInputStream();
// read stuff here
Embora isso faria um GET:
URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(false);
conn.setDoInput(true);
InputStream is = conn.getInputStream();
// read stuff here
URLConnection
também fará outras coisas estranhas.Se o servidor especificar um comprimento de conteúdo, então URLConnection
manterá o fluxo de entrada subjacente aberto até receber essa quantidade de dados, mesmo se você fechá-lo explicitamente.Isso causou muitos problemas para nós, pois dificultou um pouco o desligamento limpo do nosso cliente, já que o URLConnection
manteria a conexão de rede aberta.Isso provavelmente existe mesmo se você apenas usar getStream()
no entanto.
Outras dicas
Não, não tem.Mas se o protocolo da URL for HTTP, você receberá um HttpURLConnection
como um objeto de retorno.Esta aula tem um setRequestMethod
para especificar qual método HTTP você deseja usar.
Se você quiser fazer coisas mais sofisticadas, provavelmente será melhor usar uma biblioteca como Jacarta HttpClient.