2016-08-17 11 views
7

सीओआरएस वास्तव में मुझे पागल कर रहा है और मैं वास्तव में विचारों से बाहर हूं कि इसे काम करने के लिए क्या प्रयास करना है।एडब्ल्यूएस एपीआई गेटवे - कॉर्स + पोस्ट काम नहीं कर रहा

मैं 'एबीसी' कहा जाता है 1 संसाधन के साथ एक सरल APIG एपीआई बनाया है और पोस्ट दोनों 2 विधियां जोड़ प्राधिकरण सेट कोई नहीं को और API कुंजी आवश्यक सेट करने के लिए झूठी साथ और प्राप्त है , 'देव' नामक एक मंच पर तैनात सब कुछ।

बेशक

मैं CORS सक्षम दोनों तरीकों पर और मैं 3 हेडर पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति देखते हैं, पहुंच-नियंत्रण-अनुमति दें-हेडर और पहुंच-नियंत्रण-अनुमति दें-तरीके जोड़ा विकल्प को विधि और पहुंच-नियंत्रण-अनुमति दें-उत्पत्तिपोस्ट को जोड़ा गया और तरीकों प्राप्त करें।

दोनों कॉल उसी लैम्ब्डा फ़ंक्शन पर मैप किए गए हैं जो आसानी से 'हैम्बर्ग से लैम्ब्डा' टेक्स्ट को कंसोल में आउटपुट करता है।

तो मैं एक साधारण html पृष्ठ मैं एक स्थिर वेबसाइट के रूप में की मेजबानी की पर S3 बनाया है, Route53 का उपयोग कर इसे करने के लिए एक डोमेन ओर इशारा किया और jQuery $ .ajax का उपयोग कर कॉल करने के लिए एपीआई परीक्षण शुरू ।

सभी दस्तावेज़ों में समझाया गया आसान, सीधा और बिल्कुल लगता है, केवल को छोड़कर कार्य को कंसोल पर काम करता है और आउटपुट करता है। निम्न त्रुटि में पोस्ट संस्करण परिणाम:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.com' is therefore not allowed access. The response had HTTP status code 400.

preflight कॉल काम करता है और रिटर्न 200 ठीक है और सभी हेडर देखते हैं, लेकिन पोस्ट कॉल कि त्रुटि और एक 400 गलत अनुरोध देता है।

कृपया किसी भी मदद वास्तव में सराहना की है, मुझे आशा है कि एडब्ल्यूएस टीम भी देख रही है ...

धन्यवाद दोस्तों।


संपादित - गूगल क्रोम से कॉपी किया गया:

पोस्ट कच्चे अनुरोध हेडर:

POST /dev/urls HTTP/1.1 
Host: kykul1mshe.execute-api.us-east-1.amazonaws.com 
Connection: keep-alive 
Content-Length: 73 
Accept: application/json, text/javascript, */*; q=0.01 
Origin: http://example.com 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 
Content-Type: application/json 
Referer: http://example.com/dev.html 
Accept-Encoding: gzip, deflate, br 
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 

पोस्ट कच्चे प्रतिक्रिया हेडर:

HTTP/1.1 400 Bad Request 
Date: Fri, 19 Aug 2016 02:14:16 GMT 
Content-Type: application/json 
Content-Length: 177 
Connection: keep-alive 
x-amzn-RequestId: a1160e45-65b2-11e6-9766-cd61e49fbcdb 
X-Cache: Error from cloudfront 
Via: 1.1 d64756b4df47ce24d6c62b5a8de97e87.cloudfront.net (CloudFront) 
X-Amz-Cf-Id: N9mf7apicKbSM_MiZjePbEgZGIFKckWJ3lZljH8iHVKFVTcIIOQuHg== 

यह रिटर्न 400 गलत अनुरोध

विकल्प कच्चे अनुरोध हेडर:

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch, br 
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Access-Control-Request-Headers:accept, content-type 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:kykul1mshe.execute-api.us-east-1.amazonaws.com 
Origin:http://example.com 
Referer:http://example.com/dev.html 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 

विकल्प कच्चे प्रतिक्रिया हेडर:

Access-Control-Allow-Headers:Content-Type,X-Amz-Date,Authorization,X-Api-Key,Cache-Control,X-Requested-With 
Access-Control-Allow-Methods:POST,OPTIONS 
Access-Control-Allow-Origin:* 
Connection:keep-alive 
Content-Length:79 
Content-Type:application/json 
Date:Fri, 19 Aug 2016 02:14:16 GMT 
Via:1.1 d64756b4df47ce24d6c62b5a8de97e87.cloudfront.net (CloudFront) 
X-Amz-Cf-Id:KpGEDmIuf5RHcUnBWuA3oEMZgWHwrjy3SpLuOflRhAD8IIx5vyKGSw== 
x-amzn-RequestId:a10bae11-65b2-11e6-bcf7-63b49c24629e 
X-Cache:Miss from cloudfront 

यह 200 ठीक

+0

हाय, मैं एपी गेटवे से हूं। मुझे आपके एपीआई को सेट करने के तरीके में कुछ भी गलत नहीं दिख रहा है। क्या आप कच्चे अनुरोधों के साथ अपडेट कर सकते हैं? इससे डिबगिंग में मदद मिलेगी। –

+0

@AbhignaNagaraja का जवाब देने के लिए धन्यवाद - मैंने Google क्रोम में प्राप्त शीर्षकों के साथ पोस्ट अपडेट किया है (मैंने अभी वास्तविक डोमेन नाम छुपाया है)। – HBR

उत्तर

8

ठीक देता है, मैं समस्या के मूल है, जो पूरी तरह से से संबंधित नहीं होने वाला पाया एपीआईजी, और पुष्टि करता है कि @AbhignaNagaraja ने क्या उल्लेख किया है, कि मेरा एपीआईजी ठीक से कॉन्फ़िगर किया गया था।

समस्या वास्तव में जिस तरह से मैंने jQuery.ajax कहा है, जिस तरह से मैंने सोचा था कि मेरे पैरामीटर को JSON स्ट्रिंग में कनवर्ट करने के लिए पर्याप्त स्मार्ट था जब सामग्री टाइप 'एप्लिकेशन/जेसन' है। ऐसा लगता है कि मुझे जेएसओएन पास करने और jQuery को स्ट्रिंग करने के बजाए जेएसओएन पैराम मैन्युअल रूप से स्ट्रिंग करना था।

तो यह बुरा कॉल है:

$.ajax({ 
     url: myEndpoint, 
     type: 'POST', 
     crossDomain: true, 
     data: { 
      url: $('#url').val() 
     }, 
     headers: { 
      "X-Api-Key": 'blablabla' 
     }, 
     dataType: 'json', 
     contentType: "application/json", 
     success: function (data) { 
      console.info(data); 
     } 
    }); 

और यह सही कॉल है:

$.ajax({ 
     url: myEndpoint, 
     type: 'POST', 
     crossDomain: true, 
     data: JSON.stringify({ 
      url: $('#url').val() 
     }), 
     headers: { 
      "X-Api-Key": 'blablabla' 
     }, 
     dataType: 'json', 
     contentType: "application/json", 
     success: function (data) { 
      console.info(data); 
     } 
    }); 

यह एक संकेत हो सकता है अगर आप CORS के साथ इस तरह एक मुद्दा डीबग कर रहे हैं: बस डाउनलोड एडब्ल्यूएस एपीआईजी एसडीके और एडब्ल्यूएस द्वारा प्रदान किए गए एपीआईजी क्लाइंट का उपयोग करके कॉल निष्पादित करने का प्रयास करें और हेडर की तुलना अपने कस्टम क्लाइंट के साथ करें। जब हेडर मैं jQuery और apigClient साथ मिल गया के 2 सेट की जांच, मैं अनुरोध पेलोड अलग देखा देखा और thats मैं कैसे महसूस किया प्रारूप, गलत था तो 400 कोड और नहीं 'पहुंच-नियंत्रण -Allow-Origin ' हेडर मौजूद सभी समझ में आता है।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

1 मिलियन अपवॉट्स !!! – inspired

+0

* "ऐसा लगता है कि मुझे जेएसओएन पास करने और jQuery को स्ट्रिंग करने के बजाए जेएसओएन पैराम मैन्युअल रूप से स्ट्रिंग करना था।": * यदि यह जेसन था, तो इसे स्ट्रिंग करने के लिए jquery की आवश्यकता नहीं होगी। जो आप * पास कर रहे थे वह एक ऑब्जेक्ट था, जेसन नहीं, और jquery किसी स्ट्रिंग (पैरा स्ट्रिंग) के लिए स्ट्रिंग नहीं है जो कुछ भी परिवर्तित करता है। इसे स्ट्रिंग करके, आपने इसे एक स्ट्रिंग में बदल दिया और इस प्रकार jquery इसे स्पर्श नहीं किया। –

+0

धन्यवाद, स्ट्रिंगिंग ने मेरे लिए एक ही समस्या का समाधान किया। – deanmau5

2

मुझे एक समान समस्या थी - और एपीआई कॉन्फ़िगर किया गया था या पोस्ट अनुरोध जो मैं सामने के अंत में बना रहा था, उसके साथ इसका कोई लेना-देना नहीं था। मेरे लिए समस्या क्या तय की गई एडब्ल्यूएस एपीआई गेटवे पर एपीआई तैनात कर रही थी। एक बार जब आप एक एपीआई विधि/संसाधन बनाते हैं, और उन्हें लैम्ब्डा फ़ंक्शन में जोड़ देते हैं, तो वे ऑटो परिनियोजित नहीं होते हैं।

इन माइक्रोस्कोर्सेस को फ्रंट-एंड तक पहुंचने के लिए आपको "क्रियाएं" पर क्लिक करना होगा और फिर "एपीआई तैनात करना होगा"।

4

मैं ने वही समस्या थी, लेकिन लैम्ब्डा प्रॉक्सी एकीकरण के साथ:

  • CORS ब्राउज़र

  • लैम्ब्डा-प्रॉक्सी एकीकरण सक्रिय का उपयोग कर एडब्ल्यूएस एपीआई गेटवे पर सक्रिय

जब लैम्ब्डा प्रॉक्सी एकीकरण का उपयोग करके, आप कस्टम हेडर को लैम्ब्डा के कोड के अंदर से वापस कर सकते हैं:

 var result = { 
     statusCode: data.statusCode | 200, 
     headers: { 
      "Access-Control-Allow-Origin": "*" 
     }, 
     body: JSON.stringify(responseBody) 
    }; 
    callback(null, result); 

इस तरह आपको सीओआरएस हेडर भेजा जाता है। मुझे लगता है कि लैम्ब्डा प्रॉक्सी एकीकरण के साथ काम करने के लिए लैम्ब्डा के कोड के अंदर सीओआरएस को जोड़कर बेहतर तरीके से काम करने का एक बेहतर तरीका हो सकता है, अगर आपको पता है तो कृपया मुझे बताएं।

0

कई पोस्ट हैं जो आपको यह सुनिश्चित करने के लिए निर्देशित करती हैं कि लैम्ब्डा फ़ंक्शन उचित कोरस हेडर, लौट रहा है और वे सही हैं। हालांकि, यह महत्वपूर्ण है कि जेसन ऑब्जेक्ट JSON.stringify() का उपयोग करके स्ट्रिंग किया गया है। ऐसा लगता है कि पोस्टमैन हमारे लिए यह करता है, इसलिए जब यह पोस्टमैन अनुरोध और $ .ajax अनुरोध एक ही जेसन ऑब्जेक्ट भेजता है तो यह भ्रामक है; फिर भी एक सफल होता है और एक विफल रहता है।

संबंधित मुद्दे