Как определить, следует ли использовать параметры или тело запроса в запросах GET при интеграции с различными API?Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как определить, следует ли использовать параметры или тело запроса в запросах GET при интеграции с различными API?

Сообщение Anonymous »

Я работаю с двумя разными API, оба используют запросы GET, но обрабатывают данные запроса по-разному:
  • 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',
    ],
    ];
Оба API работают с методом GET, но их требования к передаче данных различны. Из-за этого сложно решить, когда использовать параметры запроса, а когда тело запроса GET.
Вопросы:

[*]Как определить, следует ли использовать параметры запроса (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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»