Acessando Web Service via HTTP

6 respostas
caique_castanho

Pessoal estou tentando acessar um web service de previsão de tempo que retorna um xml como resposta, ao digitar isso no browser vc´s entenderão o funcionamento: http://www.google.com/ig/api?weather=Vitoria,Espirito Santo,Brazil&hl=pt-br

O problema é o seguinte, quero fazer a requisição e salvar o retorno em um arquivo XML mas o meu código está recebendo um erro 400 do HTTP server como resposta, ai vai o meu código:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;



public class PrevisaoDeTempo  
{  
	private String cidade;
	private String estado;
	private String pais;
	
	public static void main(String[] args)
	{
		PrevisaoDeTempo tp = new PrevisaoDeTempo("Vitoria","Espirito Santo", "Brazil");
		try {
			tp.requisitaPrevisao();
		} catch (IOException e) {
			javax.swing.JOptionPane.showMessageDialog(null, e.getMessage());
		}
	}

	PrevisaoDeTempo(String cidade, String estado, String pais)
	{
		this.cidade = cidade;
		this.estado = estado;
		this.pais = pais;
	}
	
	public void requisitaPrevisao() throws IOException  
	{  
		String endereco = "http://www.google.com/ig/api?weather="+this.cidade+","+this.estado+","+this.pais+"&hl=pt-br";	
		HttpURLConnection conexao = null; 
		URL url = new URL(endereco);
		conexao = (HttpURLConnection)url.openConnection(); 
		conexao.setRequestProperty("Request-Method","GET");
		
		conexao.connect();
		
		BufferedReader br = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
		
		conexao.disconnect();
		
		File f = new File("D:/teste.xml");
		FileWriter fw = new FileWriter(f);
		fw.write(br.toString());
		br.close();  
		fw.flush();
		fw.close();
	}

	private void setCidade(String cidade) {
		this.cidade = cidade;
	}

	private String getCidade() {
		return cidade;
	}

	private void setEstado(String estado) {
		this.estado = estado;
	}

	private String getEstado() {
		return estado;
	}

	private void setPais(String pais) {
		this.pais = pais;
	}

	private String getPais() {
		return pais;
	}  
	
}

Alguém pode me ajudar com isso, não entendo quase nada sobre essa requisição HTTP. Obrigado pessoal.

6 Respostas

javer

Esse erro é um Bad Request, dá uma revisada na url sendo enviada, leia isso.

caique_castanho

Consegui pessoal, o um dos problemas era na URL onde os espaços dos parametros do request tem de ser trocados por “%20”. Outro problema estava na hora de salvar o arquivo, ta ai o codigo:

import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.InputStream;

public class PrevisaoDeTempo
{  
	private String cidade;
	private String estado;
	private String pais;
	
	public static void main(String[] args)
	{
		PrevisaoDeTempo tp = new PrevisaoDeTempo("Salvador","Bahia", "Brazil");
		try {
			tp.requisitaPrevisao();
		} catch (IOException e) {
			javax.swing.JOptionPane.showMessageDialog(null, e.getMessage());
		}
	}

	PrevisaoDeTempo(String cidade, String estado, String pais)
	{
		this.cidade = cidade;
		this.estado = estado;
		this.pais = pais;
	}
	
	public void requisitaPrevisao() throws IOException  
	{  
		String endereco = "http://www.google.com/ig/api?weather="+this.cidade+","+this.estado+","+this.pais+"&hl=pt-br";	
		HttpURLConnection conexao = null; 
		URL url = new URL(endereco);
		conexao = (HttpURLConnection)url.openConnection(); 
		conexao.setRequestProperty("Request-Method","GET");
		
		conexao.connect();
		
		InputStream in = conexao.getInputStream();
		FileOutputStream out = new FileOutputStream("D:/teste.xml");

		int b;

		while((b = in.read())>-1)
   			out.write(b);
		
		in.close();
		out.close();

		
	}

	private void setCidade(String cidade) {
		this.cidade = cidade;
	}

	private String getCidade() {
		return cidade;
	}

	private void setEstado(String estado) {
		this.estado = estado;
	}

	private String getEstado() {
		return estado;
	}

	private void setPais(String pais) {
		this.pais = pais;
	}

	private String getPais() {
		return pais;
	}  
	
}
javer

Onde você está trocando os espaços?

caique_castanho

Nesse caso não houve necessidade de trocar já que não há espaços nos nomes da cidade, estado e país, porém caso a cidade fosse Rio de Janeiro teria que passar Rio%20de%20Janeiro… :smiley: Ah e aproveitando, tem alguma idéia de como faço pra trocar ? Será que o metodo replace da classe String funciona ? Acho que o melhor lugar para se fazer isso é no construtor mesmo né ? T+

furutani

Tenta usar a classe URLEncoder pra fazer essa conversão

javer
Criado 18 de outubro de 2010
Ultima resposta 20 de out. de 2010
Respostas 6
Participantes 3