在 Android 中,如果你正在使用 WebView 控件并且想要将一些数据通过 HTTP header 发送给前端 H5 页面,你可以通过以下步骤操作:

1.设置 WebView WebSettings

确保你的 WebView 已经配置了正确的设置,例如启用 JavaScript

2.创建一个 WebViewClient

创建一个自定义的 WebViewClient 并覆盖 shouldOverrideUrlLoading() 方法以处理页面加载。

3.加载 URL时添加 Header

当你调用 loadUrl() 方法加载一个网页时,可以使用 WebSettings.setCustomHeaders() 方法来添加自定义的HTTP headers。但是请注意,setCustomHeaders() 方法实际上并不存在于 WebViewWebSettings 类中。你需要在调用 loadUrl() 方法时直接添加 headers

4.使用正确的语法添加 Headers:

在调用 loadUrl() 方法时,可以通过 URL 字符串中的 #Intent; 部分添加 headers。然而,更常见和推荐的做法是在 WebViewClientonPageStarted()onPageFinished() 方法中使用 addRequestHeader() 方法来添加 headers

下面是一个示例代码,展示了如何在加载 URL 时添加一个自定义 header

WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);

// 添加一个自定义的 header
webView.addJavascriptInterface(new WebAppInterface(this), "HtmlViewer");

// 设置 WebViewClient
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // 这里可以处理页面加载事件,但通常不需要做任何事情
        return super.shouldOverrideUrlLoading(view, url);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        // 可以在这里添加额外的 headers,但通常在 loadUrl 前添加
    }
});

// 添加 header 并加载 URL
Map<String, String> additionalHeaders = new HashMap<>();
additionalHeaders.put("Custom-Header", "HeaderValue");
webView.loadUrl("http://example.com", additionalHeaders);

注意

前端 H5 页面可以通过 XMLHttpRequest 或者 fetch API 的响应对象 .headers 属性来访问这些 headers。然而,默认情况下,由于同源策略限制,前端只能访问某些预定义的简单 headers。如果需要访问自定义的 headers,需要在后端设置 CORS(Cross-Origin Resource Sharing)策略,允许前端访问特定的 headers

确保你的后端服务正确设置了 Access-Control-Expose-Headers 标头,以允许前端访问你想要暴露的自定义 header。例如:

Access-Control-Expose-Headers: Custom-Header

这样,前端就可以通过response.headers.get('Custom-Header')访问到这个 header的值了。

实例

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化 WebView
        webView = (WebView) findViewById(R.id.webView);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true); // 启用 JavaScript

        // 设置 WebViewClient 以处理页面加载
        webView.setWebViewClient(new WebViewClient());

        // 创建一个 Map 来存储自定义 headers
        Map<String, String> additionalHeaders = new HashMap<>();

        // 添加自定义 header
        additionalHeaders.put("X-Custom-Header", "CustomHeaderValue");

        // 使用 loadUrl 方法加载 URL,并传入 headers
        webView.loadUrl("http://example.com", additionalHeaders);
    }
}

在这个例子中,我们创建了一个简单的 Activity,其中包含一个 WebView。我们启用了 JavaScript,因为可能需要它来处理前端页面上的交互。然后,我们通过 loadUrl 方法加载了一个 URL,并传递了一个包含自定义 headers Map

接下来,前端页面需要通过 AJAX 请求来访问这些 headers。在前端页面中,你可以使用 Fetch API XMLHttpRequest 来发起请求,并读取响应的 headers。以下是一个使用 Fetch API的示例:

fetch('/some-endpoint')
  .then(response => {
    // 获取自定义 header 的值
    const customHeaderValue = response.headers.get('X-Custom-Header');
    console.log('Custom header value:', customHeaderValue);
    return response.json(); // 如果响应体是 JSON 格式
  })
  .then(data => {
    // 处理数据
    console.log('Data:', data);
  })
  .catch(error => {
    console.error('Error fetching data:', error);
  });

请记住,为了让前端能够访问到这些自定义headers,服务器端需要正确设置CORS(跨域资源共享)策略,并在响应中包含Access-Control-Expose-Headers头,以允许前端访问特定的headers

例如,服务器应返回如下响应头:

Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: X-Custom-Header

这样,前端就能读取到X-Custom-Header 的值了。