消息具有标题部分和由空行分隔的消息正文。即使没有消息正文,也总是需要空白行。标题以命令开头,并且具有由冒号和空格分隔的其他键值对。如果有一个消息体,它可以是您想要的任何内容。
标题中的行和标题末尾的空白行必须以carraige返回和换行符对结束(请参阅HTTP标题行中断样式),这就是为什么这些行在末尾有\ r \ n的原因。
URL的格式为 http://host:port/path?query_string
向网站提交请求有两种主要方式:GET:查询字符串是可选的,但如果指定,则必须相当短。因此,标题可能只是GET命令而没有别的。示例消息可以是:GET /path?query_string HTTP/1.0\r\n
\r\n
POST:通常在查询字符串中的内容是在邮件正文中。因此,标头需要包含Content-Type:和Content-Length:属性以及POST命令。示例消息可以是:POST /path HTTP/1.0\r\nContent-Type: text/plain\r\nContent-Length: 12\r\n
\r\n
query_string
所以,回答你的问题:如果您对POSTing to感兴趣的URL是http://api.somesite.com/apikey=ARG1&command=ARG2那么没有正文或查询字符串,因此没有理由发布POST,因为那里没有什么可以放在消息的正文中,所以没有什么可以放在Content-Type:和Content-Length中:
如果你真的想,我猜你可以发帖。在这种情况下,您的消息将如下所示:POST /apikey=ARG1&command=ARG2 HTTP/1.0\r\n
\r\n
所以要发送C程序需要的消息:创建一个套接字
查找IP地址
打开插座
发送请求
等待回应
关闭插座
发送和接收呼叫不一定发送/接收您提供的所有数据 - 它们将返回实际发送/接收的字节数。您可以在循环中调用它们并发送/接收消息的其余部分。
我在这个示例中没有做的是任何类型的真实错误检查 - 当出现故障时我只退出程序。请让我知道这对你有没有用:#include /* printf, sprintf */#include /* exit */#include /* read, write, close */#include /* memcpy, memset */#include /* socket, connect */#include /* struct sockaddr_in, struct sockaddr */#include /* struct hostent, gethostbyname */void error(const char *msg) { perror(msg); exit(0); }int main(int argc,char *argv[]){
/* first what are we going to send and where are we going to send it? */
int portno = 80;
char *host = "api.somesite.com";
char *message_fmt = "POST /apikey=%s&command=%s HTTP/1.0\r\n\r\n";
struct hostent *server;
struct sockaddr_in serv_addr;
int sockfd, bytes, sent, received, total;
char message[1024],response[4096];
if (argc "); exit(0); }
/* fill in the