Библиотека SFML: запрос http - PullRequest
       23

Библиотека SFML: запрос http

0 голосов
/ 31 октября 2018

Я хочу отправить HTTP Post Request на сервер. Сначала я следовал учебнику YT, в котором все очень хорошо объяснялось. Итак, из этого урока я создал следующий код:

const xhr = new XMLHttpRequest();

    xhr.onreadystatechange = function() {
      if(xhr.readyState == 4){
        if(xhr.status == 200){
          document.getElementById('show_data').textContent = xhr.responseText;
        }
        if (xhr.status == 404){
          console.log("ERROR 404. File not found");
        }
      }
    };
	
	var mode = JSON.stringify({"mode":"JSON"});
	var enumerate = JSON.stringify({"device":[{"command":"enumerate"}]});

    xhr.open('post', 'http://192.168.2.100', true);
    xhr.setRequestHeader("Content-type", "application//x-www-form-urlencoded");
    xhr.send(enumerate);

Но теперь проект требует написания на C ++. После некоторых исследований я нашел библиотеку SFML. Я хочу отправить тот же запрос, что и выше. Однако единственный ответ, который я получаю, это «404». Кто-нибудь может мне помочь с этим вопросом?

C ++ Код:

#include "pch.h"
#include <iostream>
#include <sstream>
#include <SFML/Network.hpp>

using namespace std;

int main()
{
    string json_mode = "{\"mode\":\"JSON\"}";
    string enumerate = "{\"device\":[{\"command\":\"enumerate\"}]}";

    // +++DOESN'T WORK+++
    //Request:
    sf::Http http;
    http.setHost("http://192.168.2.100");
    sf::Http::Request request;
    request.setMethod(sf::Http::Request::Post);
    request.setUri("/index.html");
    request.setBody(enumerate);
    //Response:
    sf::Http::Response response = http.sendRequest(request);
    if (response.getStatus() == sf::Http::Response::Ok)
    {
    cout << response.getStatus() << endl;
    cout << response.getMajorHttpVersion() << endl;
    cout << response.getMinorHttpVersion() << endl;
    cout << response.getBody() <<endl;
    //Here I only get "404" as an answer.
    }
    else
    {
        cout << "error: " << response.getStatus() << endl;
    }



    return 0;
}

Я рад каждому совету или совету. Или, если у вас есть идеи, чтобы сделать это проще / лучше, дайте мне знать. Заранее спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

Ваша проблема довольно проста. «Хост» для сервера - это только имя сервера, а не протокол. Поле используется сервером для фактического определения хоста, на который вы пытались связаться (поскольку один сервер может обслуживать несколько сайтов с разными доменными именами).

Вы можете полностью пропустить вызов sf::Http::setHost(), просто используя конструктор:

sf::Http http("192.168.2.100");

Или, если вы действительно хотите позвонить, просто сделайте так:

http.setHost("192.168.2.100");

Если это не решит проблему, проверьте файлы журнала вашего сервера. Должны быть запросы, если они дошли до него.


Просто для справки, как создается URL / URI:

http://192.168.2.100:8000/index.html
|-----| <- Protocol (you define this by specifically using sf::Http over sf::Ftp for example)

http://192.168.2.100:8000/index.html
       |-----------| <- Host

http://192.168.2.100:8000/index.html
                    |---| <- Port (optional)

http://192.168.2.100:8000/index.html
                          |--------| <- URI/document (optional and might serve a server dependent default, if empty)
...