android - 从经过身份验证的网页将 JSON 导入 Android 应用程序
问题描述
这是场景。用户在我无法控制的网站上拥有一个帐户。我的应用需要来自http://url/json的 JSON 数据。JSON 仅在用户登录时显示。
基本上,我的应用程序将: 1. 弹出登录页面(在 Web 视图中,甚至在可能的浏览器中) 2. 他们将输入凭据(我不想要或不需要这些) 3. 我会使用用于获取 JSON 数据的经过身份验证的会话。(重新格式化和呈现 JSON 数据是用户使用这个应用程序的全部原因,所以他们可以接受。)
如果没有特定的面向外部的 API,这可能吗?Webview/浏览器可以访问数据,所以我想也许我的应用程序也可以(在用户明确许可的情况下)。
我还没有开始,所以我对大多数 Android 开发持开放态度。在多平台方面,我倾向于 React-Native,而且它对我的工作有所帮助。但是,访问此类数据可能会受到更多限制。任何建议表示赞赏。
解决方案
首先,您需要将 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);
}
推荐阅读
- c# - WCF 双工代理回调的 STA 线程上下文
- optimization - 需要提示!程序使用内联 asm 调用函数而不是 C 函数时出现错误行为
- python - 从一维 NumPy 数组创建一个二维掩码
- version-control - 如何为仅包含三个 yaml 脚本文件的版本构建清单文件?
- smtpclient - SmtpClient.send - 找不到路径的一部分
- java - SELECT查询在Oracle中给出唯一约束违规
- amazon-web-services - AWS EMR:解析参数时出错:预期:'=',收到:'EOF' 用于输入:
- php - 隐藏部分电话号码
- maven - 如何创建 pom.xml 来编译我的 Jenkins Pipeline 共享库?
- c# - C#“新”关键字