APIサーバーからデータを取得するためにfetch()を使用しています。私のエラーは次のようになります:
Uncaught (in promise) SyntaxError: Unexpected end of input at
fetch.then.blob.
何が間違っているのか教えてください。
const weatherAPi ='https://www.metaweather.com/api/location/523920';
fetch(weatherAPi, {
mode: 'no-cors'
}).then(blob => blob.json())
.then(data => console.log(data))
クロスオリジンリソースへのno-cors
リクエストのレスポンスには、 レスポンスタイプ 'opaque' があります。 JSONに変換する前に応答をログに記録すると、「不透明」なタイプが表示されます。
不透明タイプは 「厳しく制限されている」としてリストされている です。
不透明フィルター応答は、タイプが「不透明」、urlリストが空のリスト、ステータスが0、ステータスメッセージが空のバイトシーケンス、ヘッダーリストが空、本文がnull、トレーラーが空のフィルター応答です。
現在、タイプが不透明の場合、それらを読み取ることはできません。
不透明な応答は、CORSヘッダーを返さない異なるオリジンのリソースに対して行われた要求に対するものです。不透明な応答では、返されたデータを読み取ったり、要求のステータスを表示したりできません。つまり、要求が成功したかどうかを確認できません。現在のfetch()実装では、ウィンドウのグローバルスコープとは異なるOriginのリソースをリクエストすることはできません。
同じ問題がありました。私の場合、ソリューションが示した「不透明」の応答タイプが原因ではありませんでした。 「fetch」は空の本文の応答を受け入れないため、このコードは空の応答でエラーを引き起こします。
return fetch(urlToUser, parameters)
.then(response => {
return response.json()
})
.then((data) => {
resolve(data)
})
.catch((error) => {
reject(error)
})
代わりに、私の場合、これはよりうまく機能します:
return fetch(urlToUser, parameters)
.then(response => {
return response.text()
})
.then((data) => {
resolve(data ? JSON.parse(data) : {})
})
.catch((error) => {
reject(error)
})
本文を取得しても、空の本文であってもエラーは発生しません。次に、データが存在するかどうかを確認して解決します。私はそれが役立つことを願っています:-)
PHPのヘッダーまたは別のサーバーエンドポイントに行が必要です。
<?php
header('Access-Control-Allow-Origin: *');
//or
header('Access-Control-Allow-Origin: http://example.com');
// Reading JSON POST using PHP
$json = file_get_contents('php://input');
$jsonObj = json_decode($json);
// Use $jsonObj
print_r($jsonObj->message);
...
// End php
?>
POST要求を使用した作業フェッチコードのモデルは次のとおりです。
const data = {
optPost: 'myAPI',
message: 'We make a research of fetch'
};
const endpoint = 'http://example.com/php/phpGetPost.php';
fetch(endpoint, {
method: 'POST',
body: JSON.stringify(data)
})
.then((resp) => resp.json())
.then(function(response) {
console.info('fetch()', response);
return response;
});
CORS Originポリシーの問題に遭遇しました。これに取り組むには、サーバー側のAPIにアクセスする権限が必要です。特に、phpまたは別のサーバーエンドポイントのヘッダーに行を追加する必要があります。
<?php
header('Access-Control-Allow-Origin: *');
//or
header('Access-Control-Allow-Origin: http://example.com');
// Reading JSON POST using PHP
$json = file_get_contents('php://input');
$jsonObj = json_decode($json);
// Use $jsonObj
print_r($jsonObj->message);
...
// End php
?>
また、サーバーエンドポイントのヘッダーに含まれないようにしてください。
header("Access-Control-Allow-Credentials" : true);
POST要求を使用した作業フェッチコードのモデルは次のとおりです。
const data = {
optPost: 'myAPI',
message: 'We make a research of fetch'
};
const endpoint = 'http://example.com/php/phpGetPost.php';
fetch(endpoint, {
method: 'POST',
body: JSON.stringify(data)
})
.then((resp) => resp.json())
.then(function(response) {
console.info('fetch()', response);
return response;
});