似乎WebView在React-Native中扮演着网络工作者的类似角色。
我正在尝试将重载大数据获取到网络浏览量,但似乎很痛苦,找不到fetch
WebView
的示例。
所以我在JavaScript代码下面尝试使用API。
使用常规反应类完全相同的代码时,JSON响应将得到完美获取和解析。
但是,当使用injectJavaScript
方法将相同的JavaScript代码注入WebView时,Content-Type
值会导致问题。(当我删除它时,我从后端看到了调用,但我无法在前端获得JSON数据 - WebView side-。)
即使API后端允许所有交叉原始请求,也似乎与CORS有关。
因此,我的问题是:
- 在React-Native中使用WebView的获取方法是什么?
- 为什么这种行为在反应本文和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:最终的障碍,请注意,我也在使用博览会,并且由于其好处而无法弹出。这就是为什么截至今天我无法使用React-Native-and-community的反应态 - 网络视野的原因。(将来似乎将适应Expo)。
update
按照代码段之段,我将通过后获取来获取JSON,一旦提取后,响应就会在警报中显示。这是一个工作的小吃博览会链接。
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>
);
}
旧答案
当我需要在HTML和React Antive代码之间进行通信时,我通常在反应网络视频中使用postMessage
。
- HTML代码将消息发送到React Native
postMessage(JSON.stringify(yourJson), '*');
- 接收来自React Native的消息
document.addEventListener('message',(event) => {
eval(event, data)
}, false)
- React Native 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')
如果postMessage
在EXPO中不起作用,则可以使用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
}