javascript 处理响应-语法错误:使用模式时输入意外结束:“无cors”

ct3nt3jp  于 2023-06-28  发布在  Java
关注(0)|答案(6)|浏览(137)

我尝试了ReactJS对REST-API的fetch调用,并希望处理响应。调用成功,我得到了一个响应,我可以在Chrome开发工具中看到:

function getAllCourses() {
fetch('http://localhost:8080/course', {
    method: 'POST',
    mode: 'no-cors',
    credentials: 'same-origin',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        objectClass: 'course',
        crud: '2'
    })
}).then(function (response) {
    console.log(response);
    return response.json();

}).catch(function (err) {
    console.log(err)
});
}

当我尝试处理响应时,我得到了一个“SyntaxError:输入“”的意外结束

return response.json();

console.log看起来像这样:

我的响应JSON看起来像这样,它是有效的,我用jsonlint检查了它:

[
  {
    "0x1": {
      "users": [],
      "lectures": [],
      "owner": "0x2",
      "title": "WWI 14 SEA",
      "description": null,
      "objectClass": "course",
      "id": "course_00001"
    },
    "0x2": {
      "username": "system",
      "lectures": [],
      "course": null,
      "solutions": [],
      "exercises": [],
      "roles": [
        "0x3",
        "0x4",
        "0x5"
      ],
      "objectClass": "user",
      "id": "user_00001"
    },
    "0x3": {
      "roleName": "ROLE_ADMIN",
      "objectClass": "role",
      "id": "role_00001"
    },
    "0x4": {
      "roleName": "ROLE_STUDENT",
      "objectClass": "role",
      "id": "role_00002"
    },
    "0x5": {
      "roleName": "ROLE_DOCENT",
      "objectClass": "role",
      "id": "role_00003"
    }
  }
]
nzkunb0c

nzkunb0c1#

您需要从请求中删除mode: 'no-cors'设置。设置no-cors模式正是您遇到问题的原因。
no-cors请求的响应类型为opaque。问题中的日志片段表明了这一点。Opaque 意味着你的前端JavaScript代码看不到响应体或头。
https://developer.mozilla.org/en-US/docs/Web/API/Request/mode解释说:
no-cors- JavaScript不能访问结果Response的任何属性
因此,设置no-cors模式的效果本质上是告诉浏览器,*“不要让前端JavaScript代码在任何情况下访问响应体或头。
当响应不包含Access-Control-Allow-Origin响应头时,人们有时会尝试设置no-cors模式,或者因为请求是触发CORS预处理的请求,所以您的浏览器会执行OPTIONS预处理。
但是使用no-cors模式并不能解决这些问题。解决办法是:

  • 配置向其发出请求的服务器,使其发送Access-Control-Allow-Origin响应头,并处理OPTIONS请求
  • 或者使用来自https://github.com/Rob--W/cors-anywhere/等的代码设置CORS代理;请参阅 * 当尝试从REST API获取数据时,在 * 请求的资源上不存在'Access-Control-Allow-Origin'头 * 中回答的 * 如何使用CORS代理来解决“无Access-Control-Allow-Origin头”问题 * 部分
5lhxktic

5lhxktic2#

在你的then中,你应该在返回response.json之前检查响应是否正常:

.then(function (response) {
    if (!response.ok) {
        return Promise.reject('some reason');
    }

    return response.json();

})

如果你想在你的rejected promise中有错误消息,你可以这样做:

.then(function (response) {
    if (!response.ok) {
       return response.text().then(result => Promise.reject(new Error(result)));
    }

    return response.json();
})
7xzttuei

7xzttuei3#

我知道这个答案可能是超级晚,可能已经得到解决,但我只是有同样的问题,今天,我只需要添加一个','在年底的标题散列,我停止得到错误

export function addContacts(formData) {
  return(dispatch) => {
    dispatch({type: 'POSTING_CONTACTS'});
    console.log(formData)
    return fetch(uri, {
      method: 'POST',
      body: JSON.stringify({contact: {name: formData.name, phone_number: formData.phoneNumber}}),
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json'
      },
    })
    .then(response => {
        return response.json()
      }).then(responseJSON => {
        console.log(responseJSON)
        return dispatch({type: 'ADD_CONTACT', payload: responseJSON});
      })
  }
}
gab6jxml

gab6jxml4#

您可以通过在php或其他服务器端点的头中添加行来避免CORS策略的问题:

<?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;
});
jq6vz3qz

jq6vz3qz5#

这个答案是为了澄清为了完成一个成功的CORS请求在后端需要什么。在本例中,您可以看到,如果Authorization头包含随请求沿着发送的Bearer令牌,则只允许来自任何始发*的OPTIONS和POST。关注fetchOptionsdefaultResponseHeaders

服务器端:

创建一个简单的if条件来处理OPTIONS http请求,该请求查询浏览器在您发出的每个请求时发送的CORS权限。

const defaultResponseHeaders = new Headers({
  "Server": "JSON-RPC 2.0 Server",
  "Allow": "OPTIONS, POST",
  "Cache-Control": "no-store",
  "Content-Type": "application/json; charset=UTF-8",
  "Content-Language": "en-US",
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Methods": "OPTIONS, POST",
  "Access-Control-Allow-Headers": "Content-Type, Authorization"
});

if (reqMethod == "OPTIONS") {
  console.info("S: 204 No Content");

  status = 204;
  statusText = "No Content";

  return new Response(null, {
    headers: defaultResponseHeaders,
    status: status,
    statusText: statusText,
  });
}

客户端:

请注意fetchOptions中的mode: "cors"。这指示浏览器向API端点发出OPTIONS请求**,然后通过您在defaultResponseHeaders中指定的Access-Control CORS头告诉浏览器它将接受什么**。

async function getProjectJSON(projectId) {
  
  const rpcRequest = {
    jsonrpc: "2.0",
    method: "readproject_n",
    params: {
      id: projectId
    },
    id: "c990be06-298b-4f00-b822-50f585e69163",
    timestamp: Date.now()
  };

  // fetch options
  const fetchOptions = {
    method: "POST",
    mode: "cors",
    headers: {
      "Content-Type": "application/json",
      "Authorization": "Bearer 29fea2ddebd08ed73a0fe7952968ca60b9e56e678a367578825b6c4c8824d248",
    },
    body: JSON.stringify(rpcRequest)
  };
  // make request
  const request = await fetch(`http://10.0.0.9:3000/jsonrpc`, fetchOptions);
  // parse JSON response
  const response = await request.json();
  // return JS object
  return response;
}
kqqjbcuj

kqqjbcuj6#

只需复制以下代码并将其粘贴到<system.webServer>标记下的web.config文件中。

<httpProtocol>  
    <customHeaders>  
     <add name="Access-Control-Allow-Origin" value="*" />  
     <add name="Access-Control-Allow-Headers" value="Content-Type" />  
     <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />  
    </customHeaders>  
  </httpProtocol>

相关问题