我正在尝试向SOAP服务器发出Ajax请求。
我正在使用没有Expo(使用本机代码构建)和TypeScript的React Native。
我使用带有棉花糖Intel x64映像的Android虚拟设备测试了结果。
当我运行最新的Chrome浏览器时
chromium-browser %U --disable-web-security --user-data-dir="/home/user/.config/chromium"
并在Chrome的控制台(*)中运行以下命令:
window.body = '<?xml version="1.0" encoding="utf-8"?>' +
'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://www.mf.gov.pl/uslugiBiznesowe/uslugiDomenowe/AP/WeryfikacjaVAT/2018/03/01">' +
'<soap:Body>' +
'<NIP xmlns="http://www.mf.gov.pl/uslugiBiznesowe/uslugiDomenowe/AP/WeryfikacjaVAT/2018/03/01">' +
'<NIP>8960005673</NIP>' +
'</NIP>' +
'</soap:Body>' +
'</soap:Envelope>';
window.headers = new Headers({
Accept: 'text/html,application/xhtml+xml,application/xml,text/xml;q=0.9,*/*;q=0.8',
SOAPAction: "http://www.mf.gov.pl/uslugiBiznesowe/uslugiDomenowe/AP/WeryfikacjaVAT/2018/03/01/WeryfikacjaVAT/SprawdzNIP",
'Content-Type': 'text/xml; charset=utf-8',
});
fetch("https://sprawdz-status-vat.mf.gov.pl/",
{
headers: window.headers,
credentials: "include",
referrer: "http://localhost:1234/",
referrerPolicy: "no-referrer-when-downgrade",
body: window.body.replace(/\n/g, ''),
method: "POST",
mode: "cors"
}).then(_=>_.text()).then(console.log);
我得到了正确的答复:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<WynikOperacji xmlns="http://www.mf.gov.pl/uslugiBiznesowe/uslugiDomenowe/AP/WeryfikacjaVAT/2018/03/01">
<Kod>C</Kod>
<Komunikat>Podmiot o podanym identyfikatorze podatkowym NIP jest zarejestrowany jako podatnik VAT czynny
</Komunikat>
</WynikOperacji>
</s:Body>
</s:Envelope>
通过在node-soap上使用browserify并在Chrome中像这样运行来获取参数,标头和信封:
const test = (async (NIP) => {
const client = await soap.createClientAsync('https://sprawdz-status-vat.mf.gov.pl/?wsdl', {});
const params = {NIP};
const result = await client.SprawdzNIPAsync(params);
const response = await result.json();
return response;
});
在React Native 0.56中运行相同的代码(*)会引发错误,该错误是:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Service</title>
</head>
<body>
<div id="content">
<p class="heading1">Service</p>
<p xmlns="">There is no operation listening for <a href="http://sprawdz-status-vat.mf.gov.pl/WebFiles/WeryfikacjaVAT.wsdl">http://sprawdz-status-vat.mf.gov.pl/WebFiles/WeryfikacjaVAT.wsdl</a>, but there is an operation listening for <a href="http://sprawdz-status-vat.mf.gov.pl/WebFiles/WeryfikacjaVAT.wsdl/">http://sprawdz-status-vat.mf.gov.pl/WebFiles/WeryfikacjaVAT.wsdl/</a>, so you are being redirected there.</p>
</div>
</body>
</html>
和响应标头(由console.log(request.headers获得),因为一个标头无法在Chromes Network Panel中观察React Native Ajax请求)
connection: "Keep-Alive"
content-length: "1957"
content-type: "text/html; charset=UTF-8"
date: "Wed, 26 Sep 2018 22:58:12 GMT"
keep-alive: "timeout=3, max=10000"
location: "http://sprawdz-status-vat.mf.gov.pl/WebFiles/WeryfikacjaVAT.wsdl/"
server: "Microsoft-HTTPAPI/2.0"
我不知道如何获取React Native使用的请求默认标头。如您从错误响应的正文和标头中看到的,我的请求被重定向了。
如何调试这种情况并获得成功请求的解决方案?