SFML2.6 网络模块--使用HTTP进行Web请求

介绍

SFML提供了一个简单的HTTP客户端类,您可以使用它来与HTTP服务器进行通信。 "简单"意味着它支持HTTP的最基本功能:POST、GET和HEAD请求类型、访问HTTP头字段以及读取/写入页面正文。

如果您需要更高级的功能,例如安全的HTTP(HTTPS),那么最好使用真正的HTTP库,比如libcurl或cpp-netlib。

对于程序和HTTP服务器之间的基本交互,它应该足够了。

sf::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类表示,包含以下信息:

  • 方法:POST(发送内容),GET(检索资源),HEAD(检索资源的头部,不包括其正文)
  • URI:获取/发布资源(页面、图像等)的地址,相对于根目录
  • HTTP版本(默认为1.0,但如果您使用特定功能,则可以选择不同的版本)
  • 头部:一组具有键和值的字段
  • 页面正文(仅在使用POST方法时使用)
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类的实例中并返回给用户。响应包含以下成员:

  • 状态码精确指示服务器如何处理请求(OK,重定向,未找到等)。
  • 服务器的HTTP版本
  • 标题:一组带有键和值的字段
  • 响应正文
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...";
    }
?>

你可能感兴趣的:(SFML2.6教程,http,前端,网络协议)