Я хочу отправить HTTP-запрос на сервер. Сначала я следил за учебником 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.info("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;
}
Я рад каждому совету или подсказке. Или, если у вас есть идеи, как сделать это проще / лучше, дайте мне знать. Заранее спасибо.
попробуйте request.setUri("/");
@inaliahgle, большое спасибо. Работает отлично. дело закрыто
Ваша проблема довольно проста. «Хост» для сервера - это только имя сервера, а не протокол. Это поле используется сервером для фактического определения хоста, к которому вы пытались подключиться (поскольку один сервер может обслуживать несколько сайтов с разными доменными именами).
Вы можете полностью пропустить вызов 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)
Имеет смысл. Однако проблема заключалась, как упоминалось в комментарии выше, в URI. Мне пришлось установить его на «/», чтобы получить желаемый ответ. Но все же спасибо, потому что я не знал, как создается URL.
@ David9472 А, ладно, тогда это может быть конфигурация. Большинство серверов также будут обслуживать /index.html
как /
, но также возможно, что фактический файл называется /index.htm
или аналогичный. Это будет происходить в индивидуальном порядке.
Привет, Возможно,
index.html
не существует в корне веб-сервера по адресу192.168.2.100
?