- API 1 требует данные, которые будут отправлены в теле запроса, даже если HTTP-метод — GET.
Пример:
$config = [
'method' => 'GET',
'url' => 'http://example.com/api/endpoint',
'headers' => [
'Content-Type' => 'application/json',
],
'body' => [
'key1' => 'value1',
'key2' => 'value2',
],
]; - API 2 требует, чтобы данные отправлялись в виде параметров запроса в URL-адресе.
Пример:
$config = [
'method' => 'GET',
'url' => 'http://example.com/api/endpoint',
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'key1' => 'value1',
'key2' => 'value2',
],
];
Вопросы:
[*]Как определить, следует ли использовать параметры запроса (query) или тело запроса (body) для запроса GET?
[*]Как правило или правильно ли, что запрос GET принимает данные в теле, даже несмотря на то, что спецификация HTTP препятствует этому?
[*]Как я могу разработать универсальный HTTP-клиент (например, с использованием Guzzle) для динамической обработки этих различий на основе требований API?
Любые рекомендации, передовой опыт или примеры будут будьте оценены!
$options = ['headers' => $request['headers']];
if ($request['method'] === 'GET') {
if ($request['isRequestRawBody']) {
$options['body'] = json_encode($request['body']);
} else {
$options['query'] = $request['body'];
}
} else {
$contentType = $request['headers']['Content-Type'] ?? '';
switch ($contentType) {
case 'application/x-www-form-urlencoded':
$options['form_params'] = $request['body'];
break;
case 'application/json':
$options['json'] = $request['body'];
break;
case 'multipart/form-data':
$options['multipart'] = array_map(function ($key, $value) {
return ['name' => $key, 'contents' => $value];
}, array_keys($request['body']), $request['body']);
break;
default:
$options['body'] = $request['body'];
}
}
return $options;
Подробнее здесь: https://stackoverflow.com/questions/793 ... ts-when-in