Intereting Posts

Создание сообщения с API REST, зависанием и возвратом ошибки 401

Я пытаюсь создать сообщение WordPress с помощью REST API, OAuth и cURL. Однако у меня проблемы.

Я могу создать пустую запись (без названия, slug и т. Д.), Используя следующий код:

$header = array(buildAuthorizationHeader($oauth), 'Expect:'); $options = array( CURLOPT_HTTPHEADER => $header, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_POST => true, CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); 

Это работает так, как ожидалось, – успешно разрешается и создает пустую запись в WordPress. Однако, когда я иду, чтобы установить заголовок (или любое другое свойство), добавив

 CURLOPT_POSTFIELDS => "title=testTitle", 

Я получаю сообщение об ошибке:

 { "data": { "code": "json_oauth1_signature_mismatch", "message": "OAuth signature does not match", "data": { "status": 401 } }, "headers": [], "status": 401 } 

Интересно то, что я могу с успехом установить заголовок с помощью Postman. Любые идеи, что я делаю неправильно? Любая помощь будет принята с благодарностью – это было часами.

Solutions Collecting From Web of "Создание сообщения с API REST, зависанием и возвратом ошибки 401"

«API REST использует JSON исключительно как формат запроса и ответа, включая ответы об ошибках».

– Справочник по API REST WordPress

Я бы попытался явно установить тип / длину контента и json закодировать ваши данные с чем-то вроде этого (при условии, что вам нужно указать все параметры, которые вы сделали в предоставленном коде):

 $data = array( 'title' => 'testTitle', 'content' => '', ); $data = json_encode( $data ); $header = array( buildAuthorizationHeader( $oauth ), 'Content-Type: application/json', 'Content-Length: ' . strlen( $data ), 'Expect:', ); $options = array( CURLOPT_HTTPHEADER => $header, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_POST => true, CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => $data, );