Curl Bash получить заголовок и тело без манипуляции со строками - PullRequest
0 голосов
/ 05 декабря 2018

Я использую curl и bash, чтобы получить конфигурацию с go cd.мне нужен заголовок с надписью ETag, но я также хочу тело json.Есть ли простой способ сделать это с помощью curl или я должен манипулировать результатом в bash?

$ curl 'https://ci.example.com/go/api/admin/pipelines/my_pipeline' \
    -u 'username:password' \
    -H 'Accept: application/vnd.go.cd.v6+json' \
    -i

возвращает это:

HTTP/1.1 200 OK
Content-Type: application/vnd.go.cd.v6+json; charset=utf-8
ETag: "e064ca0fe5d8a39602e19666454b8d77"
{
     "_links": {
     "self": {
             "href": "https://ci.example.com/go/api/admin/pipelines/my_pipeline"
},
"doc": {
  "href": "https://api.gocd.org/#pipeline-config"
},
...

я не могу использовать jq, потому что он жалуется назаголовки, но я хочу заголовок ETag и его значение тоже.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

curl возвращает последовательность строк с CR / LF-символами, причем последняя строка (после пустой строки) является фактическим телом.Вы можете написать блок кода, который сначала использует цикл while для анализа заголовков из стандартного ввода, завершается после завершения блока заголовка, а затем использует jq для чтения остальной части ввода.Например:

# Consume standard input up to, and including, an empty line.
# Sets global variable 'etag'.
parse_headers () {
  local header etag_regex='ETag: (.*)'
  while read -d $'\r\n' header; do
    if [[ $header =~ $etag_regex ]]; then
      etag=${BASH_REMATCH[1]}
    elif [[ -z $header ]]; then
      # End of headers
      break
    fi
  done
}

# Pass input first to parse_headers, then to jq
{
  parse_headers
  jq '._links.self'  # After parse_headers is done, only the JSON should remain
} < <(curl ...)
echo "ETag is $etag"

Пример вывода

{
  "href": "https://ci.example.com/go/api/admin/pipelines/my_pipeline"
}
ETag is "e064ca0fe5d8a39602e19666454b8d77"
0 голосов
/ 05 декабря 2018

Возможно, вам следует сохранить ответ в переменной и использовать его для доступа к заголовку ETag: и json.

Попробуйте сделать следующее:

response="$(curl -s 'https://ci.example.com/go/api/admin/pipelines/my_pipeline' \
-u 'username:password' \
-H 'Accept: application/vnd.go.cd.v6+json' \
-i)"
etag_header=$(printf '%s' "${response}" | sed -n '/^ETag.*/ { p }')
body_json="{${response#*{}"

# use etag_header
printf "%s\n" "${etag_header}"

# use body_json
printf "%s\n" "${body_json}" | jq

Вывод:

ETag: "e064ca0fe5d8a39602e19666454b8d77"
{
  "_links": {
    "self": {
      "href": "https://ci.example.com/go/api/admin/pipelines/my_pipeline"    
    }
  },
  "doc": {
    "href": "https://api.gocd.org/#pipeline-config"
  },
...
...