Ошибка 400 с методом PATCH с использованием функции PHP stream_context_create для передачи данных JSON в API

Я пытаюсь опубликовать это Microsoft API но я получаю сообщение об ошибке 400. Отлично работает при использовании их консоли тестирования API на основе браузера и в Postman, но я не могу заставить ее работать, используя мой код PHP ниже. Куда я иду не так?

  $myObj->update->name = "API test";
$myObj->update->qnaList->qnaId = "331";
$myObj->update->qnaList->answer = "I have been updated";
$myObj->update->qnaList->source = "Editorial";
$myObj->update->qnaList->questions->add = "What is your name";
$myObj->update->qnaList->metadata->add->name = "category";
$myObj->update->qnaList->metadata->add->value = "personality";
$data = json_encode($myObj);

$url = '[https://apiurl]';
$options = array(
'http' => array(
'method'  => 'PATCH',
'content' => $data,
'header'  => "Content-Type: application/json\r\n" .
"Ocp-Apim-Subscription-Key: [mykey]")
);
$context    = stream_context_create($options);
$result     = file_get_contents($url, false, $context);
$response   = json_decode($result, true);
print_r($response);

1

Решение

Есть проблемы с телом JSON, которое вы пытаетесь отправить.

Это работает для меня и возвращает 204:

<?php

$myObj->update->name = "API test";
$myObj->update->qnaList = array();
$myObj->update->qnaList[0]->qnaId = "1";
$myObj->update->qnaList[0]->answer = "I have been updated";
$myObj->update->qnaList[0]->source = "Editorial";
$myObj->update->qnaList[0]->questions->add = array();
$myObj->update->qnaList[0]->questions->add[0] = "What is your name";
$myObj->update->qnaList[0]->metadata->add = array();
$myObj->update->qnaList[0]->metadata->add[0]->name = "category";
$myObj->update->qnaList[0]->metadata->add[0]->value = "personality";
$data = json_encode($myObj);

$kbid = "<YOUR-KB-ID>";

$url = 'https://westus.api.cognitive.microsoft.com/qnamaker/v3.0/knowledgebases/' . $kbid;
$options = array(
'http' => array(
'ignore_errors' => true,
'method' => 'PATCH',
'content' => $data,
'header' => "Content-Type: application/json\r\n" .
"Ocp-Apim-Subscription-Key: <YOUR-KEY>\r\n")
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);

$response = json_decode($result, true);

echo $response . "\r\n";
?>
1

Другие решения

Других решений пока нет …