2017-09-23 55 views
0

所以我graphql API是在https://gpbaculio-tributeapp.herokuapp.com/graphql我cnofigured上傳,標題是這樣的:即使使用「Access-Control-Allow-Origin」,服務器也會響應405錯誤:'*'?

const fetchQuery = (operation, variables) => { 
    return fetch('/graphql', { 
    method: 'POST', 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json', 
     'Access-Control-Allow-Origin': '*' 
    }, 
    body: JSON.stringify({ 
     query: operation.text, 
     variables, 
    }), 
    }).then(response => { 
    return response.json() 
    }) 
} 

我從MDN

For requests without credentials, the server may specify "*" as a wildcard, thereby allowing any origin to access the resource.

,所以我試圖發佈在codepen的應用程式閱讀,而這是我的錯誤:

Failed to load https://gpbaculio-tributeapp.herokuapp.com/graphql : Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' https://s.codepen.io '

爲什麼它告訴我,它不通過「訪問控制允許來源」的消息頭,有什麼錯我的標題配置?

回答

0

嘗試設置CORS選項和訪問控制允許來源頭在服務器端。

const graphQLServer = express(); 
const corsOptions = { 
    origin(origin, callback) { 
     callback(null, true); 
    }, 
    credentials: true 
}; 
graphQLServer.use(cors(corsOptions)); 
var allowCrossDomain = function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type'); 
    next(); 
} 
graphQLServer.use(allowCrossDomain); 

這可能會幫助你

1

您正在設置請求中的標頭(在客戶端)。需要在服務器端設置Access-Control-Allow-Origin標頭,並且在發出請求時,響應應該包含該標頭。

此標題背後的原因是,並非每個網頁都可以查詢每個第三方域。能夠從請求中設置這個頭部會擊敗整個點。

0

CORS規範規定,對於資源的請求被「預檢」與HTTP OPTIONS請求和應答頭爲選項必須包含頭:

$ curl -I -X OPTIONS https://gpbaculio-tributeapp.herokuapp.com/graphql 
HTTP/1.1 405 Method Not Allowed 
Server: Cowboy 
Connection: keep-alive 
X-Powered-By: Express 
Allow: GET, POST 
Content-Type: application/json; charset=utf-8 
Content-Length: 97 
Date: Sat, 23 Sep 2017 11:24:39 GMT 
Via: 1.1 vegur 

Access-Control-Allow-Origin: * 

你可能會捲曲檢查

添加OPTION處理有需要的頭,所以你的服務器的答案:

$ curl -I -X OPTIONS https://example.localhost/ 
HTTP/1.1 204 No Content 
Server: nginx/1.4.7 
Date: Sat, 23 Sep 2017 11:27:51 GMT 
Connection: keep-alive 
Keep-Alive: timeout=5 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, OPTIONS 
Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range 
Content-Type: text/plain; charset=utf-8 
Content-Length: 0 
0

問題是瀏覽器的跨源問題。

Access-Control-Allow-Origin頭應該由服務器的響應返回,頭意味着可以訪問該API的原始域。

客戶端的請求通常採用標頭Origin,它的值是當前主機地址,如www.example.com

Access-Control-Allow-Origin的值必須包含Origin的值表示源可以訪問此API服務。然後瀏覽器將繼續請求。否則,瀏覽器將取消該請求。

enter image description here

的介紹:,Refre酒店到CORS https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

+0

但即使我已經試過訪問控制允許來源:s.codepen.io仍然會返回錯誤? –

+0

交叉原點的CORS解決方案需要服務器和客戶端合作配置解決方案。而'Access-Control-Allow-Origin'頭只是所有操作之一。更多信息,請訪問https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS – JiangangXiong

相關問題