c - 发送带有 XML 内容的 POST http 请求
问题描述
我喜欢向我的传感器发送一个 http POST 请求和一个 XML 内容:
对于计数数据:
http://{SensorIP}:5211/1.0-PAI/PassengerCountingService/SubscribeAllData
XML 数据:
<SubscribeRequest>
<Client-IP-Address>
<Value>{HostIP}</Value>
</Client-IP-Address>
<ReplyPort>
<Value>{YourReplyPort}</Value>
</ReplyPort>
<ReplyPath>
<Value>{YourReplyPath}</Value>
</ReplyPath>
</SubscribeRequest>
我有一个用于连接传感器的套接字 TCP,但我不知道如何使用 POST 操作发送这种 XML 格式。
你有想法吗?编辑:
char buffer[1024] = "";
int nOctetsRecus = 0;
int nOctetsEnvoyes = 0;
int tailleBuffer = 0;
int boucle = 1;
char * URL;
char * xml_data;
nOctetsRecus = 0;
nOctetsEnvoyes = 0;
tailleBuffer = 0;
boucle = 1;
//STEP1: Initialisation Winsock
iwsaStartup = WSAStartup(MAKEWORD(2,2), &winSockData);
if (iwsaStartup != 0)
{
printf("APICP: open_socket(): WSAStratup Failed\r\n");
}
//LOG_INFO("APICP: opensocket(): WSAStarup Success\r\n");
//STEP3: Socket UDPSocketClient Creation
UDPSocketClient = socket(AF_INET, SOCK_DGRAM, 0);
if (UDPSocketClient == INVALID_SOCKET)
{
printf("Socket creation failed with error: %d\r\n", WSAGetLastError());
WSACleanup();
return 1;
}
printf("La socket %d est ouverte en TCP/IP.\n", UDPSocketClient);
// on configure l'interface de connexion
IRMAServer.sin_addr.s_addr = inet_addr(Addr_TCP_IRMA); // adresse IP du serveur IRMA
IRMAServer.sin_family = AF_INET;
IRMAServer.sin_port = htons(Port_TCP_IRMA); // sin_port et sin_addr doivent être en Network Byte Order // htons() convertit
//un entier court depuis l'ordre des octets de l'hôte vers celuidu réseau (host to network short)
//printf("Connexion a %s sur le port %d\n", inet_ntoa(IRMAServer.sin_addr), htons(IRMAServer.sin_port));
if(connect(UDPSocketClient, (SOCKADDR*)&IRMAServer, iIRMAServerLen) != SOCKET_ERROR) // si le client réussit à se connecter au serveur
printf("Connexion a %s sur le port %d\n", inet_ntoa(IRMAServer.sin_addr), htons(IRMAServer.sin_port));
else
printf("Erreur de connexion.");
// on reçoit les données envoyées par le serveur
/*nOctetsRecus = recv(UDPSocketClient, buffer, 1024, 0);
if(nOctetsRecus != SOCKET_ERROR)
{
printf("%d octets ont ete recus\n", nOctetsRecus);
printf("texte recu : %s", buffer);
}
else
printf("Les donnees n'ont pas ete recues");*/
// le client envoie des données au serveur
URL="/1.0-PAI/PassengerCountingService/SubscribeAllData";
xml_data="<SubscribeRequest> <Client-IP-Address> <Value>192.168.X.X</Value> </Client-IP-Address> <ReplyPort></Value> </ReplyPort> <ReplyPath> <Value>C:\</Value> </ReplyPath> </SubscribeRequest>";
tailleBuffer = sprintf(buffer, " POST %s HTTP/1.1\r\nHost:192.168.0.168:5211\r\nAccept:text/xml\r\nContent-Type:text-xml\r\nContent-Length:1024\r\n\r\n%s"
,URL, xml_data);
nOctetsEnvoyes = send(UDPSocketClient, buffer, tailleBuffer, 0);
if(nOctetsEnvoyes != SOCKET_ERROR)
{
printf("%d octets envoyes au serveur\n", nOctetsEnvoyes);
printf("texte envoye : %s", buffer);
}
else
printf("Erreur : donnees non envoyees au serveur");
// on reçoit les données envoyées par le serveur
nOctetsRecus = recv(UDPSocketClient, buffer, 1024, 0);
if(nOctetsRecus != SOCKET_ERROR)
{
printf("%d octets ont ete recus\n", nOctetsRecus);
printf("texte recu : %s", buffer);
}
else
printf("Les donnees n'ont pas ete recues");
// on ferme la connexion
closesocket(UDPSocketClient);
WSACleanup(); // libère les ressources allouées par la fonction WSAStartup()
getchar();
return 0;
你知道为什么我有这个 ICMP 消息吗?
解决方案
只需通过端口 5211 通过 tcp 套接字发送此字符串:
POST /1.0-PAI/PassengerCountingService/SubscribeAllData HTTP/1.1
Host: SensorIP
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0
Accept: */*
Content-Type: text-xml
Content-Length: {strlen(THIS)}
<SubscribeRequest>
<Client-IP-Address>
<Value>{HostIP}</Value>
</Client-IP-Address>
<ReplyPort>
<Value>{YourReplyPort}</Value>
</ReplyPort>
<ReplyPath>
<Value>{YourReplyPath}</Value>
</ReplyPath>
</SubscribeRequest>
标题和内容之间是一个自由行,所以:\r\n\r\n
. 记得约Content-Length
。关于 HTTP 的基本信息:https ://www.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html
推荐阅读
- javascript - 将我的 Office 加载项发布到 Azure 时出现问题,Office.js 未完全加载错误,但从 localhost:3000 可以正常工作
- sql - 将一行与多行进行比较
- regex - grep - 模式作为变量
- email - o365 电子邮件帐户:以编程方式访问 Internet 标头中的别名
- c# - 如何从另一个类更新我的 UI 控件?
- django - Django:将 html 选项分配给模型
- sql - 合并 2 个带有时间戳的数据集作为唯一标识符(但它们不相同)
- c# - PowerBi API 发布行
- r - 如何使用Shell()在R中保存和关闭excel文件
- hadoop - sudo 纱线应用程序 -kill
认为我是用户 hdfs?