2015-12-16 3 views
2

Я получаю исключение «http://api.openweathermap.org/data/2.5/weather?q=Sydney». Может кто-то, пожалуйста, помогите, как его использовать. прекрасно работает с веб-браузером, когда я вставить следующийИспользование ключа API OpenWeatherMap

http://api.openweathermap.org/data/2.5/weather?q=Sydney&APPID=ea574594b9d36ab688642d5fbeab847e

Я попробовал следующую комбинацию как хорошо, но не повезло

connection.addRequestProperty("x-api-key", 
        "&APPID=cea574594b9d36ab688642d5fbeab847e"); 


private static final String OPEN_WEATHER_MAP_API = 
     "http://api.openweathermap.org/data/2.5/weather?q=%s"; 


public static JSONObject getJSON(String city) { 
    try { 
     URL url = new URL(String.format(OPEN_WEATHER_MAP_API, city)); 

     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

     connection.addRequestProperty("x-api-key", 
       "cea574594b9d36ab688642d5fbeab847e"); 

     BufferedReader reader = 
       new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     StringBuffer json = new StringBuffer(1024); 
     String tmp = ""; 

     while((tmp = reader.readLine()) != null) 
      json.append(tmp).append("\n"); 
     reader.close(); 

     JSONObject data = new JSONObject(json.toString()); 

     if(data.getInt("cod") != 200) { 
      System.out.println("Cancelled"); 
      return null; 
     } 

     return data; 
    } catch (Exception e) { 

     System.out.println("Exception "+ e.getMessage()); 
     return null; 
    } 
+0

ваш ключ api должен быть параметром get, а не любым символом 'x-api-key'. – njzk2

ответ

11

1.-Добавить разрешение интернет на приложение How to add manifest permission to android application?

2.-Вот вам пример о том, как осуществить вызов апи

public class MainActivity extends Activity { 

    JSONObject data = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getJSON("Sydney"); 
    } 

    public void getJSON(final String city) { 

     new AsyncTask<Void, Void, Void>() { 


      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 

      } 

      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        URL url = new URL("http://api.openweathermap.org/data/2.5/weather?q="+city+"&APPID=ea574594b9d36ab688642d5fbeab847e"); 

        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

        BufferedReader reader = 
          new BufferedReader(new InputStreamReader(connection.getInputStream())); 

        StringBuffer json = new StringBuffer(1024); 
        String tmp = ""; 

        while((tmp = reader.readLine()) != null) 
         json.append(tmp).append("\n"); 
        reader.close(); 

        data = new JSONObject(json.toString()); 

        if(data.getInt("cod") != 200) { 
         System.out.println("Cancelled"); 
         return null; 
        } 


       } catch (Exception e) { 

        System.out.println("Exception "+ e.getMessage()); 
        return null; 
       } 

       return null; 
      } 

      @Override 
      protected void onPostExecute(Void Void) { 
      if(data!=null){ 
       Log.d("my weather received",data.toString()); 
      } 

      } 
     }.execute(); 

    } 
} 

enter image description here

+0

У меня уже есть разрешение на интернет. Я скопировал и вставил ваш URL, и это сработало. Большое спасибо –

+0

10 upvotes для простой простой реализации –

2

Это выглядит как Open погоды могут возникать проблемы. Я говорю это, потому что их пример, который они дают, возвращает такое же сообщение об ошибке, что и ваше. С их сайта >> http://openweathermap.org/appid

Пример API вызова (не действующий ключ):

api.openweathermap.org/data/2.5/forecast/city?id=524901&APPID=1111111111 
+0

1111111111 не является действительным ключом. Попробуйте использовать этот cea574594b9d36ab688642d5fbeab847e, тогда он работает –

+0

Nope. Этот ключ тоже не работает. –

+1

Извините, есть дополнительные «c» в начале, этот работает http://api.openweathermap.org/data/2.5/forecast/city?id=524901&APPID=ea574594b9d36ab688642d5fbeab847e –

2

Попробуйте

  1. Создать класс с именем GetData

    class GetData extends AsyncTask <String,Void,String> { 
    
         @Override 
         protected String doInBackground(String... params) { 
          // TODO Auto-generated method stub 
          String result = ""; 
          HttpURLConnection conn = null; 
          try { 
           URL url = new URL("http://api.openweathermap.org/data/2.5/weather?q="+URLEncoder.encode(params[0], "UTF-8")+"&APPID=ea574594b9d36ab688642d5fbeab847e"); 
           conn = (HttpURLConnection) url.openConnection(); 
           InputStream in = new BufferedInputStream(conn.getInputStream()); 
           if (in != null) { 
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); 
            String line = ""; 
    
            while ((line = bufferedReader.readLine()) != null) 
             result += line; 
           } 
           in.close(); 
           return result; 
          } catch (IOException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
          finally { 
           if(conn!=null) 
           conn.disconnect(); 
          } 
          return result; 
         } 
    
         @Override 
         protected void onPostExecute(String result) { 
          // TODO Auto-generated method stub 
          super.onPostExecute(result); 
          Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
         } 
    
    } 
    
  2. И затем используйте это для получить данные

    new Getdata().execute("your city or country");

+0

ya это работает только для Сиднея, он будет статичным, я хочу, чтобы он был динамическим –

+0

проверить измененный ответ. и дайте мне знать. –

+0

ya, теперь он работает, но метод кодирования уменьшается. –

Смежные вопросы