2016-04-20 2 views
0

В настоящее время я разрабатываю сценарии bash, которые используют elasticsearch, и мне нужна хорошая обработка ошибок. В этой ситуации я пытаюсь добавить документ в поиск elastics и проверить, удалось ли выполнить операцию.Обработка ошибок с помощью curl и elasticsearch

Сначала я наивно попытался это:

response=$(curl -XPOST 'http://localhost:9200/indexation/document' -d ' 
{ 
    "content":"'"$txt"'",, 
    "date_treatment":"'"$(date +%Y-%m-%d)"'" 
}') && echo ok || echo fail 

Но локон не работает таким образом, и по-прежнему возвращает успех (0 - который на самом деле логично), даже если запрос JSON, очевидно, неправильно (обратите внимание на двойной запятая в строке 3) и elasticsearch отображает ошибки.

Так что ответа нет. Теперь я думаю, что я должен проанализировать переменную $ response для ошибок catch (grep?). Я отправляю этот вопрос, чтобы получить подсказки или решения на пути сделать это надежным способом и убедиться, что я не пропущу очевидного решения (возможно, вариант завитка, который я не знаю?).

Благодарим за помощь!

Дополнительные полезные вещи

Parsing JSON with Unix tools

Примеры содержания $ ответа:

успех:

{ 
    "_id": "AVQz7Fg0nF90YvJIX_2C", 
    "_index": "indexation", 
    "_shards": { 
     "failed": 0, 
     "successful": 1, 
     "total": 1 
    }, 
    "_type": "document", 
    "_version": 1, 
    "created": true 
} 

ошибка:

{ 
    "error": { 
     "caused_by": { 
      "reason": "json_parse_exception: Unexpected character (',' (code 44)): was expecting either valid name character (for unquoted name) or double-quote (for quoted) to start field name\n at [Source: [email protected]f; line: 3, column: 17]", 
      "type": "json_parse_exception" 
     }, 
     "reason": "failed to parse", 
     "root_cause": [ 
      { 
       "reason": "json_parse_exception: Unexpected character (',' (code 44)): was expecting either valid name character (for unquoted name) or double-quote (for quoted) to start field name\n at [Source: [email protected]f; line: 3, column: 17]", 
       "type": "json_parse_exception" 
      } 
     ], 
     "type": "mapper_parsing_exception" 
    }, 
    "status": 400 
} 
+0

Попробуйте напечатать статус 'response' путем добавления' 'Эхо $ после строки в сценарии у вас есть?. – Inian

+0

И то, что я называю «успех» и «отказ», возвращает $ ?. Это в основном то, что я пытался с помощью && echo ok || echo fail', но когда я даю elasticsearch плохую просьбу, это не завиток, это elasticsearch. – 021

+0

(не могу изменить по некоторым причинам) Я имел в виду возврат $? = 0 (успех) – 021

ответ

2

Простым решением является использование опции -f/--fail.

В соответствии с documentation:

(HTTP) Сбой молча (без вывода на всех) на ошибки сервера. Это в основном сделано для лучшего включения скриптов и т. Д., Чтобы лучше справляться с неудачными попытками . В обычных случаях, когда HTTP-сервер не может предоставить документ , он возвращает HTML-документ, указывающий так (что часто также содержит ). Этот флаг будет препятствовать ротор от вывода , что и возвращают ошибка 22.

Этот метод не является отказоустойчивой и бывают случаи, когда не-успешные коды ответов будет проскользнуть через, особенно когда аутентификации участвует (коды ответа 401 и 407).

пример:

response=$(curl -XPOST 'http://localhost:9200/indexation/document' -d ' 
{ 
    "content":"'"$txt"'",, 
    "date_treatment":"'"$(date +%Y-%m-%d)"'" 
}' -f) && echo ok || echo fail 
+0

Спасибо, этот вариант именно то, что я искал! – 021

Смежные вопросы