SFML提供了一个简单的HTTP客户端类,您可以使用它来与HTTP服务器进行通信。 "简单"意味着它支持HTTP的最基本功能:POST、GET和HEAD请求类型、访问HTTP头字段以及读取/写入页面正文。
如果您需要更高级的功能,例如安全的HTTP(HTTPS),那么最好使用真正的HTTP库,比如libcurl或cpp-netlib。
对于程序和HTTP服务器之间的基本交互,它应该足够了。
要与HTTP服务器通信,您必须使用sf::Http类。
#include
sf::Http http;
http.setHost("http://www.some-server.org/");
// or
sf::Http http("http://www.some-server.org/");
请注意,设置主机不会触发任何连接。每个请求都会创建一个临时连接。
sf::Http中唯一的其他函数是发送请求。这基本上是该类的全部功能。
sf::Http::Request request;
// fill the request...
sf::Http::Response response = http.sendRequest(request);
一个HTTP请求,由sf::Http::Request类表示,包含以下信息:
sf::Http::Request request;
request.setMethod(sf::Http::Request::Post);
request.setUri("/page.html");
request.setHttpVersion(1, 1); // HTTP 1.1
request.setField("From", "me");
request.setField("Content-Type", "application/x-www-form-urlencoded");
request.setBody("para1=value1¶m2=value2");
sf::Http::Response response = http.sendRequest(request);
SFML自动填充强制性标头字段,例如“Host”,“Content-Length”等等。您可以发送您的请求而不必担心它们。SFML将尽最大努力确保它们是有效的。
如果sf::Http类能够成功连接主机并发送请求,则会返回一个响应,该响应被封装在sf::Http::Response类的实例中并返回给用户。响应包含以下成员:
sf::Http::Response response = http.sendRequest(request);
std::cout << "status: " << response.getStatus() << std::endl;
std::cout << "HTTP version: " << response.getMajorHttpVersion() << "." << response.getMinorHttpVersion() << std::endl;
std::cout << "Content-Type header:" << response.getField("Content-Type") << std::endl;
std::cout << "body: " << response.getBody() << std::endl;
状态码可用于检查请求是否已成功处理:代码2xx表示成功,代码3xx表示重定向,代码4xx表示客户端错误,代码5xx表示服务器错误,代码10xx表示SFML特定错误,这些错误不是HTTP标准的一部分。
下面是一个简短的示例,演示如何执行一个简单的任务:将得分发送到在线数据库中。
#include
#include
void sendScore(int score, const std::string& name)
{
// prepare the request
sf::Http::Request request("/send-score.php", sf::Http::Request::Post);
// encode the parameters in the request body
std::ostringstream stream;
stream << "name=" << name << "&score=" << score;
request.setBody(stream.str());
// send the request
sf::Http http("http://www.myserver.com/");
sf::Http::Response response = http.sendRequest(request);
// check the status
if (response.getStatus() == sf::Http::Response::Ok)
{
// check the contents of the response
std::cout << response.getBody() << std::endl;
}
else
{
std::cout << "request failed" << std::endl;
}
}
当然,这只是一个处理在线得分的非常简单的方法。它没有任何保护措施:任何人都可以轻松地发送一个虚假的得分。更可靠的方法可能会涉及一个附加参数,例如哈希码,以确保请求是由程序发送的。这超出了本教程的范围。
最后,这里是一个非常简单的示例,展示了服务器上PHP页面的样子。
<?php
$name = $_POST['name'];
$score = $_POST['score'];
if (write_to_database($name, $score)) // this is not a PHP tutorial :)
{
echo "name and score added!";
}
else
{
echo "failed to write name and score to database...";
}
?>