Как отправить с помощью curl JSON из вывода другой команды curl

Вопрос или проблема

Я хочу получить JSON с помощью команды curl, и с помощью следующей команды я получаю вывод:

curl -GET http://localhost:9200/oldindex/_mapping?pretty
{
  "gl-events_1" : {
    "mappings" : {
      "message" : {
        "dynamic" : "false",
        "dynamic_templates" : [
          {
            "fields" : {
              "path_match" : "fields.*",
              "mapping" : {
                "doc_values" : true,
                "index" : true,
                "type" : "keyword"
              }
            }
          }
        ],
        "properties" : {
          "alert" : {
            "type" : "boolean"
          },
          "event_definition_id" : {
            "type" : "keyword"
          },
          "event_definition_type" : {
            "type" : "keyword"
          },
          "fields" : {
            "type" : "object",
            "dynamic" : "true"
          },
          "id" : {
            "type" : "keyword"
          },
          "key" : {
            "type" : "keyword"
          },
          "key_tuple" : {
            "type" : "keyword"
          },
          "message" : {
            "type" : "text",
            "norms" : false,
            "fields" : {
              "keyword" : {
                "type" : "keyword"
              }
            },
            "analyzer" : "standard"
          },
          "origin_context" : {
            "type" : "keyword"
          },
          "priority" : {
            "type" : "long"
          },
          "source" : {
            "type" : "keyword"
          },
          "source_streams" : {
            "type" : "keyword"
          },
          "streams" : {
            "type" : "keyword"
          },
          "timerange_end" : {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss.SSS"
          },
          "timerange_start" : {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss.SSS"
          },
          "timestamp" : {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss.SSS"
          },
          "timestamp_processing" : {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss.SSS"
          },
          "triggered_jobs" : {
            "type" : "keyword"
          }
        }
      }
    }
  }
}

Теперь я хочу сохранить этот вывод в виде файла json, поэтому я скопировал его в файл и дал расширение .json

Но когда я пытаюсь выполнить put с curl, я получаю следующую ошибку

curl -X PUT http://localhost:9200/new_good -H 'Content-Type: application/json' -d  sampl.json
{"error":{"root_cause":[{"type":"not_x_content_exception","reason":"Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes"}],"type":"not_x_content_exception","reason":"Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes"},"status":500}

Однако, когда я запускаю следующую команду с тем же форматом json напрямую, она работает,

curl -X PUT \
http://localhost:9200/new_good \
-H 'Content-Type: application/json' \
-d '{"mappings" : {
      "message" : {
        "dynamic_templates" : [
          {
            "internal_fields" : {
              "match" : "gl2_*",
              "match_mapping_type" : "string",
              "mapping" : {
                "type" : "keyword"
              }
            }
          },
          {
            "store_generic" : {
              "match_mapping_type" : "string",
              "mapping" : {
                "type" : "keyword"
              }
            }
          }
        ],
        "properties" : {
          "LoggerName" : {
            "type" : "keyword"
          },
          "MessageParam0" : {
            "type" : "keyword"
          },
          "MessageParam1" : {
            "type" : "long"
          },
          "MessageParam2" : {
            "type" : "keyword"
          },
          "MessageParam3" : {
            "type" : "keyword"
          },
          "MessageParam4" : {
            "type" : "keyword"
          },
          "MessageParam5" : {
            "type" : "keyword"
          },
          "MessageParam6" : {
            "type" : "keyword"
          },
          "MessageParam7" : {
            "type" : "keyword"
          },
          "MessageParam8" : {
            "type" : "keyword"
          },
          "Severity" : {
            "type" : "keyword"
          },
          "SourceClassName" : {
            "type" : "keyword"
          },
          "SourceMethodName" : {
            "type" : "keyword"
          },
          "SourceSimpleClassName" : {
            "type" : "keyword"
          },
          "StackTrace" : {
            "type" : "keyword"
          },
          "Thread" : {
            "type" : "keyword"
          },
          "Time" : {
            "type" : "keyword"
          },
          "facility" : {
            "type" : "keyword"
          },
          "full_message" : {
            "type" : "text",
            "analyzer" : "standard"
          },
          "gl2_accounted_message_size" : {
            "type" : "long"
          },
          "gl2_message_id" : {
            "type" : "keyword"
          },
          "gl2_processing_timestamp" : {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss.SSS"
          },
          "gl2_receive_timestamp" : {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss.SSS"
          },
          "gl2_remote_ip" : {
            "type" : "keyword"
          },
          "gl2_remote_port" : {
            "type" : "long"
          },
          "gl2_source_input" : {
            "type" : "keyword"
          },
          "gl2_source_node" : {
            "type" : "keyword"
          },
          "level" : {
            "type" : "long"
          },
          "message" : {
            "type" : "text",
            "analyzer" : "standard"
          },
          "source" : {
            "type" : "text",
            "analyzer" : "analyzer_keyword",
            "fielddata" : true
          },
          "streams" : {
            "type" : "keyword"
          },
          "timestamp" : {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss.SSS"
          }
        }
      }
    }
  }
}'

Я хочу сохранить вывод команды curl GET в виде действительного json, который я могу использовать в curl PUT,

curl get > some.json
curl put -d some.json 

Я новичок в этом, и я пробовал несколько вариантов с jq, но это также не сработало для меня.

Пожалуйста, помогите мне здесь.

С уважением, SAM

Чтобы сохранить JSON из команды curl, вы можете перенаправить вывод в файл в вашем случае. Или используйте:

curl ... -o file.json

Чтобы отправить его с помощью curl, вы можете выполнить команду

curl ... -d @file.json

Из man curl для -d --data <data>:

Если вы начинаете данные с буквы @, остальное должно быть именем файла, из которого будут считываться данные, или – если вы хотите, чтобы curl считывал данные из stdin.

Также отправка json в stdin команды curl будет работать с помощью -d -.

Ответ или решение

Когда речь идет о работе с JSON и командами curl, важно понимать несколько основных моментов. Прежде всего, curl — это мощный инструмент для передачи данных, который часто используется для взаимодействия с веб-сервисами. Он поддерживает множество протоколов, таких как HTTP, FTP, и MQTT, и позволяет выполнять запросы GET, POST, PUT и DELETE. Используя curl, необходимо обращать особое внимание на форматы данных и их передачу, особенно когда речь идет о JSON.

Теория

Чтобы отправлять JSON-данные с помощью curl, нужно убедиться, что данные передаются в правильном формате и с корректными заголовками HTTP. Это включает в себя использование заголовка Content-Type, который должен быть установлен на application/json, когда вы работаете с JSON.

В вашем случае вы хотите сначала получить данные с помощью curl и сохранить их в файл, чтобы затем повторно использовать их при выполнении PUT-запроса. В этом процессе важно не только правильно извлекать данные, но и соблюдать их целостность при передаче.

Основные моменты, которые нужно учитывать:

  1. Получение данных: Команда curl -GET http://localhost:9200/oldindex/_mapping?pretty получает данные в формате JSON. Вы можете перенаправить этот вывод в файл, используя параметр -o.

  2. Корректный формат файла: Убедитесь, что JSON, который сохранен в файле, синтаксически верен. Любые лишние или отсутствующие символы могут нарушить формат JSON.

  3. Отправка данных: При отправке данных с помощью PUT-запроса, их можно загрузить из файла с помощью -d @file.json. Это позволит curl прочитать содержимое файла напрямую.

Пример

Рассмотрим шаги, которые нужно предпринять более конкретно:

  1. Сохранение результата GET-запроса в файл:

    curl -GET http://localhost:9200/oldindex/_mapping?pretty -o mapping.json

    Это сохранит JSON в файл mapping.json, который можно будет использовать для последующих операций.

  2. Отправка JSON-файла с помощью PUT-запроса:

    Убедитесь, что файл mapping.json содержит корректные данные. Затем используйте команду:

    curl -X PUT http://localhost:9200/new_good -H 'Content-Type: application/json' -d @mapping.json

    Здесь важно, чтобы в файле mapping.json был правильный формат JSON.

Применение

Когда вы работаете с curl и JSON, постоянно проверяйте целостность данных и убедитесь, что они правильно интерпретируются как JSON-объекты. Это можно сделать, используя утилиты, такие как jq, которая позволяет проверять и обрабатывать JSON напрямую в командной строке.

Например, чтобы проверить JSON в файле, можно использовать следующее:

jq . mapping.json > /dev/null
if [ $? -ne 0 ]; then
  echo "JSON в файле mapping.json содержит ошибки."
else
  echo "JSON корректен."
fi

Заключение

Работа с JSON и curl требует внимательности к деталям при обработке данных. Ошибки вроде "not_x_content_exception" чаще всего возникают из-за неправильного формата данных. Понимание того, как правильно использовать curl для извлечения и отправки JSON-данных, является ключом к успешной разработке API-ориентированных приложений.

Практикуйтесь в использовании curl и его опций, таких как -o для сохранения данных или -d для их загрузки. Это неоднократно избавит вас от возможных ошибок и упростит разработку, особенно в коммуникации с RESTful API. Если вы чувствуете, что JSON-файл все еще вызывает ошибки, разбирайтесь в его структуре с помощью jq или аналогичных инструментов для разбора JSON.

Оцените материал
Добавить комментарий

Капча загружается...