在 C 中使用curl 执行http post 后,我在获取响应值时遇到困难。
我收到如下回复:
POST /xxxx HTTP/1.1
Host: xxxx.net
Accept: */*
Content-Length: 271
Content-Type: application/x-www-form-urlencoded
Run Code Online (Sandbox Code Playgroud)
HTTP/1.1 200 OK
Content-Type: text/xml
Date: Tue, 18 Nov 2014 13:49:31 GMT
Server: Null
Content-Length: 106
Connection: keep-alive
<?xml version="1.0" encoding="UTF-8"?>
<rsp stat="fail">
<err code="100" msg="Invalid_Parameter"/>
</rsp>
Run Code Online (Sandbox Code Playgroud)
如何使用curl获取xml响应值?
我使用curl_easy_perform 来处理http post。
我看过帮助文档,但只能找到CURLINFO_HTTP_CODE和CURLINFO_CONTENT_TYPE。但它与 xml 响应值无关。我应该使用什么样的curl_easy_getinfo参数?
这样,客户端可以在没有ALPN的情况下连接服务器并使用http/2默认值.
那可能吗?
我想使用 curl 删除文件
我正在使用 SFTP,下面是我正在使用的代码。它不适合我
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_URL, "sftp://use:@101.101.101.101/");
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_PORT, 51402);
curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE, '/home/web/.ssh/id_rsa');
curl_setopt($ch, CURLOPT_SSH_PUBLIC_KEYFILE, '/home/web/.ssh/id_rsa.pub');
curl_setopt($ch, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PUBLICKEY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_QUOTE, array("DELE /dispatch/confirm/W00027478.csv"));
$result = curl_exec($ch);
$error_no = curl_errno($ch);
curl_close($ch);
if ($error_no == 0) {
echo "Delete File $filename<br>";
} else {
echo "File Not Delete $filename<br>";
}
Run Code Online (Sandbox Code Playgroud) 如何保持与 libcurl 的连接?
我想要的用法如下。Keep-Alive我想连接到支持但在 90 秒不活动后关闭连接的服务器。当某些事件(在此连接之外)发生时,我想POST偶尔执行一次,并且我想保持连接处于活动状态以减少延迟。可能会发生超过 90 秒没有事件发生的情况,所以我想要一种方法来告诉服务器我没有空闲。
示例页面非常好,但我没有看到涉及Keep-Alive: https: //curl.haxx.se/libcurl/c/example.html
我确实找到了CURLOPT_TCP_KEEPINTVL: https: //curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html,但我不清楚它应该如何工作。在该示例中,我们看到代码:
CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
/* set keep-alive idle time to 120 seconds */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
/* interval time between keep-alive probes: 60 seconds */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
curl_easy_perform(curl);
}
Run Code Online (Sandbox Code Playgroud)
描述如下:
过了很长。设置操作系统在发送保活探测之间等待的时间间隔(以秒为单位)。并非所有操作系统都支持此选项。(7.25.0 中添加)
两个问题:
A) 在操作上,我该如何使用它?从描述来看,只要我保持curl在范围内,连接就会保持打开状态。它是否正确?然后我应该继续做吗
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis); …Run Code Online (Sandbox Code Playgroud) 我正在使用libssh2并在我的SSHWrapper对象之外定义了一个回调函数:
static void kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract);
Run Code Online (Sandbox Code Playgroud)
在我的SSHWrapper对象中,我执行以下操作,在验证会话时传递回调函数:
/* Create a session instance */
LIBSSH2_SESSION *session = libssh2_session_init_ex(NULL, NULL, NULL, self);
while ((rc = libssh2_userauth_keyboard_interactive(session, userChar, &kbd_callback)) == LIBSSH2_ERROR_EAGAIN);
Run Code Online (Sandbox Code Playgroud)
我想知道的是,是否可以kbd_callback()在我的对象中移动函数,以便它是一个类方法:+(void) kbd_callback:...?
如果是这样,我如何获取该函数的地址以将其传递给C函数libssh2_userauth_keyboard_interactive()?
我正在使用libcurl设置OAuth 2.0访问令牌。从libcurl 7.33 CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XOAUTH2_BEARER, char *token);选项开始。现在,我需要获取libcurl版本并将其与7.33进行比较。如果版本为7.33或更高版本,我将使用CURLOPT_XOAUTH2_BEARER,否则我将做其他事情。我知道我应该以某种方式使用,curl_version_info_data *curl_version_info( CURLversion type );但我不知道struct中的数据是什么样子以及如何将它们与7.33版本进行比较。有人能帮我吗?
使用 curl 命令从远程服务器下载文件后,我希望在文件名中添加时间戳或仅添加日期。我知道你可以使用 -o 来指定你想要命名的文件。我看到过这样的建议: -o "somefile $(date +\"%H:%M\").txt" 来尝试实现这一点,但我无法让它正常工作,它只是将文件保存为 'somefile $(date' 就像它不将 $ 识别为变量一样。
有没有人知道使用 curl 或是否可能实现此目的的方法?
有没有另一种方法来创建一个带有日期的变量,然后将其附加到文件名上?
提前致谢。
我观察到不同卷曲版本之间的奇怪行为。
如果我使用带有7.19.7的curl的CentOS 6 curl 'localhost:9999/foo#bar'(在9999上侦听),我得到:
GET /foo#bar HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: localhost:9999
Accept: */*
Run Code Online (Sandbox Code Playgroud)
但是如果我在带有curl 7.38.0的现代系统(Debian 8)上进行相同的卷曲,则会得到:
GET /foo HTTP/1.1
User-Agent: curl/7.38.0
Host: localhost:9999
Accept: */*
Run Code Online (Sandbox Code Playgroud)
请注意,URL不同:(7.19.7)/foo#bar与/foo(7.38.0)
我了解正确的行为是删除了该#anchor部件,因为这是curl工具的较新版本。但是,我不知道发生此更改的原因...请问有关此原因的任何提示或对此的引用(例如RFC)?
我试图在curl更新日志中找到信息,但是它太冗长,而且我还没有找到它背后的更改和/或原理。
curl ×5
libcurl ×5
c ×4
http ×3
http2 ×2
delete-file ×1
http-headers ×1
httprequest ×1
libssh2 ×1
multiplexing ×1
objective-c ×1
php ×1
sftp ×1
sh ×1
url ×1
version ×1
wget ×1