首页 > 解决方案 > 从经过身份验证的网页将 JSON 导入 Android 应用程序

问题描述

这是场景。用户在我无法控制的网站上拥有一个帐户。我的应用需要来自http://url/json的 JSON 数据。JSON 仅在用户登录时显示。

基本上,我的应用程序将: 1. 弹出登录页面(在 Web 视图中,甚至在可能的浏览器中) 2. 他们将输入凭据(我不想要或不需要这些) 3. 我会使用用于获取 JSON 数据的经过身份验证的会话。(重新格式化和呈现 JSON 数据是用户使用这个应用程序的全部原因,所以他们可以接受。)

如果没有特定的面向外部的 API,这可能吗?Webview/浏览器可以访问数据,所以我想也许我的应用程序也可以(在用户明确许可的情况下)。

我还没有开始,所以我对大多数 Android 开发持开放态度。在多平台方面,我倾向于 React-Native,而且它对我的工作有所帮助。但是,访问此类数据可能会受到更多限制。任何建议表示赞赏。

标签: androidjsonauthenticationauthorization

解决方案


首先,您需要将 url 加载到 webview 并检查登录是否成功(onPageFinish 也可以注入 javascript 以获取直接 json)然后您可以使用 asyncTask 获取数据

webView.getSettings().setJavaScriptEnabled(true); //

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int
                errorCode, String description, String
                                            failingUrl) {
            Toast.makeText(context, description, Toast
                    .LENGTH_SHORT).show();
        }

        @TargetApi(Build.VERSION_CODES.M)
        @Override
        public void onReceivedError(WebView view,
                                    WebResourceRequest req,
                                    WebResourceError error) {

            onReceivedError(view, error.getErrorCode(), error
                    .getDescription().toString(), req.getUrl
                    ().toString());
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);

        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
           HttpGetResources httpGet = new HttpGetResources(new AsyncResponse() 
   {

                @Override
                public void processFinish(Object output, Exception e) {
                    if (output != null) {
                        //do something
                    } else {
                        Toast.makeText(context, 
      getString(R.string.server_not_responding),
                                Toast.LENGTH_LONG).show();
                    }
                }
            });
            Log.e("URL : ", URL);
            httpGet.execute(URL);
        }

    });

    webView.loadUrl(URL);

--AsyncTask 类--

     public class HttpGetResources extends AsyncTask<String, Void, Object> {

    private AsyncResponse delegate = null;
    private static final String REQUEST_METHOD = "GET";
    private static final int READ_TIMEOUT = 15000;
    private static final int CONNECTION_TIMEOUT = 15000;
    private static final String RAW_DATE_FORMAT = "yyyy-MM- 
    dd'T'HH:mm:ss.SSSz";
    private static final Gson GSON = new 
    GsonBuilder().setDateFormat(RAW_DATE_FORMAT).create();
    private Exception exception=null;
    private BufferedReader buffer = null;


    public HttpGetResources(AsyncResponse asyncResponse) {
        delegate = asyncResponse;
    }


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


    }

    @Override
    protected void onPostExecute(Object response) {
        super.onPostExecute(response);
        delegate.processFinish(response,exception);
    }

    @Override
    protected Object doInBackground(String... params) {
        String stringUrl = params[0];
        Object result;
        try {
            URL myUrl = new URL(stringUrl);
            HttpURLConnection connection = (HttpURLConnection) 
            myUrl.openConnection();
            connection.setRequestMethod(REQUEST_METHOD);
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);
            connection.connect();

            buffer = new BufferedReader(new 
            InputStreamReader(connection.getInputStream()));
            result = GSON.fromJson(buffer, TopHeadlines.class);
            buffer.close();
            buffer = null;
        } catch (Exception e) {
            e.printStackTrace();
            exception=e;
            Log.e("ERROR : ",e.toString() + e.getClass());
            result = null;
        }
        return result;
    }
    public Exception returnException(){
       return exception;
    }
}

---接口异步响应---

 public interface AsyncResponse {
  void processFinish(Object output, Exception e);
 }

推荐阅读