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
평소와 같이 리소스를 계속 로드합니다.그렇지 않으면 반환 응답 및 데이터가 사용됩니다.참고: 이 메서드는 네트워크 스레드에서 호출되므로 클라이언트는 개인 데이터에 액세스할 때 주의해야 합니다.매개변수
view
그WebView
리소스를 요청하는 것입니다.
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
'programing' 카테고리의 다른 글
Swift UI에서 Object Object와 State Object의 차이점은 무엇입니까? (0) | 2023.08.27 |
---|---|
Parse as PFFile에 업로드하기 전에 이미지 크기를 줄이는 압축 방법? (Swift) (0) | 2023.08.22 |
float64 with 팬더 to_csv (0) | 2023.08.22 |
ASP.NET MVC3 부분 뷰 명명 규칙 (0) | 2023.08.22 |
다대다 관계 예제 (0) | 2023.08.22 |