改造继续在浏览器中工作(响应为 html 页面)
Retrofit continue work in browser (response as html page)
我在一家银行工作 api。当用户选择将他的银行卡添加到他的帐户时,我需要向他们的 API 提出请求,然后继续在浏览器中让用户在 https 安全
中输入他的银行卡凭据
API 看起来像这样:
@FormUrlEncoded
@POST("/jsp/hbpay/logon.jsp")
Observable<Response<String>> addCard(@Field("Signed_Order_B64") String order,
@Field("email") String email,
@Field("Language") String lang,
@Field("BackLink") String backLink,
@Field("PostLink ") String postLink,
@Field("FailureBackLink") String failureBackLink);
BackLink 和其他应该是在不同情况下发送给用户的网络链接。我不知道该为 android.
放什么
接下来,我有我的要求:
private void addCardRequest() {
showProgress();
mDisposable.add(createAddCardOrder()
.flatMap(orderString -> mBankApi.addCard(orderString,
mDataManager.getLocalUserInfo().getEmail(),
BankApi.EPAY_LANG,
BankApi.EPAY_BACK_LINK,//"http://localhost/"?
BankApi.EPAY_POST_LINK,
BankApi.EPAY_FAILURE_BACK_LINK))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handleAddCardResponse,
this::handleError,
() -> Timber.w("addCard completed")));
}
响应是一个普通的 html 页面,其中包含大量图片和脚本。我现在所做的只是将其保存为 .html 文件,然后在网络视图中显示:
private void handleAddCardResponse(Response<String> response) throws Exception {
hideProgress();
if (response.isSuccessful()) {
String fileUrl = getContext().getCacheDir() + "/add_card.html";
Utils.writeStringToFile(getContext(), response.body(), fileUrl);
startActivity(WebViewActivity.getIntent(getContext(), fileUrl));
} else {
throw handleUnsuccessfulResponse(response);
}
}
我需要的是在浏览器中打开传入响应(这是一个 html 标记),或者让浏览器发出我的请求并处理响应
我应该在 WebViewActivity 中调用它:
webView.setWebViewClient(new MyWebViewClient());
webView.postUrl(POST_URL, postData.getBytes());
postData 构建如下:
private String buildPostData(String order64) {
try {
return URLEncoder.encode("Signed_Order_B64", "UTF-8") + "=" + URLEncoder.encode(order64, "UTF-8")
+ "&"
+ URLEncoder.encode("Language", "UTF-8") + "=" + URLEncoder.encode(BankApi.EPAY_LANG, "UTF-8")
+ "&"
+ URLEncoder.encode("BackLink", "UTF-8") + "=" + URLEncoder.encode(BankApi.EPAY_BACK_LINK, "UTF-8")
+ "&"
+ URLEncoder.encode("FailureBackLink", "UTF-8") + "=" + URLEncoder.encode(BankApi.EPAY_FAILURE_BACK_LINK, "UTF-8")
+ "&"
+ URLEncoder.encode("PostLink", "UTF-8") + "=" + URLEncoder.encode(BankApi.EPAY_POST_LINK, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "";
}
}
MyWebViewClient 应该看起来像这样,所以它会捕获 url 个链接:
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Timber.w("URL loading = %s", url);
if (BankApi.EPAY_POST_LINK.equals(url)) {
setResult(RESULT_OK);
finish();
return true;
} else if (BankApi.EPAY_BACK_LINK.equals(url)) {
setResult(RESULT_CANCELED);
finish();
return true;
} else if (BankApi.EPAY_FAILURE_BACK_LINK.equals(url)) {
setResult(RESULT_FAILURE);
finish();
return true;
} else {
return false;
}
}
然后只需调用 startActivityForResult 并收听结果
我在一家银行工作 api。当用户选择将他的银行卡添加到他的帐户时,我需要向他们的 API 提出请求,然后继续在浏览器中让用户在 https 安全
中输入他的银行卡凭据API 看起来像这样:
@FormUrlEncoded
@POST("/jsp/hbpay/logon.jsp")
Observable<Response<String>> addCard(@Field("Signed_Order_B64") String order,
@Field("email") String email,
@Field("Language") String lang,
@Field("BackLink") String backLink,
@Field("PostLink ") String postLink,
@Field("FailureBackLink") String failureBackLink);
BackLink 和其他应该是在不同情况下发送给用户的网络链接。我不知道该为 android.
放什么接下来,我有我的要求:
private void addCardRequest() {
showProgress();
mDisposable.add(createAddCardOrder()
.flatMap(orderString -> mBankApi.addCard(orderString,
mDataManager.getLocalUserInfo().getEmail(),
BankApi.EPAY_LANG,
BankApi.EPAY_BACK_LINK,//"http://localhost/"?
BankApi.EPAY_POST_LINK,
BankApi.EPAY_FAILURE_BACK_LINK))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handleAddCardResponse,
this::handleError,
() -> Timber.w("addCard completed")));
}
响应是一个普通的 html 页面,其中包含大量图片和脚本。我现在所做的只是将其保存为 .html 文件,然后在网络视图中显示:
private void handleAddCardResponse(Response<String> response) throws Exception {
hideProgress();
if (response.isSuccessful()) {
String fileUrl = getContext().getCacheDir() + "/add_card.html";
Utils.writeStringToFile(getContext(), response.body(), fileUrl);
startActivity(WebViewActivity.getIntent(getContext(), fileUrl));
} else {
throw handleUnsuccessfulResponse(response);
}
}
我需要的是在浏览器中打开传入响应(这是一个 html 标记),或者让浏览器发出我的请求并处理响应
我应该在 WebViewActivity 中调用它:
webView.setWebViewClient(new MyWebViewClient());
webView.postUrl(POST_URL, postData.getBytes());
postData 构建如下:
private String buildPostData(String order64) {
try {
return URLEncoder.encode("Signed_Order_B64", "UTF-8") + "=" + URLEncoder.encode(order64, "UTF-8")
+ "&"
+ URLEncoder.encode("Language", "UTF-8") + "=" + URLEncoder.encode(BankApi.EPAY_LANG, "UTF-8")
+ "&"
+ URLEncoder.encode("BackLink", "UTF-8") + "=" + URLEncoder.encode(BankApi.EPAY_BACK_LINK, "UTF-8")
+ "&"
+ URLEncoder.encode("FailureBackLink", "UTF-8") + "=" + URLEncoder.encode(BankApi.EPAY_FAILURE_BACK_LINK, "UTF-8")
+ "&"
+ URLEncoder.encode("PostLink", "UTF-8") + "=" + URLEncoder.encode(BankApi.EPAY_POST_LINK, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "";
}
}
MyWebViewClient 应该看起来像这样,所以它会捕获 url 个链接:
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Timber.w("URL loading = %s", url);
if (BankApi.EPAY_POST_LINK.equals(url)) {
setResult(RESULT_OK);
finish();
return true;
} else if (BankApi.EPAY_BACK_LINK.equals(url)) {
setResult(RESULT_CANCELED);
finish();
return true;
} else if (BankApi.EPAY_FAILURE_BACK_LINK.equals(url)) {
setResult(RESULT_FAILURE);
finish();
return true;
} else {
return false;
}
}
然后只需调用 startActivityForResult 并收听结果