OneNote API В запросе, отправленном вашим приложением, обнаружена синтаксическая или другая ошибка.

Пишу библиотеку на php для связи с OneNote API (на основе https://github.com/OneNoteDev/OneNoteAPISamplePHP ).

Я хочу создать раздел и страницы.

Раздел создан нормально, но при попытке создать страницы всегда получаю ошибку:

A syntax or other error was detected in a request your app sent
error :{
       "code":"20011",
       "message":"The multi-part payload was malformed."
}

Тело страницы (смешанный текст + изображение):

--4ba4cdfe92db7bf32a8958dcad26d539951229d6570cfa0626c0adff64bf1ed9
Content-Disposition:form-data; name="Presentation"
Content-Type:text/html

<!DOCTYPE html>
<html>
  <head>
  <title>Page 1</title>
  <meta name="created" content="2015-06-02T04:41:44-07:00" />
  </head>
  <body><img src="name:imageData1" alt="" width="488" height="181" /><p><p>Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. Praesent egestas neque eu enim. Suspendisse eu ligula. Vestibulum rutrum, mi nec elementum vehicula, eros quam gravida nisl, id fringilla neque ante vel mi. Morbi ac felis.</p>
</p></body>
</html>

--4ba4cdfe92db7bf32a8958dcad26d539951229d6570cfa0626c0adff64bf1ed9
Content-Disposition:form-data; name="imageData1"
Content-Type:application/octet-stream

SomeData

--4ba4cdfe92db7bf32a8958dcad26d539951229d6570cfa0626c0adff64bf1ed9--

Тело страницы (текст):

--5e4b8756b81ac1881459fe7691fb6a3e93e35540ccf71450095f6d5a679e27a5
Content-Disposition:form-data; name="Presentation"
Content-Type:text/html

<!DOCTYPE html>
<html>
  <head>
    <title>Page 1</title>
    <meta name="created" content="2015-06-02T04:45:33-07:00" />
  </head>
  <body><p><p>Nulla facilisi. Etiam vitae tortor. Curabitur suscipit suscipit tellus. Etiam rhoncus. Quisque ut nisi.</p>

<p>Suspendisse faucibus, nunc et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id tortor. Vestibulum facilisis, purus nec pulvinar iaculis, ligula mi congue nunc, vitae euismod ligula urna in dolor. Cras varius. Morbi mollis tellus ac sapien. Maecenas vestibulum mollis diam.</p>
</p></body>
</html>

--5e4b8756b81ac1881459fe7691fb6a3e93e35540ccf71450095f6d5a679e27a5--

Я использовал этот URL для создания страницы https://www.onenote.com/api/v1.0/sections/$section_id/страницы

Залил на тестовый сервер, работает нормально. Но когда я загружаю на живой сервер (на котором установлен ssl-сертификат), всегда получаю эту ошибку.

Любая идея, Thnx.


person Nerxhan    schedule 02.06.2015    source источник
comment
Не использовал onenote API, но это - [content_type] => application/json; - судя по всему, вы не публикуете json.   -  person Craicerjack    schedule 02.06.2015
comment
Я использовал то же, что и в OneNoteApiSample. Эта библиотека работает на тестовом сервере, но не работает на реальном сервере (установлен ssl-сертификат). ?   -  person Nerxhan    schedule 02.06.2015
comment
Если вы пытаетесь загрузить изображения, ваш тип контента должен быть чем-то вроде multipart/form-data, чем json. Вы должны включить код, который вы используете для отправки данных в API одной заметки.   -  person Craicerjack    schedule 02.06.2015
comment
Я вставляю код сейчас, вы можете проверить, пожалуйста   -  person Nerxhan    schedule 02.06.2015
comment
Не работает, если я изменю это, раздел не будет создан. Теперь раздел создан, но когда я пытаюсь создать страницу, я получаю эту ошибку   -  person Nerxhan    schedule 02.06.2015
comment
Глядя на то, что вы опубликовали, это класс php для взаимодействия с API одной заметки. Где вы вызываете методы этого класса?   -  person Craicerjack    schedule 02.06.2015
comment
Я вызываю этот класс из другого класса, когда готовлю данные (раздел со страницами) для отправки в OneNote   -  person Nerxhan    schedule 02.06.2015
comment
хорошо - этот код включен?   -  person Craicerjack    schedule 02.06.2015
comment
Да. Этот код включен   -  person Nerxhan    schedule 02.06.2015
comment
Хорошо, извините, я не вижу его - не могли бы вы указать мне, где этот код. Код, который вы используете для создания страницы.   -  person Craicerjack    schedule 02.06.2015
comment
Хорошо, функция createPPage используется для генерации тела страницы и для ее создания.   -  person Nerxhan    schedule 02.06.2015
comment
Да, хорошо, но где вы вызываете его и передаете параметры для создания страницы? Может быть, я неправильно понимаю, как вы это используете/как это используется. В любом случае, глядя на код, который вы включили обратно в свой Заголовок, если вы включаете изображения и тому подобное, content type не является json и должно быть multipart/form-data   -  person Craicerjack    schedule 02.06.2015
comment
Я использовал тот же способ, что и на OneNoteApiSamplePhp.   -  person Nerxhan    schedule 02.06.2015
comment
Вы звоните $this->initCurl(); ? это установит для вас правильные заголовки типа контента   -  person Yaniro    schedule 03.06.2015


Ответы (1)


Ниже приведен очень простой пример того, как это можно сделать. В примере показано, как два изображения могут быть встроены в содержимое новой страницы + одна дополнительная ссылка для загрузки и встроенное изображение. Все, что вам нужно сделать, это вставить свой токен доступа в вызов $oneNoteMultiPartRequest->send(), и все готово.

В этом примере я использовал изображение, встроенное в код, но вы можете использовать любой файл/изображение, которое хотите (просто не забудьте обновить атрибут type в заголовках <object> и Content-Type для соответствующей части запроса.

Обратите внимание, что различные атрибуты в HTML (<img src="name:..."> и <object data="name:...">) ссылаются на существующую часть запроса по ее имени.

class OneNoteMultiPartRequest {
    protected $boundary;
    protected $parts = array();
    protected $responseInfo = null;
    protected $errorMessage = null;

    function __construct($presentationPartHtml) {
        $this->boundary = uniqid('', true);
        $this->appendPart("Presentation", "text/html", $presentationPartHtml);
    }

    public function appendPart($partName, $partContentType, $partContent) {
        $this->parts[] = "--{$this->boundary}\r\nContent-Disposition: form-data; name=\"$partName\"\r\nContent-Type: $partContentType\r\n\r\n$partContent\r\n\r\n";
    }

    public function send($url, $accessToken) {
        $cUrl = curl_init();
        curl_setopt($cUrl, CURLOPT_URL, $url);
        curl_setopt($cUrl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($cUrl, CURLOPT_HEADER, false);
        curl_setopt($cUrl, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($cUrl, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($cUrl, CURLOPT_VERBOSE, true);
        curl_setopt($cUrl, CURLOPT_POST, true);
        curl_setopt(
            $cUrl,
            CURLOPT_HTTPHEADER,
            array(
                "Content-Type: multipart/form-data; boundary={$this->boundary}",
                "Authorization: Bearer $accessToken"
            )
        );

        $postData = implode($this->parts) . "--{$this->boundary}--";

        curl_setopt($cUrl, CURLOPT_POSTFIELDS, $postData);        
        $response = curl_exec($cUrl);
        $this->responseInfo = curl_getinfo($cUrl);
        $this->errorMessage = curl_error($cUrl);
        curl_close($cUrl);

        return $response;
    }

    public function getResponseInfo() {
        return $this->responseInfo;
    }

    public function getErrorMessage() {
        return $this->errorMessage;
    }
}

$presentationPartHtml = <<<PRESENTATIONHTML
<!DOCTYPE html>
<html>
    <head>
    <title>Title of the captured OneNote page</title>
    <meta name="created" content="2013-06-11T12:45:00.000-8:00"/>
    </head>
    <body>
        <p>This is a simple multi-part HTML page.</p>
        <img src="name:image1"/><br/>
        <img src="name:image2"/><br/>
        <object data-attachment="Logo.png" data="name:image3" type="image/png"/>
    </body>
</html>
PRESENTATIONHTML;

$imageData = "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";

$oneNoteMultiPartRequest = new OneNoteMultiPartRequest($presentationPartHtml);
$oneNoteMultiPartRequest->appendPart("image1", "image/png", base64_decode($imageData));
$oneNoteMultiPartRequest->appendPart("image2", "image/png", base64_decode($imageData));
$oneNoteMultiPartRequest->appendPart("image3", "image/png", base64_decode($imageData));
$response = $oneNoteMultiPartRequest->send("https://www.onenote.com/api/v1.0/pages", "<YOUR ACCESS TOKEN>");

var_dump($response);
echo '<br/><br/>';

$info = $oneNoteMultiPartRequest->getResponseInfo();
var_dump($info);
echo '<br/><br/>';

$errorMessage = $oneNoteMultiPartRequest->getErrorMessage();
var_dump($errorMessage);
person Yaniro    schedule 02.06.2015
comment
Спасибо, чувак, ты решил мою проблему, этот метод потрясающий appendPart, я думаю, что моя проблема была с пустой строкой. - person Nerxhan; 04.06.2015