Perl / curl如何获取状态代码和响应正文

时间:2015-02-26 20:28:13

标签: linux perl curl

我正在尝试编写一个调用API的简单perl脚本,如果状态代码是2xx,则执行响应操作。如果它是4xx或5xx,那么做其他事情。

我遇到的问题是我能够获得响应代码(使用自定义写出格式化程序并将输出传递到其他地方)或者我可以得到整个响应和标题。

my $curlResponseCode = `curl -s -o /dev/null -w "%{http_code}" ....`;

只会给我状态代码。

my $curlResponse = `curl -si ...`; 

会给我整个标题加上回复。

我的问题是如何从服务器获取响应主体和http状态代码以简洁的格式,允许我将它们分成两个单独的变量。

不幸的是我不能使用LWP或任何其他单独的库。

提前致谢。 -Spencer

3 个答案:

答案 0 :(得分:10)

我提出了这个解决方案:

URL="http://google.com"

# store the whole response with the status at the and
HTTP_RESPONSE=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X POST $URL)

# extract the body
HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')

# extract the status
HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')

# print the body
echo "$HTTP_BODY"

# example using the status
if [ ! $HTTP_STATUS -eq 200  ]; then
  echo "Error [HTTP status: $HTTP_STATUS]"
  exit 1
fi

答案 1 :(得分:4)

  

...会给我整个标题加上回复。

     

...以一种简洁的格式,允许我将它们分成两个独立的变量。

由于标题和正文仅由空行分隔,因此您可以拆分此行中的内容:

 my ($head,$body) = split( m{\r?\n\r?\n}, `curl -si http://example.com `,2 );

并从标题

获取状态代码
 my ($code) = $head =~m{\A\S+ (\d+)};

你也可以将它组合成一个带有正则表达式的表达式,尽管这可能更难理解:

my ($code,$body) = `curl -si http://example.com` 
      =~m{\A\S+ (\d+) .*?\r?\n\r?\n(.*)}s;

答案 2 :(得分:2)

相当基本 - 您正在捕获系统命令的输出。通过使用为其构建的库 - LWP来实现这一目标会更好。 如果失败 - curl -v将生成状态代码和内容,您将不得不解析它。

您可能还会发现SuperUser上的这个主题很有用:

https://superuser.com/questions/272265/getting-curl-to-output-http-status-code

具体地

#creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

(这不是perl,但你可以使用类似的东西。至少,运行-w并将你的内容捕获到临时文件。