वर्डप्रेस कस्टम एपीआई एंडपॉइंट POST अनुरोध रिएक्ट में विफल रहता है

वोट
4

मेरे पास एक वर्डप्रेस बैकएंड है जहां मैंने अपने कस्टम एंडपॉइंट्स को एपीआई में जोड़ा है:

// retrieve countries
register_rest_route( $namespace, '/countries',
    array(
        'methods'  => 'GET',
        'callback' => array( $this, 'get_countries' ),
    )
);

// check answer
register_rest_route( $namespace, '/check_answer',
    array(
        'methods'  => 'POST',
        'callback' => array( $this, 'check_answer' ),
    )
);

मैंने अपना वातावरण इस तरह सेट किया है: https://example.com वह जगह है जहाँ रिएक्ट एप्लिकेशन रहता है, और वर्डप्रेस एक अप्रत्यक्ष में, https://example.com/wp पर है

मेरा प्रतिक्रिया आवेदन ऊपर के उन समापन बिंदुओं के लिए POST और GET अनुरोध करता है। मेरे पास एक उत्पादन वातावरण चर है जहां मैं एपीआई का आधार URL सेट करता हूं, जो है https://example.com/wp/wp-json/game ('खेल' मेरा नाम स्थान है) और इसलिए मैं एक्सियो के साथ अनुरोध कर सकता हूं https://example.com/wp/wp-json/game/countries तथा https://example.com/wp/wp-json/game/check_answer और यहाँ मुद्दा आता है।

मेरा सर्वर कॉन्फ़िगर किया गया है ताकि यह बिना किसी के साथ रिएक्ट एप्लिकेशन को कार्य करे www । तो https://example.com और https://www.example.com दोनों एक ही एप्लीकेशन पर काम करते हैं।

लेकिन यह मेरे कस्टम समापन बिंदुओं के लिए कुछ दिलचस्प समस्या उत्पन्न करता है: GET अनुरोध हमेशा काम करता है। लेकिन POST अनुरोध केवल तभी काम करता है जब मैं इसे https://example.com से आज़मा रहा हूँ, https://www.example.com से नहीं। बाद के मामले में यह बस मुझे एक असफल अनुरोध दिखाता है। कोई प्रतिक्रिया नहीं, कुछ भी नहीं।

मैं गुगली कर चुका हूं और यह कॉर्स से संबंधित है, लेकिन मैं इसे ठीक करने में असमर्थ था। यहाँ कोई विचार?

09/05/2020 को 11:32
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
0

सबसे पहले मैं यह बताना चाहूंगा कि Get अनुरोध काम करते हैं क्योंकि वे उस श्रेणी से संबंधित हैं जो प्रीफ़लाइट अनुरोध को ट्रिगर नहीं करता है। जबकि आपके Post अनुरोध शायद कुछ हेडर का उपयोग कर रहा है जो इसे श्रेणी से हटा देता है इसलिए पास करने के लिए प्रीफ़लाइट की आवश्यकता होती है। यदि आप अधिक पढ़ने में रुचि रखते हैं, तो यहां प्रलेखन लिंक है।

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests

अब, आपकी टिप्पणी के अनुसार, आपको जो त्रुटि मिल रही है

प्रीफ़्लाइट अनुरोध का जवाब एक्सेस कंट्रोल चेक पास नहीं करता: अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है।

हेडर सेट करने के लिए आप जिस विधि का उपयोग कर रहे हैं, जैसा कि आपने एक टिप्पणी में उल्लेख किया है, बाकी अनुरोधों पर काम नहीं करता है। आप अपने में फंक्शन का उपयोग कर सकते हैं functions.php या एक मूल करने के लिए सेट करने के लिए एक प्लगइन फ़ाइल *

function sr_rest_send_cors_headers( $value ) 
{   
    header( 'Access-Control-Allow-Origin: *' );
    header( 'Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, PATCH, DELETE' );
    header( 'Access-Control-Allow-Credentials: true' );
    header( 'Vary: Origin', false );

    return $value;
}
add_filter( 'rest_pre_serve_request', 'sr_rest_send_cors_headers', 11 );

हालाँकि मैं सलाह देता हूं कि वर्डप्रेस डिफ़ॉल्ट रूप से क्या करता है। अगर आप चैक करेंगे wp-includes/rest-api.php आपको मूल फ़ंक्शन मिलेगा जो मैंने आपके उद्देश्य के लिए संशोधित किया है। यदि आप एक नज़र लेने में रुचि रखते हैं, तो यहां ट्रेक लिंक है।

https://core.trac.wordpress.org/browser/tags/5.4/src/wp-includes/rest-api.php#L574

17/05/2020 को 10:38
का स्रोत उपयोगकर्ता

वोट
0

मुझे आपकी समस्या मिली जिसे आपको अपने यूआरएल से हटाने की आवश्यकता है wp और यह काम करना चाहिए। उदाहरण के लिए:

https://example.com/wp/wp-json/game/countries

होना चाहिए:

https://example.com/wp-json/game/countries

इसके अलावा आप इस ट्यूटोरियल की जाँच कर सकते हैं। आशा है कि यह आपकी मदद करेगा।

14/05/2020 को 09:23
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more