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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top