WP REST API -- Come cambiare il codice di stato della risposta HTTP?

21 gen 2017, 21:08:50
Visualizzazioni: 23.8K
Voti: 16

Ho un endpoint personalizzato dove voglio cambiare lo stato della risposta HTTP a 404 in determinati scenari (ad esempio quando il post non esiste). Come posso farlo? Ecco un esempio di endpoint personalizzato:

function af_news_single( \WP_REST_Request $data ) {
    global $wpdb;

    $year = (int) $data['year'];
    $month = (int) $data['month'];
    $day = (int) $data['day'];
    $slug = $data['slug'];

    $date = "{$year}-{$month}-{$day}";

    $news = $wpdb->get_row(
        $wpdb->prepare(
            "SELECT
                DATE_FORMAT(post_date, %s) as `post_date`,
                `post_title`,
                `post_name`,
                `post_content`
             FROM {$wpdb->posts}
             WHERE
                `post_status` = 'publish' AND
                `post_type` = 'post' AND
                `post_name` = %s AND
                `post_date` BETWEEN %s AND %s + INTERVAL 1 DAY
             LIMIT 1
             ", '%Y-%m-%dT%TZ', $slug, $date, $date
        )
    );

    if ( $news ) {
        $news->post_title = qtranxf_translate( $news->post_title );
        $news->post_content = wpautop( qtranxf_translate( $news->post_content ) );
    } else { /* Come cambiare il codice di risposta? */ }

    return [ 'data' => $news ];
}

Come posso cambiare il codice di risposta in questa funzione?

1
Commenti

Scrivi l'intestazione e interrompi la richiesta. https://codex.wordpress.org/Function_Reference/wp_die include un argomento per il codice di risposta.

jgraup jgraup
21 gen 2017 23:01:02
Tutte le risposte alla domanda 3
2
25

Puoi restituire un oggetto WP_Error in cui definisci il codice di stato. Ecco uno snippet tratto dalla documentazione della REST API:

function my_awesome_func( $data ) {
    $posts = get_posts( array(
        'author' => $data['id'],
    ) );

    if ( empty( $posts ) ) {
        return new WP_Error( 'awesome_no_author', 'Autore non valido', array( 'status' => 404 ) );
    }

    return $posts[0]->post_title;
}

Nel tuo caso potresti fare qualcosa come:

return new WP_Error( 'page_does_not_exist', __('La pagina che stai cercando non esiste'), array( 'status' => 404 ) );
22 gen 2017 04:41:23
Commenti

Ora come resisto alla tentazione di far tornare tutte le chiamate API fallite con lo stato 418 I'm a teapot?

Pat J Pat J
1 ott 2021 20:19:05

@PatJ Controlla se il metodo della richiesta è BREW.

Walf Walf
3 lug 2024 10:13:22
0
13

Il modo più semplice per farlo è:

return new WP_REST_Response(null, 404);

Nota: questa è ancora una risposta JSON che contiene null come corpo. Puoi restituire una struttura dati più utile con codici di errore/messaggi, ecc., oppure agganciarti ai filtri di output REST per restituire una risposta vuota in formato text/plain.

21 ago 2018 12:38:50
1
-1

Non utilizzerei:

return new WP_REST_Response(null, 404);

Ho avuto un problema con il provider di hosting quando ho utilizzato i codici di stato in questa funzione. In qualche modo l'impostazione del codice di stato ha attivato una risposta di mod_rewrite.

Messaggio: Accesso negato con codice 406 (fase 3). Il test 'REQUEST_URI|REQUEST_HEADERS|REQUEST_HEADERS_NAMES|ARGS|ARGS_NAMES|REQUEST_BODY' su '!@validateByteRange 0-31' è vero.

Potrebbe non essere un problema con WordPress, ma utilizzando:

return new WP_REST_Response(null);

ho risolto il problema.

Lo lascio qui nel caso qualcuno incontri lo stesso problema.

12 mag 2021 05:32:49
Commenti

Spiacente, ma questa risposta non affronta affatto la domanda. WP_REST_Response estende la classe WP_HTTP_Response, e il secondo argomento del costruttore controlla il codice di stato. Se lo ometti, non stai modificando il codice di stato, che è il problema in questione.

Walf Walf
23 ott 2023 06:48:46