programing

Android:WebView에서 AJAX 호출 가로채기

subpage 2023. 8. 22. 22:10
반응형

Android:WebView에서 AJAX 호출 가로채기

갖고 싶어요HTML/javascript응용 프로그램, 실행 중WebView만들기 위해서AJAX에서 처리하는 호출Java암호를
통화를 가로채는 것이 이상적임(쉽고 사용하기만 하면 됨)shouldOverrideUrlLoading()) 및 일부 데이터를 '반환'합니다.
하지만, 저는 응답을 '반환'할 방법을 찾지 못했습니다.WebView전화하는 것 말고는javascript사용하여 기능loadUrl().
이것은 나에게 효과가 없을 것이다, 왜냐하면.HTML/javascript앱은 제가 제어할 수 없는 드롭인 앱입니다.HTML/javascript 앱에 관한 한, 그것은 그냥 합니다.AJAX전화를 걸어 데이터를 다시 받습니다.

이것에 대한 의견이 있습니까?

모두 좋은 소식입니다.API 레벨 11을 사용하여, 그들은 다음을 추가했습니다.shouldInterceptRequest에의 방법.WebViewClient클래스. 또한 내부의 애플리케이션 요청 시 실행됩니다.WebView트리거.다음과 같이 재정의할 수 있습니다.

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{
    if (magicallyMatch(url))
        return new WebResourceResponse("application/json", "utf-8", magicallyGetSomeInputStream());

    return null;
}

Android 참조 자료:

공개 웹 리소스 응답은 다음과 같아야 합니다.인터셉트 요청(WebView 보기, String url)

시작: API 레벨 11

호스트 응용 프로그램에 리소스 요청을 알리고 응용 프로그램이 데이터를 반환하도록 허용합니다.반환 값이 null이면WebView평소와 같이 리소스를 계속 로드합니다.그렇지 않으면 반환 응답 및 데이터가 사용됩니다.참고: 이 메서드는 네트워크 스레드에서 호출되므로 클라이언트는 개인 데이터에 액세스할 때 주의해야 합니다.

매개변수

viewWebView리소스를 요청하는 것입니다.

url리소스의 원시 URL입니다.

돌아온다

A WebResourceResponse응답 정보를 포함하거나 null인 경우WebView리소스 자체를 로드해야 합니다.

또한 웹 리소스 응답을 확인합니다.

이게 도움이 되길 바랍니다.

Javascript를 사용할 수 있습니다.JQuery 메서드와 함께 AJAX 호출을 인터셉트하는 인터페이스ajaxStart그리고.ajaxComplete다음과 같은 방법으로:

// our JavascriptInterface
public class AjaxHandler {

    private static final String TAG = "AjaxHandler";
    private final Context context;

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

    public void ajaxBegin() {
        Log.w(TAG, "AJAX Begin");
        Toast.makeText(context, "AJAX Begin", Toast.LENGTH_SHORT).show();
    }

    public void ajaxDone() {
        Log.w(TAG, "AJAX Done");
        Toast.makeText(context, "AJAX Done", Toast.LENGTH_SHORT).show();
    }
}

그리고 이것이 어떻게.AjaxHandler에 사용됨Activity:

    public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    private WebView webView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        // get web view
        webView = (WebView) findViewById(R.id.web); 

        // configure web view 
        final WebSettings webSettings = webView.getSettings();
        webSettings.setBuiltInZoomControls(true);
        webSettings.setJavaScriptEnabled(true);

        webView.loadUrl("http://foo.com");

        // add javascript interface
        webView.addJavascriptInterface(new AjaxHandler(this), "ajaxHandler");

        // override onPageFinished method of WebViewClient to handle AJAX calls 
        webView.setWebViewClient(new WebViewClient() {

                @Override
                public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);

                    view.loadUrl("javascript:$(document).ajaxStart(function (event, request, settings) { " +
                            "ajaxHandler.ajaxBegin(); " + // Event called when an AJAX call begins
                            "});");
                    view.loadUrl("javascript:$(document).ajaxComplete(function (event, request, settings) { " +
                            "ajaxHandler.ajaxDone(); " + // Event called when an AJAX call ends
                            "});");

            });
    }
}

주요 아이디어는 여기서 가져온 것이며 몇 가지 수정 사항과 함께 제시됩니다.
비록 답을 제출하는 것이 조금 늦었지만 이것이 다른 사람들에게도 도움이 되기를 바랍니다!

결국 저는 어쨌든 질문에 설명된 방법을 사용했습니다.

다음과 같은 특정 요청을 가로챘습니다.foo://bar/get/1?callback=foobar그런 다음 구문 분석URL그리고 실제 데이터로 자바스크립트 콜백 함수를 호출했습니다.
콜백 함수는 의 쿼리 부분에서 정의되었습니다.URL따라서 위의 예에서는 다음과 같습니다.foobar();

이 기능을 호출하는 것은 쉬웠으며, 사용하기만 하면 됩니다.yourWebView.loadUrl("javascript:foobar('somedata')");

2023년인데 저도 같은 문제에 직면했습니다.

나는 그것을 사용하여 풀었습니다.shouldInterceptRequest() 그에 행동하는 입니다.해킹은 가로채는 요청을 걸러내고 그에 따라 행동하는 것입니다.

shouldInterceptRequest()는 사용자의 드는사요가모것입에서 입니다.WebView저의 경우, 저는 요청이 정확하게 이루어지고 있으며, 요청과 관련된 정확한 URL을 알고 있습니다.

@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

  String sURLPatternExpected = "";
  if (request.getUrl().toString().contains(sURLExpected)) {

    String sExactURLExpected = "";
    if (!request.getUrl().toString().equals(sExactURLExpected)) {
      //  User is going outside your expected URL.
    } else {
      //  User is going outside your expected URL.
    }

  }

  return null;
}

위의 스니펫에서 먼저 요청 URL이 찾으려는 패턴과 일치하는지 확인합니다.를 들어, 만약 당신이 어들를, 에과같 에 관심이 있다면, 다음있 URL은 는우경입니다.http://example.com/app/resource?message=hello와 같은 위의방로필에터면다음같하 URL다서방수와 같은 에 대한 할 수 .http://example.com/favicon.ico.

이제 필터링된 URL 그룹에서 예상되는 정확한 URL을 확인합니다.

마침내, 나는 돌아옵니다.null을 허락하는 것은WebView요청을 정상적으로 처리합니다.

언급URL : https://stackoverflow.com/questions/3941969/android-intercept-ajax-call-from-webview

반응형