Android -urlConnection.getInputStream()失败 - InputStream保持为null

时间:2017-04-03 10:08:36

标签: android json null inputstream httpurlconnection

我正在尝试从Android中的Google Directions Server检索JSON数据。但是输入流失败并抛出异常。我收到错误消息,null“并且输入流为空。

我在HTTP连接上做错了什么?该URL正在我的浏览器上运行。

     private String doRequest() {
    String response = null;
    HttpURLConnection urlConnection = null;
    InputStream in = null;
    URL url = null;
    String queryString ="https://maps.googleapis.com/maps/api/directions/json?origin=40.71926430971954,-74.26603317260742&destination=40.74309523218185," +
            "-74.24732208251953&sensor=false&mode=walking&alternatives=true&key=AIzaSyASF2b0E0HHilJL5I936vqRbiBjM5XuPRA";


    try {
        url = new URL(queryString);
        urlConnection = (HttpURLConnection) url.openConnection();
        in = urlConnection.getInputStream();
    }

    catch (Exception e) {
        {
            StringBuilder builder = new StringBuilder();
            if (response == null)
                builder.append("Response is null.");
            if (url == null)
                builder.append("url is null.");
            if (urlConnection == null)
                builder.append("UrlConnection is null.");
            if (in == null)
                builder.append("Inputstream is null.");

            return builder.toString() +e.getMessage();
        }


    } finally {
        if (urlConnection != null)
            urlConnection.disconnect();
    }
    if (response == null)
    {
        return "sorry, response is null. At least it passed the exceptions.";
    }
    return response;
}

编辑:

Here is the error message

编辑2:

好的,我尝试过各种建议。现在当我执行代码时没有任何反应。我无法打开一个对话框,所以我不知道这次是什么问题。

public void getJSON(View v)
{
   AsyncTask<String, Void, String>hello = new GetData(this).execute(queryString);
}

导入android.app.Dialog;

import android.app.ProgressDialog;

import android.content.Context;

import android.content.DialogInterface;

导入android.net.http.HttpsConnection;

import android.os.AsyncTask;

import android.support.v7.app.AlertDialog;

导入android.view.View;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

导入javax.net.ssl.HttpsURLConnection;

(公共类GetData扩展AsyncTask)

{

private Exception exception;
public String response;
private Context context;
private ProgressDialog dialog = null;
public GetData(Context context)
{
    this.context = context;
}

protected String doInBackground(String... urls)
{
    this.response = doRequest(urls[0]);

    return response;
}

protected void onPostExecute() {
    // TODO: check this.exception
    // TODO: do something with the feed

    if (this.exception != null && response != null)
    {
        getDialog(getResponse(), context).show();
    }
    else
    {
        getDialog("sorry" + exception.getMessage(), context).show();
    }

}

private String doRequest(String queryString) {
    String response1 = null;
    HttpsURLConnection urlConnection = null;
    InputStream in = null;
    URL url = null;

    try {
        url = new URL(queryString);
        urlConnection =(HttpsURLConnection) url.openConnection();

        urlConnection.setRequestMethod("GET"); // or POST
        urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
        urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(true);

        int responseCode = urlConnection.getResponseCode();

        if (responseCode == HttpsURLConnection.HTTP_OK)
        {
            in = urlConnection.getInputStream();
            response1 = convertStreamToString(in);
        }

    } catch (Exception e) {
        {
            StringBuilder builder = new StringBuilder();
            if (response1 == null)
                builder.append("Response is null.");
            if (url == null)
                builder.append("url is null.");
            if (urlConnection == null)
                builder.append("UrlConnection is null.");
            if (in == null)
                builder.append("Inputstream is null.");

            return builder.toString() + e.getMessage();
        }

    } 

    finally
    {
        if (urlConnection != null)
            urlConnection.disconnect();
    }

    if (response1 == null)
    {
        return "sorry, response is null. At least it passed the exceptions.";
    }
    return response1;
}

private String convertStreamToString(java.io.InputStream is)
{
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
    return s.hasNext() ? s.next() : "";
}

public String getResponse()
{
    return this.response;
}


public Dialog getDialog(String string, Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(string);
    builder.setPositiveButton("OK",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
    return builder.create();

}

3 个答案:

答案 0 :(得分:0)

首先,为您的清单文件添加Internet权限:

<uses-permission android:name="android.permission.INTERNET" />

然后将其添加到现有代码中:

urlConnection.setRequestMethod("GET"); // or POST
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);

然后检查响应代码:

if (responseCode == HttpURLConnection.HTTP_OK) {
}

您还应该将读取InputStream的方式更改为:

try {
    BufferedReader input = new BufferedReader(
            new InputStreamReader(urlConnection.getInputStream(), "UTF-8")); 
    StringBuilder strB = new StringBuilder();
    String str;
    while (null != (str = input.readLine())) {
        strB.append(str).append("\r\n"); 
    }
    input.close();
} catch (IOException e) {
    e.printStackTrace();
}

答案 1 :(得分:0)

您使用HTTPS协议的链接,但您尝试将连接转换为HTTP而不是HTTPS:

urlConnection = (HttpURLConnection) url.openConnection();

尝试删除强制转换并执行:

URLConnection urlConnection = url.openConnection();

或者将其转换为HTTPS:

urlConnection = (HttpsURLConnection) url.openConnection();

现在InputStream不应为null。

此致

答案 2 :(得分:0)

您可能会尝试在主线程上的doRequest()中执行网络操作。在AsyncTask https://developer.android.com/reference/android/os/AsyncTask.html中运行您的代码 以下代码可以帮助您

问题在于你的onPostExecute和对话框。你应该覆盖onPostExecute,getDialog将返回AlertDialog。每当您的请求成功时,异常必须为null。检查我编辑的代码:

    class GetData extends AsyncTask<String, Void, String> {

        private Exception exception;
        public String response;
        private Context context;
        private ProgressDialog dialog = null;

        public GetData(Context context) {
            this.context = context;
        }

        protected String doInBackground(String... urls) {
            this.response = doRequest(urls[0]);

            return response;
        }

        @Override
        protected void onPostExecute(String s) {
            // TODO: check this.exception
            // TODO: do something with the feed

            if (this.exception == null && response != null) {
                getDialog(response, context).show();
            } else {
                getDialog("sorry" + exception.getMessage(), context).show();
            }

        }

        private String doRequest(String queryString) {
            HttpsURLConnection urlConnection = null;
            InputStream in = null;
            URL url = null;

            try {
                url = new URL(queryString);
                urlConnection = (HttpsURLConnection) url.openConnection();

                urlConnection.setRequestMethod("GET"); // or POST
                urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
                urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
                urlConnection.setDoInput(true);
                urlConnection.setDoOutput(true);

                int responseCode = urlConnection.getResponseCode();

                if (responseCode == HttpsURLConnection.HTTP_OK) {
                    in = urlConnection.getInputStream();
                    response = convertStreamToString(in);
                }

            } catch (Exception e) {
                {
                    exception = e;
                    StringBuilder builder = new StringBuilder();
                    if (response == null)
                        builder.append("Response is null.");
                    if (url == null)
                        builder.append("url is null.");
                    if (urlConnection == null)
                        builder.append("UrlConnection is null.");
                    if (in == null)
                        builder.append("Inputstream is null.");

                    return builder.toString() + e.getMessage();
                }

            } finally {
                if (urlConnection != null)
                    urlConnection.disconnect();
            }

            if (response == null) {
                return "sorry, response is null. At least it passed the exceptions.";
            }
            return response;
        }

        private String convertStreamToString(java.io.InputStream is) {
            java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
            return s.hasNext() ? s.next() : "";
        }

       /* public String getResponse() {
            return this.response;
        }*/


        public AlertDialog getDialog(String string, Context context) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setMessage(string);
            builder.setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
            return builder.create();



   }
}

public void getJSON(View v)
{
   AsyncTask<String, Void, String>hello = new GetData(MainActivity.this).execute(queryString);//MainActivity will be your activity 
}