【问题标题】:How to get cURL to output only HTTP response body (JSON) and no other headers etc如何让 cURL 仅输出 HTTP 响应正文(JSON)而不输出其他标头等
【发布时间】:2014-06-17 00:23:46
【问题描述】:

我在 bash 脚本中使用 curl 来获取服务的响应,如下所示,

response=$(curl -isb -H "Accept: application/json" "http://host:8080/some/resource")

服务响应是 json 类型,在浏览器上我可以完美响应。
然而 curl 响应还有其他不需要的东西(例如 set-cookie,在这种情况下是 content-length 标头),有时实际响应会被吃掉。

这是echo $response的输出>

 Set-Cookie: rack.session=BAh7CEkiD3Nlc3Npb25faWQGOgZFVEkiRWJlY2JiOTE2M2Q1ZWI4NThjMDdi%0AYjRiOWRjMGMxMGEwYTBkMjE3NmJhZDVjYzY4YjY4ZTlmMTE2ZGVkYWE3MTMG%0AOwBGS
SIJY3NyZgY7AEZJIiVhZmQ2MmUyZGMxMzFmOGEwMjg3NDlhNWM3YmVm%0AN2FjNwY7AEZJIg10cmFja2luZwY7AEZ7B0kiFEhUVFBfVVNFUl9BR0VOVAY7%0AAFRJIi00MTc0OGM2MWNkMzljZTYxNzY3ZjU0
Y2I5OTdiYWRkN2MyNTBkYmU4%0ABjsARkkiGUhUVFBfQUNDRVBUX0xBTkdVQUdFBjsAVEkiLWRhMzlhM2VlNWU2%0AYjRiMGQzMjU1YmZlZjk1NjAxODkwYWZkODA3MDkGOwBG%0A--ee97a62095e7d42129
 tontent-Length: 354c8; path=/; HttpOnly

这打破了我的响应解析逻辑。
我看到这种情况间歇性地发生,这很奇怪。

有没有办法从 cUR 输出中获取 "only" json 响应?
我浏览了 curl 文档,但看不到任何东西/或者我可能错过了。

【问题讨论】:

    标签: json bash curl


    【解决方案1】:

    您正在指定-i 选项:

    -i, --include

    (HTTP) 在输出中包含 HTTP 标头。 HTTP 标头包括服务器名称、文档日期、HTTP 版本等内容...

    只需从命令行中删除该选项:

    response=$(curl -sb -H "Accept: application/json" "http://host:8080/some/resource")
    

    【讨论】:

    • 是的。但这很奇怪;它直接从命令行工作。但是从 bash 脚本来看,它的行为有所不同,除了字母“t”,我无法在回显响应中看到任何内容
    • 从 echo $response 更改了 echo "response is $response",现在我可以看到正确的响应。不知道为什么会这样。谢谢!
    • 一个学习是在命令中使用时总是“引用”一个回显变量.. responsenew=$(echo "$response" | grep "abc")
    • Rishi,$response 周围的引号避免在新行和空格处破坏内容
    【解决方案2】:

    我正在执行一个获取请求,也只想看到响应而不是其他任何东西,似乎使用 -silent,-s 选项完成了魔法。

    来自 curl 手册页:

    -s, --silent 静音或静音模式。不要显示进度表或错误消息。使 Curl 静音。它仍然会输出你要求的数据,甚至可能输出到终端/标准输出,除非你重定向它。

    下面的例子:

    curl -s "http://host:8080/some/resource"
    curl --silent "http://host:8080/some/resource"
    

    使用自定义标题

    curl -s -H "Accept: application/json" "http://host:8080/some/resource")
    

    使用带有标题的 POST 方法

    curl -s -X POST -H "Content-Type: application/json" "http://host:8080/some/resource") -d '{ "myBean": {"property": "value"}}'
    

    您还可以使用 -w 自定义特定值的输出,在我用来获取 curl 响应代码的选项下方:

    curl -s -o /dev/null -w "%{http_code}" "http://host:8080/some/resource"
    

    【讨论】:

      【解决方案3】:
      #!/bin/bash
      
      req=$(curl -s -X GET http://host:8080/some/resource -H "Accept: application/json") 2>&1
      echo "${req}"
      

      【讨论】:

      • 请避免代码转储,始终尝试解释代码在做什么或提供评论,即使它是一个简单的代码块。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 2012-01-20
      • 2016-06-03
      • 1970-01-01
      • 2012-04-21
      相关资源
      最近更新 更多