使用 React Native 的 WebView 获取 JSON 的正确方法

2024-06-19

WebView 似乎在 React-Native 中扮演着类似 Web Worker 的角色。

我正在尝试将大量数据获取卸载到 WebView,但这似乎非常痛苦并且找不到fetch示例与WebView.

所以我有下面的 JavaScript 代码,我试图用它来调用 API。

当使用常规反应本机类中的完全相同的代码时,可以完美地获取和解析 JSON 响应。

但是当相同的 JavaScript 代码被注入到 WebView 中时injectJavaScript方法,将Content-Type值导致问题。 (当我删除它时,我从后端看到调用已进行,但我无法在前端 - WebView 端 - 获取 JSON 数据。)

尽管API后端允许所有跨域请求,但它似乎与cors有关。

因此,我的问题是:

  1. 在 React-Native 中将 fetch 与 WebView 一起使用的正确方法是什么?
  2. 为什么react-native和WebView之间的行为不同?
var l_headers = {
   Accept: 'application/json',
   'Content-Type': 'application/json'
};
var l_init = {
    method: "POST",
    headers: l_headers,
    body: {}
};
fetch("http://172.20.10.12:8000/test", l_init).then(function (response) {
    return response.json();
}).then(function (responseJson) {
    alert('API called: ' + JSON.stringify(responseJson));
});

PS:最后一个障碍,请注意,我也在使用 EXPO,但由于它的好处而无法弹出。这就是为什么我今天无法使用react-native-community的react-native-webview。 (看来将来这将针对世博会进行调整)。


Update
下面的代码片段,我通过 POST 获取来获取 JSON,一旦获取,响应就会显示在警报中。这是一个工作小吃博览会链接 https://snack.expo.io/@jerinjohnk/fetch-injected.

  injectjs() {
    let jsCode = `const bodyData = JSON.stringify({
      title: 'foo',
      body: 'bar',
      userId: 1
    });
    fetch('https://jsonplaceholder.typicode.com/posts', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: bodyData,
    }).then(response => response.text()).then(valueText => {
      alert(JSON.stringify(valueText));
    });`;
    return jsCode;
  }

  render() {
    return (
      <View style={styles.container}>
       <WebView
          ref={webview => { this.webview = webview; }}
          source={{
            uri: "https://www.google.com"
            }}
            injectedJavaScript={this.injectjs()}
            javaScriptEnabled = {true}
            style={styles.webview}
          />
      </View>
    );
  }

旧答案
我通常使用postMessage当我需要在 HTML 和 React Native 代码之间进行通信时,在 React Native WebView 中。

  • 用于发送消息以响应本机的 HTML 代码
    postMessage(JSON.stringify(yourJson), '*');
  • 接收来自 React Native 的消息

    document.addEventListener('message',(event) => {
    eval(event, data)
    }, false)

  • 反应本机 WebView
    <WebView
           ref={webview => { this.webview = webview; }}
           source={anySource}
           injectedJavaScript={script}
           javaScriptEnabled = {true}
           onMessage={this.onMessage}
           onNavigationStateChange = {this.handleNavigation}
         />
  • 接收消息

    onMessage = (e) => {
     let { data } = e.nativeEvent; // data you will receive from html
    }

  • 发布消息
    this.webview.postMessage('YourMessage')

If postMessage在世博会上不起作用,您可以使用onShouldStartLoadWithRequest / onNavigationStateChange方法代替。

    handleNavigation = (event) => {
        const url = event.url;
        const sections = url.split('#');
        if(sections.length > 1 && sections[1].indexOf('message=') != -1) {
           const message = sections[1[.replace('message=', '');
           //Do any action with message
           return;
        }
        //Other navigation actions
      }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 React Native 的 WebView 获取 JSON 的正确方法 的相关文章

随机推荐