Вопрос или проблема
Я хочу получить 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-запроса. В этом процессе важно не только правильно извлекать данные, но и соблюдать их целостность при передаче.
Основные моменты, которые нужно учитывать:
-
Получение данных: Команда
curl -GET http://localhost:9200/oldindex/_mapping?pretty
получает данные в формате JSON. Вы можете перенаправить этот вывод в файл, используя параметр-o
. -
Корректный формат файла: Убедитесь, что JSON, который сохранен в файле, синтаксически верен. Любые лишние или отсутствующие символы могут нарушить формат JSON.
-
Отправка данных: При отправке данных с помощью PUT-запроса, их можно загрузить из файла с помощью
-d @file.json
. Это позволитcurl
прочитать содержимое файла напрямую.
Пример
Рассмотрим шаги, которые нужно предпринять более конкретно:
-
Сохранение результата GET-запроса в файл:
curl -GET http://localhost:9200/oldindex/_mapping?pretty -o mapping.json
Это сохранит JSON в файл
mapping.json
, который можно будет использовать для последующих операций. -
Отправка 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.