从Android应用程序

时间:2015-07-28 03:12:03

标签: java android api url

现在,我正在尝试使用我的Android应用程序的OpenWeatherMap API获取天气信息。

  1. 返回数据格式必须为json
  2. 单位必须在metric
  3. 我想收集7天的数据
  4. 请注意,这是Udacity的Android开发课程的一部分。在他们的示例代码中,API查询URL的构造如下:

    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;
    
    String forecastJsonStr = null;
    String format = "json";
    String units = "metric";
    int numDays = 7;
    
    try
    {
        final String FORECAST_BASE_URL =  "http://api.openweathermap.org/data/2.5/forecast/daily?";
        final String QUERY_PARAM = "q";
        final String FORMAT_PARAM = "mode";
        final String UNITS_PARAM = "units";
        final String DAYS_PARAM = "cnt";
    
        Uri builtUri = Uri.parse(FORECAST_BASE_URL).buildUpon()
        .appendQueryParameter(QUERY_PARAM, params[0])
        .appendQueryParameter(FORMAT_PARAM, format)
        .appendQueryParameter(UNITS_PARAM, units)
        .appendQueryParameter(DAYS_PARAM, Integer.toString(numDays))
        .build();
    
        URL url = new URL(builtUri.toString());
    
    }
    

    虽然它有效,但在我的新手眼中,生成简单的查询字符串需要做很多工作。所以,我在想,因为我不打算更改此查询字符串中的任何参数,为什么我不能使用这样的简单字符串:

    URL url = new URL("http://api.openweathermap.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7")
    

    这样做会有任何明显的缺点吗?还是我应该避免做的事情?

2 个答案:

答案 0 :(得分:0)

它是从更广泛的视角设计的,因为根据项目需要,未来的参数可能会发生变化,因为目前URL需要附加API密钥,否则调用将不会成功。现在,如果您保留静态URL,那么您可以更改您需要获取天气数据的位置,以便您始终想要获取用户可能想要获取其他位置的数据的相同位置的数据您的解决方案如何保持常量URL工作?

因此,以这样的方式保持设计解决方案始终是好的,以后每当您希望添加一些与之相关的新功能时,现有解决方案都会与其内联。因此,最好避免执行诸如保持常量之类的事情。 URL。

希望清楚你的想法。 欢呼声。

答案 1 :(得分:0)

以下代码为我提供免费帐户。在这里,我使用了文档中给出的简单URL。为了预测,我获得了5天的数据。对于当前天气状况,我获得所有必需的数据。您可以在我的代码中看到这两个网址。

public class RemoteFetch {

private static final String OPEN_WEATHER_MAP_API_CURRENT = "http://api.openweathermap.org/data/2.5/weather?q=%s&units=metric";
private static final String OPEN_WEATHER_MAP_API_FORCAST = "http://api.openweathermap.org/data/2.5/forecast?q=%s&units=metric";
private static Constants mC=new Constants();

public static JSONObject getJSON(Context context, String city, int dataType){
    try {
        String urlString=new String();

        if(dataType == mC.DATA_TYPE_CURRENT) {
            urlString=OPEN_WEATHER_MAP_API_CURRENT;
        }
        else if(dataType== mC.DATA_TYPE_FORCAST){
            urlString=OPEN_WEATHER_MAP_API_FORCAST;
        }
        URL url =new URL(String.format(urlString, city));


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

        connection.addRequestProperty("x-api-key",
                context.getString(R.string.open_weather_maps_app_id));

        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());

        // This value will be 404 if the request was not
        // successful
        if(data.getInt("cod") != 200){
            return null;
        }

        return data;
    }catch(Exception e){
        Log.e("MYAPP", "exception", e);
        return null;
    }
}

}