如何解决如何在C中发布请求后添加Cookie?
我正在尝试为我创建一个登录网站的程序。问题是,当我按照重定向进行操作时,网站会提供一个唯一的cookie,我无法弄清楚如何添加到发布请求中。我已经遍历了手册页上的每个libcurl选项,但是找不到任何可以做到这一点的东西。到目前为止,这是我所拥有的岗位要求功能。
void webpost(char* url,char* postdata) {
CURL *handler = curl_easy_init();
CURLcode err;
long size = sizeof(postdata);
if (handler) {
curl_easy_setopt(handler,CURLOPT_URL,url);
curl_easy_setopt(handler,CURLOPT_POSTFIELDSIZE,50L);
curl_easy_setopt(handler,CURLOPT_POSTFIELDS,postdata);
curl_easy_setopt(handler,CURLOPT_FOLLOWLOCATION,1L);
curl_easy_setopt(handler,CURLOPT_VERBOSE,1L);
err = curl_easy_perform(handler);
if (err != CURLE_OK) {
printf("ERROR POST: %s returned (%s)\n",url,curl_easy_strerror(err));
}
curl_easy_cleanup(handler);
}
}
此函数运行时,我得到以下结果。
* Trying 10.10.10.10...
* TCP_NODELAY set
* Connected to website.com (10.10.10.10) port 2048 (#0)
> POST /login HTTP/1.1
Host: website.com
Accept: */*
Content-Length: 50
Content-Type: application/x-www-form-urlencoded
* upload completely sent off: 50 out of 50 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Moved temporarily
< Date: Wed,26 Aug 2020 05:59:50 GMT
< Server: EZproxy
< Expires: Mon,02 Aug 1999 00:00:00 GMT
< Last-Modified: Wed,26 Aug 2020 05:59:50 GMT
< Cache-Control: no-store,no-cache,must-revalidate
< Cache-Control: post-check=0,pre-check=0
< Pragma: no-cache
< Set-Cookie: ezproxy=uRZWAo3IsKyR9O0; Path=/; Domain=.website.com
< Location: http://website.com/connect?session=suRZWAo3IsKyR9O0&url=menu
< Connection: close
<
* Closing connection 0
* Issue another request to this URL: 'http://website.com/connect?session=suRZWAo3IsKyR9O0&url=menu'
* Switch from POST to GET
* Hostname website.com was found in DNS cache
* Trying 10.10.10.10...
* TCP_NODELAY set
* Connected to website.com (10.10.10.10) port 2048 (#1)
> GET /connect?session=suRZWAo3IsKyR9O0&url=menu HTTP/1.1
Host: website.com
Accept: */*
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Moved temporarily
< Date: Wed,pre-check=0
< Pragma: no-cache
< Set-Cookie: ezproxy=uRZWAo3IsKyR9O0; Path=/; Domain=.website.com
< Location: http://website.com/connect?session=ruRZWAo3IsKyR9O0&url=menu
< Connection: close
<
* Closing connection 1
* Issue another request to this URL: 'website.com/connect?session=ruRZWAo3IsKyR9O0&url=menu'
* Hostname website.com was found in DNS cache
* Trying 10.10.10.10...
* TCP_NODELAY set
* Connected to website.com (10.10.10.10) port 2048 (#2)
> GET /connect?session=ruRZWAo3IsKyR9O0&url=menu HTTP/1.1
Host: website.com
Accept: */*
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Wed,26 Aug 2020 05:59:50 GMT
< Server: EZproxy
< Content-Type: text/html
< Connection: close
<
<html>
<head>
<title>Cookie Required</title>
</head>
<body>
<p>
Licensing agreements for these databases require that access be extended
only to authorized users. Once you have been validated by this system,a "cookie" is sent to your browser as an ongoing indication of your authorization to
access these databases. This cookie only needs to be set once during login.
</p>
<p>
If you are using a firewall or network privacy program,you may need
reconfigure it to allow cookies to be set from this server.
</p>
<p>
As you access databases,they may also use cookies. Your ability to use those databases
may depend on whether or not you allow those cookies to be set.
</p>
<p>
To login again,click <a href="/login">here</a>.
</p>
</body>
</html>
* Closing connection 2
解决方法
只需将下一个请求中的标头添加到与domain
标头的path
和Set-cookie:
参数相匹配的网站上即可,
Cookie: ezproxy=uRZWAo3IsKyR9O0
这足以使服务器识别并定位您来自的会话,因此它可以定位属于您的会话的数据。
您可以阅读HTTP以获得状态管理机制的描述,并了解Cookie
和Set-Cookie
标头。
谢谢,我能够通过将cookie保存到文件并将其加载到同一请求中来使其正常工作。
curl_easy_setopt(handler,CURLOPT_COOKIEJAR,“ cookies.txt”); curl_easy_setopt(handler,CURLOPT_COOKIEFILE,“ cookies.txt”);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。