代码之家  ›  专栏  ›  技术社区  ›  MR Mido

Android:调用时禁用HTTP 403https://maps.googleapis.com/maps/api/geocode/json

  •  2
  • MR Mido  · 技术社区  · 10 年前

    我一直在尝试使用谷歌api,更具体地说,就是这个URL来获取美国州和城市,我不断收到403禁止HTTP错误消息,我的代码如下:

    private static boolean getAddressResult(String input, StringBuilder jsonResults) {
        HttpURLConnection conn = null;
        try {
    
            String mapUrl;
            StringBuilder sb = new StringBuilder(https://maps.googleapis.com/maps/api/geocode/json);
            sb.append("?sensor=false&address=" + URLEncoder.encode(input, "utf8"));
    
            mapUrl = sb.toString();
    
            URL url = new URL(mapUrl);
    
            Logger.d(TAG, ""+ url);
            Logger.d(TAG, "trying to read");
    
            conn = (HttpURLConnection) url.openConnection();
    
    
            int status = conn.getResponseCode();
    
            Logger.d(TAG, "status: "+ status);
            InputStreamReader in = new InputStreamReader(conn.getInputStream());
    
            // Load the results into a StringBuilder
            int read;
            char[] buff = new char[1024];
            long currentTime = System.currentTimeMillis();
    
            while ((read = in.read(buff)) != -1) {
                Logger.d("NetworkUtil", "trying to parse");
    
                long elapsedTime = System.currentTimeMillis();
                if(elapsedTime-currentTime>=5000)
                    return false;
                jsonResults.append(buff, 0, read);
            }
        } catch (MalformedURLException e) {
            Logger.e(LOG_TAG, "Error processing Places API URL", e);
            return true;
        } catch (IOException e) {
            Logger.e(LOG_TAG, "Error connecting to Places API", e);
            return true;
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
        return false;
    }
    

    我已经尝试了不同的替代方法,包括将URL从HTTP更改为HTTPS。我不确定此时我到底遗漏了什么。很少有这样的情况,即web服务调用以200的成功率返回,但大多数时候它只是以403 HTTP错误代码失败,此时任何建议都会很有用。我还附上了Logcat的日志:

     Error connecting to Places API
    java.io.FileNotFoundException: https://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=08080
            at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:186)
            at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
            at .getAddressResult(NetworkUtil.java:217)
            at .access$000(NetworkUtil.java:30)
            at $ResolveCityTask.doInBackground(NetworkUtil.java:81)
            at $ResolveCityTask.doInBackground(NetworkUtil.java:42)
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   ztan    10 年前
    1. 这个 sensor 参数不再是必需的。
    2. 此外,您没有在请求url中提供API_KEY。
    3. 这个 StringBuilder 的字符串应该用双引号括起来。
    4. 日志中的地址字符串是08080,应该是字符串。
    5. 您应该在后台线程中执行API请求。

    示例API要求URL应如下所示: https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=API_KEY

    示例修改代码:

    String API_KEY = "YOUR_API_KEY_STRING";
    String input = "1600+Amphitheatre+Parkway,+Mountain+View,+CA";
    
    private static boolean getAddressResult(String input, StringBuilder jsonResults) {
        try {
    
            URL requestUrl = new URL("https://maps.googleapis.com/maps/api/geocode/json?address=" + input " + &key=" + API_KEY;
                );
            HttpURLConnection connection = (HttpURLConnection)requestUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
    
    
            responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
    
                BufferedReader reader = null;
    
                InputStream inputStream = connection.getInputStream();
                StringBuffer buffer = new StringBuffer();
                if (inputStream == null) {
                    // Nothing to do.
                    return false;
                }
                reader = new BufferedReader(new InputStreamReader(inputStream));
    
                String line;
                while ((line = reader.readLine()) != null) {
                    long elapsedTime = System.currentTimeMillis();
                    if(elapsedTime-currentTime>=5000) {
                       return false;
                    }
                    buffer.append(line + "\n");
                }
    
                if (buffer.length() == 0) {
                    return false;
                }
    
                Log.d("Test", buffer.toString());
                return buffer.toString();
            }
            else {
                Log.i(TAG, "Unsuccessful HTTP Response Code: " + responseCode);
                return false
            }
        } catch (MalformedURLException e) {
            Log.e(LOG_TAG, "Error processing Places API URL", e);
            return false;
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error connecting to Places API", e);
            return false;
        } catch (Expcetion e) {
            return false;
        }
        return false;
    }
    

    此示例代码应在后台方法中运行。

    还需要确保在清单文件中添加internet权限。 <uses-permission android:name="android.permission.INTERNET" />

    您还可以通过添加 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 并调用此方法以查看您的internet是否已连接:

     private boolean isNetworkAvailable() {
            ConnectivityManager manager = (ConnectivityManager)
                    getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    
            boolean isAvailable = false;
            if (networkInfo != null && networkInfo.isConnected()) {
                isAvailable = true;
            }
            return isAvailable;
        }