Russian Qt Forum
Ноябрь 13, 2024, 09:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: xml-rpc  (Прочитано 16261 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Май 19, 2022, 15:54 »

Всем, доброго дня!!!
Подскажите кто-нибудь работал с   xml-rpc?

Не могу понять запрос и ответ на запрос передаются между клиент-сервером xml- файлами?

Заранее прошу простить если спросил глупость.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #1 : Май 19, 2022, 23:02 »

тело запроса должно быть хмл документом с некоторой стандартизованной структурой, я так понимаю (по аналогии с JSON-RPC)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Май 20, 2022, 08:16 »

Т.е получается со стороны клиента и со стороны сервера должен быть xml парсер, который из документа будет вынимать нужную инфу?
« Последнее редактирование: Май 20, 2022, 09:09 от demaker » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #3 : Май 20, 2022, 09:48 »

все верно.

если одна сторона только отправляет запросы, а другая только принимает, то на отправляющей стороне в принципе можно формировать хмл документ ручками (если, например, для отправляющей стороны надо тащить отдельную библиотеку для обработки хмл).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #4 : Май 20, 2022, 10:48 »

все верно.

если одна сторона только отправляет запросы, а другая только принимает, то на отправляющей стороне в принципе можно формировать хмл документ ручками (если, например, для отправляющей стороны надо тащить отдельную библиотеку для обработки хмл).

Мне нужно используя QTcpSocket  сделать две прилажухи : клиент и сервер))

Со стороны клиента вводится два цифровых значения и операция которая производится: сложить, умножить, вычесть, разделить. Все это посылается на сервер и сервер выдает результат.

Все это нужно сделать при помощи xml-rpc.

 Я так понимаю что клиент формиует xml документ и передает файл по сити, сервер соответственно принимает его, парсит и выполняет нужную операцию с переданными данными.  Правильно я понимаю?
« Последнее редактирование: Май 20, 2022, 10:53 от demaker » Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #5 : Май 20, 2022, 11:13 »

https://www.genivia.com/dev.html
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #6 : Май 20, 2022, 13:49 »

а сокет обязательно, обычным QNAM не обойтись? Улыбающийся по стандарту xml-rpc использует http транспорт, тебе придется формировать структуру запроса самому.

1) клиент формирует хмл с нужными данными и отправляет по сети
2) сервер парсит хмл, выполняет свою логику, отправляет хмл с результатом клиенту
3) клиент парсит хмл-результат
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #7 : Май 20, 2022, 16:12 »

а сокет обязательно, обычным QNAM не обойтись? Улыбающийся по стандарту xml-rpc использует http транспорт, тебе придется формировать структуру запроса самому.

1) клиент формирует хмл с нужными данными и отправляет по сети
2) сервер парсит хмл, выполняет свою логику, отправляет хмл с результатом клиенту
3) клиент парсит хмл-результат

Да мне нужен QTcpSocket
Клиент и сервер я пишу сам на базе QTcpSocket

А что значит формировать структуру запроса самому, можно поподробнее для особоодаренных...

Я думал формируем xml-файл, отправляем(soket.write(...)), принимаем (socket.read(...)), парсим xml -файл

Или я не прав???
« Последнее редактирование: Май 20, 2022, 16:31 от demaker » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #8 : Май 20, 2022, 16:48 »

гуглить не пробовал? хотя бы почитать что такое xml-rpc прежде, чем тут спрашивать Улыбающийся

если у тебя какое-то самопальное приложение, то можешь конечно тупо писать XML в сокет. но если ты хочешь следовать стандарту xml-rpc, то надо отправлять полноценный http запрос.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #9 : Май 24, 2022, 11:20 »

гуглить не пробовал? хотя бы почитать что такое xml-rpc прежде, чем тут спрашивать Улыбающийся

если у тебя какое-то самопальное приложение, то можешь конечно тупо писать XML в сокет. но если ты хочешь следовать стандарту xml-rpc, то надо отправлять полноценный http запрос.

Приложение да самопальное)))

Пробовал)))
Я просто так до конца  и не понял В замешательстве Смеющийся

Хотелось уточнить

Голова HTTP сообщения состоит из стартовой строки вместе с заголовками(start line + headers)
Код:
 POST / HTTP/1.1                                                          <--------------start line
 Host: localhost : 8000                                                          
 User-Agent: Mozila/5.0                                                                                        
 Accept : text/html, application/xhtml + xml,...                                                      
 Accept-Language: en-US, en; q=0.5                                                                  
 Aceept-Encoding: gzip, deflate                                                                            
 Connection: keep-alive                                                                                          
 Upgrade-Insecure-Request: 1                                                                                
 Content-Type: multipart/from-data; boundary=1265684                                          
 Content-Length: 345                                                                                          
                                                                                   <--------------empty line
-123456789                                                                  <----------------body
(more data)

//Строки между start line и empty line это http headers

POST, GET, PUT - методы и т.д описывают требуемое действие

По какому принципу заполнять заголовочные файлы(http headers)?

Нужно ли их все заполнять или достаочно только заполнить start line?
Или можно примерно сделать так (примерный код ниже)?

Код
C++ (Qt)
QString  http_start_line = "POST / HTTP/1.1";
QFile xml_file;
...
QByteArray ba_file = xml_file.readAll();
...
 
QByteArray buffer;
buffer.appent(http_start_line);
buffer.append(ba_file);
 
socket.write(buffer.data(), buffer.size());
 
« Последнее редактирование: Май 24, 2022, 11:23 от demaker » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #10 : Май 24, 2022, 11:53 »

хедеры нужны для сервера, почитай в документации http какие являются обязательными или найди пример кода. но лучше на клиенте используй QNAM для отправки запроса, а на сервере можешь принимать данные в голом сокете, раз так хочется: там банально поиском по строке найдешь начало хмл документа.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #11 : Май 24, 2022, 17:12 »

хедеры нужны для сервера, почитай в документации http какие являются обязательными или найди пример кода. но лучше на клиенте используй QNAM для отправки запроса, а на сервере можешь принимать данные в голом сокете, раз так хочется: там банально поиском по строке найдешь начало хмл документа.

По докумуентации ,да посмтрю в RFC2616...

И еще такой момент)))
Так как работаем с tcpsocket, то нужно разделять сообщения для этого используем соответственно разделитель (const unsigned int Delimetr = 0xABCCCCBA)
Плюс для проверки корректности высылается его размер в поле size.

Код
C++ (Qt)
const unsigned int Delimetr = 0xABCCCCBA;
 
struct message_header{
uint32_t delimetr = ::Delimetr;
uint32_t size;
};
 
void Service::prepareMessageAndSend()
{
 
//HTTP
QString http_string = "GET /something operations server will do / HTTP/1.1";
int http_str_sz = http_string.size();
 
//XML
QFile xmlfile;
...
QByteArray ba_xml = xmlfile.readAll();
int xml_file_sz = ba.size();
 
//TCP MY_MESSAGE_HEADER
message_header msghdr;
msghdr.size = sizeof(message_header) + http_str_sz + xml_file_sz;
 
//INPUT BUFFER
QByteArray buffer;
buffer.append(reinterpret_cast<char *>(&msghdr), sizeof(message_header));
buffer.append(http_string);
buffer.append(ba_xml);
 
//SEND
socket.write(buffer.data(), buffer.size());
 
}
 

Хотелось уточнить, считается ли это нормальной практикой и можно ли так делать как в вышеприведенном коде?
« Последнее редактирование: Май 24, 2022, 18:20 от demaker » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.154 секунд. Запросов: 22.