Russian Qt Forum

Qt => XML => Тема начата: demaker от Май 19, 2022, 15:54



Название: xml-rpc
Отправлено: demaker от Май 19, 2022, 15:54
Всем, доброго дня!!!
Подскажите кто-нибудь работал с   xml-rpc?

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

Заранее прошу простить если спросил глупость.


Название: Re: xml-rpc
Отправлено: kambala от Май 19, 2022, 23:02
тело запроса должно быть хмл документом с некоторой стандартизованной структурой, я так понимаю (по аналогии с JSON-RPC)


Название: Re: xml-rpc
Отправлено: demaker от Май 20, 2022, 08:16
Т.е получается со стороны клиента и со стороны сервера должен быть xml парсер, который из документа будет вынимать нужную инфу?


Название: Re: xml-rpc
Отправлено: kambala от Май 20, 2022, 09:48
все верно.

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


Название: Re: xml-rpc
Отправлено: demaker от Май 20, 2022, 10:48
все верно.

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

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

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

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

 Я так понимаю что клиент формиует xml документ и передает файл по сити, сервер соответственно принимает его, парсит и выполняет нужную операцию с переданными данными.  Правильно я понимаю?


Название: Re: xml-rpc
Отправлено: RedDog от Май 20, 2022, 11:13
https://www.genivia.com/dev.html


Название: Re: xml-rpc
Отправлено: kambala от Май 20, 2022, 13:49
а сокет обязательно, обычным QNAM не обойтись? :) по стандарту xml-rpc использует http транспорт, тебе придется формировать структуру запроса самому.

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


Название: Re: xml-rpc
Отправлено: demaker от Май 20, 2022, 16:12
а сокет обязательно, обычным QNAM не обойтись? :) по стандарту xml-rpc использует http транспорт, тебе придется формировать структуру запроса самому.

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

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

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

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

Или я не прав???


Название: Re: xml-rpc
Отправлено: kambala от Май 20, 2022, 16:48
гуглить не пробовал? хотя бы почитать что такое xml-rpc прежде, чем тут спрашивать :)

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


Название: Re: xml-rpc
Отправлено: demaker от Май 24, 2022, 11:20
гуглить не пробовал? хотя бы почитать что такое xml-rpc прежде, чем тут спрашивать :)

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

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

Пробовал)))
Я просто так до конца  и не понял :-\ ;D

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

Голова 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());
 


Название: Re: xml-rpc
Отправлено: kambala от Май 24, 2022, 11:53
хедеры нужны для сервера, почитай в документации http какие являются обязательными или найди пример кода. но лучше на клиенте используй QNAM для отправки запроса, а на сервере можешь принимать данные в голом сокете, раз так хочется: там банально поиском по строке найдешь начало хмл документа.


Название: Re: xml-rpc
Отправлено: demaker от Май 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());
 
}
 

Хотелось уточнить, считается ли это нормальной практикой и можно ли так делать как в вышеприведенном коде?