Ответ REST API с частичным успехом

У меня есть API, который выполняет некоторую задачу массовой обработки. Допустим, он называет некоторый ресурс.

Я передал 7 запросов навалом, из которых 5 успешно обновились и 2 не удалось.

Мой вопрос в том, как обрабатывать ответ. С HTTP я не могу вернуть как успех, так и ошибку одновременно.

Существует HTTP-код частичного успеха, но мне нужно вернуть индивидуальный ответ всего ресурса сразу. Мы все-таки можем это сделать?


person bandi shankar    schedule 01.08.2017    source источник
comment
Практически бесконечные способы. Это проектное решение, которое вам нужно будет принять самостоятельно, исходя из вашей конкретной ситуации.   -  person Adrian    schedule 01.08.2017
comment
Это вообще не вопрос Go, это вопрос HTTP/API. Вы можете справиться с этим бесчисленным количеством способов, и лучший из них зависит от ваших потребностей и, возможно, вкусов.   -  person Flimzy    schedule 01.08.2017


Ответы (1)


Вы можете использовать 207 MULTI-STATUS для статуса http. Ответ с несколькими статусами передает информацию о нескольких ресурсах в ситуациях, когда могут быть уместны несколько кодов статуса.

Тело ответа Multi-Status по умолчанию представляет собой объект HTTP с корневым элементом «multistatus». Дополнительные элементы содержат коды состояния серий 200, 300, 400 и 500, сгенерированные во время вызова метода.

У вас может быть массив объектов ответа в теле ответа, и эти объекты могут иметь свои собственные коды состояния.

Пример

HTTP 207

{
    "data": [
        {
            "messgage": "success",
            "resource": {
                "foo": "bar",
                "id": "1d1"
            },
            "status": 200
        },
        {
            "messgage": "Requested resource or subresource not found ",
            "resource": null,
            "status": 404
        },
        {
            "messgage": "success",
            "resource": {
                "foo": "bars",
                "id": "1d2"
            },
            "status": 200
        }
    ],
    "metadata": {
        "failure": 1,
        "success": 2,
        "total": 3
    }
}
person Sarath Sadasivan Pillai    schedule 01.08.2017
comment
можешь привести пример? - person bandi shankar; 01.08.2017
comment
@bandishankar, пожалуйста, проверьте этот пример, он не охватывает все возможности, но служит основным образцом - person Sarath Sadasivan Pillai; 01.08.2017
comment
насколько действителен этот образец ответа? соответствующий RFC указывает, что ответ должен быть в формате XML и следовать определенной структуре, чего нет в образце ответа. - person quiram; 17.05.2018
comment
В той же спецификации предполагается, что тело ответа Multi-Status по умолчанию представляет собой text/XML или application/xml. Таким образом, json действителен, если тип контента равен json. - person Sarath Sadasivan Pillai; 18.05.2018
comment
У меня есть ситуация, когда мне нужно добавить созданный/обновленный объект, а также объект ошибки в ответ. например Создано 2 объекта, но у 3 возникли проблемы. У кого-нибудь есть пример кода, который может помочь? - person Saurabhcdt; 11.12.2018
comment
@Saurabhcdt либо на том же уровне, что и data, вы можете иметь поле error и иметь там данные об ошибках, либо использовать одно и то же поле data для обоих. В примере здесь вы можете найти 2-й элемент в data, это ошибка - person Sarath Sadasivan Pillai; 26.04.2019
comment
Я видел другие ответы на этот же вопрос, которые предпочитают давать ответ 200 OK для подобных сценариев, однако этот ответ кажется лучшим ответом. Он лучше разработан, более логичен и информативен. Таким образом, клиенту API не нужно выполнять какую-либо логику для 200 OK ответов. Кроме того, большинство инструментов управления API отслеживают метрики для каждого кода ответа API, и в информационных целях лучше отслеживать их отдельно. Пример: вы обновили базу данных своего API и теперь видите всплеск 207 кодов ответов в вашем инструменте управления API. Теперь вы знаете, что нужно исследовать. - person alex; 13.04.2021