改造继续在浏览器中工作(响应为 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 并收听结果