Το αίτημα προσαρμοσμένου τελικού σημείου API POST του WordPress αποτυγχάνει στο React

ψήφοι
16

Έχω ένα backend WordPress όπου έχω προσθέσει τα δικά μου προσαρμοσμένα τελικά σημεία στο API:

// 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 είναι το σημείο όπου ζει η εφαρμογή React και το WordPress βρίσκεται σε έναν υποκατάλογο, στη διεύθυνση https://example.com/wp

Η εφαρμογή My React κάνει αιτήματα POST και GET σε αυτά τα τελικά σημεία. Έχω μια μεταβλητή περιβάλλοντος παραγωγής όπου ορίζω τη βασική διεύθυνση URL του API, που είναι https://example.com/wp/wp-json/game (Το «παιχνίδι» είναι ο χώρος ονομάτων μου) και έτσι μπορώ να κάνω αιτήματα με το Axios to https://example.com/wp/wp-json/game/countries και https://example.com/wp/wp-json/game/check_answer και εδώ έρχεται το ζήτημα.

Ο διακομιστής μου έχει ρυθμιστεί έτσι ώστε να εξυπηρετεί την εφαρμογή React τόσο με όσο και χωρίς www . Έτσι https://example.com και https://www.example.com εξυπηρετούν την ίδια εφαρμογή.

Αλλά αυτό δημιουργεί κάποιο ενδιαφέρον ζήτημα για τα προσαρμοσμένα τελικά σημεία μου: το αίτημα GET λειτουργεί πάντα. αλλά το αίτημα POST λειτουργεί μόνο αν το δοκιμάζω από το https://example.com , ΟΧΙ από το https://www.example.com . Στην περίπτωση του τελευταίου, απλώς μου δείχνει ένα αποτυχημένο αίτημα. Χωρίς απάντηση, τίποτα.

Έχω κάνει googled και φαίνεται να σχετίζεται με το CORS, αλλά δεν μπόρεσα να το διορθώσω. Οποιεσδήποτε ιδέες εδώ;

Δημοσιεύθηκε 09/05/2020 στις 11:32
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
0

Πρώτα απ 'όλα θα ήθελα να επισημάνω ότι το δικό σας Get Τα αιτήματα λειτουργούν επειδή ανήκουν στην κατηγορία που δεν ενεργοποιεί ένα αίτημα προκαταρκτικού φωτισμού. Ενώ το δικό σας Post Το αίτημα πιθανότατα χρησιμοποιεί κάποια κεφαλίδα που την αφαιρεί από την κατηγορία και ως εκ τούτου απαιτούν τη μετάβαση του preflight. Αν σας ενδιαφέρει να διαβάσετε περισσότερα, εδώ είναι ο σύνδεσμος τεκμηρίωσης.

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

Τώρα, σύμφωνα με το σχόλιό σας, το σφάλμα που λαμβάνετε είναι

Η απάντηση στο αίτημα προκαταρκτικού φωτισμού δεν περνά τον έλεγχο ελέγχου πρόσβασης: Δεν υπάρχει κεφαλίδα «Access-Control-Allow-Origin» στον πόρο που ζητήθηκε.

Η μέθοδος που χρησιμοποιείτε για τη ρύθμιση κεφαλίδων, όπως αναφέρατε σε ένα σχόλιο, δεν λειτουργεί σε αιτήματα ανάπαυσης. Μπορείτε να χρησιμοποιήσετε την παρακάτω λειτουργία στο 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 );

Αν και προτείνω τι κάνει το WordPress από προεπιλογή. Εάν ελέγξετε wp-includes/rest-api.php θα βρείτε την αρχική λειτουργία που έχω τροποποιήσει για το σκοπό σας. Εάν ενδιαφέρεστε να ρίξετε μια ματιά, εδώ είναι ο σύνδεσμος trac.

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

Απαντήθηκε 17/05/2020 στις 10:38
πηγή χρήστη

ψήφοι
0

Βρήκα το πρόβλημά σας που πρέπει να καταργήσετε από τη διεύθυνση URL σας 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