perl - 相当于此 perl 代码的curl 命令行

标签 perl curl

我想为 POST 请求编写一个与此 Perl 代码等效的curl 命令:

use strict;
use warnings;
use LWP::UserAgent;
my $base = 'http://www.uniprot.org/mapping/';
my $params = {
  from => 'ACC',
  to => 'P_REFSEQ_AC',
  format => 'tab',
  query => 'P13368'
};
my $agent = LWP::UserAgent->new();
push @{$agent->requests_redirectable}, 'POST';
my $response = $agent->post($base, $params);
$response->is_success ?
  print $response->content :
  die 'Failed, got ' . $response->status_line .
    ' for ' . $response->request->uri . "\n";

我尝试过(以及许多其他变体):

curl -X POST -H "Expect:" --form "from=ACC;to=P_REFSEQ_AC;format=tab; query=P13368" http://www.uniprot.org/mapping/ -o out.tab

Perl 代码检索到预期结果,但curl 命令行却没有。它从“http://www.uniprot.org/mapping/”检索网页,但不发出 POST 请求。

我在响应 header 中查找了错误,但没有发现任何可疑内容。

> POST http://www.uniprot.org/mapping/ HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: www.uniprot.org
> Accept: */*
> Proxy-Connection: Keep-Alive
> Content-Length: 178
> Content-Type: multipart/form-data; boundary=----------------------------164471d8347f
> 
} [data not shown]
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Server: Apache-Coyote/1.1
< Vary: User-Agent
< Vary: Accept-Encoding
< X-Hosted-By: European Bioinformatics Institute
< Content-Type: text/html;charset=UTF-8
< Date: Wed, 05 Aug 2015 20:32:00 GMT
< X-UniProt-Release: 2015_08
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Headers: origin, x-requested-with, content-type
< X-Cache: MISS from localhost
< X-Cache-Lookup: MISS from localhost:3128
< Via: 1.0 localhost (squid/3.1.20)
< Connection: close
<

我花了将近三天的时间在网络上寻找解决方案,但没有任何效果。

最佳答案

看起来服务器期望的数据为 application/x-www-form-urlencoded 而不是像使用 那样的 multipart/form-data >--form 参数。以下内容应该有效:

curl -v -L --data \
  "from=ACC&to=P_REFSEQ_AC&format=tab&query=P13368" \
  http://www.uniprot.org/mapping/ -o out.tab

使用--data,您可以获得预期的内容类型 header ,但您必须自己进行编码。使用-L,curl 遵循此处需要的重定向来获取结果数据。

不需要-X POST选项,因为POST是发送数据时的默认方法。并且也不需要 -H "Expect:"

关于perl - 相当于此 perl 代码的curl 命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31842404/

相关文章:

linux - 如何知道用户当前打开了哪些文件?

xml - 如何访问由 XML::Parser 创建的解析树?

Curl 内存缓冲区大小太小

curl - Elasticsearch多字段映射更新

perl - 使用 inline::C 来加速数学是否值得

perl - 如何遍历Perl数组引用?

windows - 使用 Mail::Sendmail 使用 Windows 机器从 perl 脚本发送电子邮件时出错

php - CURL 问题(多)

php - 如何更新 php5.6-curl 以便它可以验证新的 LetsEncrypt X1 证书?

php - 如何使用CURL动态创建POST请求?