📄 c_http.h
字号:
/**
* 以各种方式调用HTTP请求
* Xu Lubing
* May 22, 2003
*/
#ifndef _C_HTTP_H
#define _C_HTTP_H
#include <stdio.h>
/* 请求方法定义 */
typedef enum {
M_GET,
M_POST,
M_HEAD
} REQUEST_METHOD_T;
typedef struct {
const char* errMsg; /* 错误原因,如果为NULL表示没有错误 */
char statusCode[4]; /* 响应状态码,如"200" */
char contentType[80]; /* 响应的类型,如"text/html" */
int contentLength; /* 响应内容长度,-1如果没有 */
char date[32]; /* 响应时服务器日期,可能没有 */
char server[80]; /* 服务器描述,可能没有 */
char lastModified[32]; /* 请求内容更新时间,可能没有 */
char location[1024]; /* 如果是Location,存放Location指明的内容,可能没有 */
#if defined(PROCESS_BODY)
int (*processResponseBody) /* 处理响应体的函数,可以传NULL,返回读取字节数 */
(
int hSocket, /* 请求的服务器的Socket句柄,只许用读操作,处理完后不能关闭 */
char* response, /* 存放响应结果的缓冲区 */
int size /* 缓冲区大小 */
);
#elif defined(PROCESS_EXTRA)
int respProcessed; /* 是否已经使用了响应结果缓冲区 */
char extraResp[1024]; /* 当响应结果缓冲区太小时使用 */
int (*processExtraResponse) /* 处理额外响应结果的处理函数,可以传NULL */
(
char* extraResp, /* 额外响应结果 */
int length, /* 可用的长度 */
int* respProcessed, /* 是否已经使用过响应结果 */
char* resp, /* 响应结果 */
int size /* 响应结果的长度 */
);
#endif
} HTTP_RESPONSE_HEADER_T;
#ifdef __cplusplus
extern "C" {
#endif
#if defined(PROCESS_BODY) || defined(PROCESS_EXTRA)
/**
* 初始化响应头,所有的数据都被清空。在调用任何函数前务必
* 调用。
*/
void initResponseHeader(HTTP_RESPONSE_HEADER_T* headers);
#endif
/**
* HTTP请求
* IN:
* url: HTTP的URL,可以带query_string('?'后面的部分),例:http://user:passwd@host:port/file?query
* method: 请求方式,M_GET、M_POST或者M_HEAD,分别代表"GET"、"POST"或者"HEAD"方式
* inHeaders: 请求头信息,如设置cookie的头信息,可以传NULL,格式是:"Header1: value1\nHeader2: value2",最后一个不加'\n'
* outHeaders: 响应的头信息,见HTTP_RESPONSE_HEADER_T定义,可以传NULL
* timeout: 访问超时秒数,传0使用缺省值
* response: 存放响应结果的内存区,如果是M_HEAD,可以传NULL
* size: response的空间大小,如果是M_HEAD,可以传0
* OUT:
* 0: 发生错误,错误原因可看headers中的errMsg
* >0: response中的有效字符数,这时headers中的errMsg为NULL
* 【注意】:response中不会添加字符串结束标志'\0',因为结果也可以是二进制内容
*/
int HTTPRequest(const char* url, REQUEST_METHOD_T method, const char* inHeaders, HTTP_RESPONSE_HEADER_T* outHeaders, int timeout, char* response, int size);
/**
* 以GET方式做HTTP请求
* IN:
* url: HTTP的URL,可以带query_string('?'后面的部分),例:http://user:passwd@host:port/file?query
* inHeaders: 请求头信息,如设置cookie的头信息,可以传NULL,格式是:"Header1: value1\nHeader2: value2",最后一个不加'\n'
* outHeaders: 响应的头信息,见HTTP_RESPONSE_HEADER_T定义,可以传NULL
* timeout: 访问超时秒数,传0使用缺省值
* response: 存放响应结果的内存区
* size: response的空间大小
* OUT:
* 0: 发生错误,错误原因可看headers中的errMsg
* >0: response中的有效字符数,这时headers中的errMsg为NULL
* 【注意】:response中不会添加字符串结束标志'\0',因为结果也可以是二进制内容
*/
int HTTPRequestGet(const char* url, const char* inHeaders, HTTP_RESPONSE_HEADER_T* outHeaders, int timeout, char* response, int size);
/**
* 以POST方式做HTTP请求
* IN:
* url: HTTP的URL,可以带query_string('?'后面的部分),例:http://user:passwd@host:port/file?query
* postBody: 需要通过POST方式传送的数据,如果为NULL,会传送url中的query_string部分
* bodyLen: postBody的长度,因为postBody可以是二进制内容,如果postBody为NULL时可传任意值
* inHeaders: 请求头信息,如设置cookie的头信息,可以传NULL,格式是:"Header1: value1\nHeader2: value2",最后一个不加'\n'
* outHeaders: 响应的头信息,见HTTP_RESPONSE_HEADER_T定义,可以传NULL
* timeout: 访问超时秒数,传0使用缺省值
* response: 存放响应结果的内存区
* size: response的空间大小
* OUT:
* 0: 发生错误,错误原因可看headers中的errMsg
* >0: response中的有效字符数,这时headers中的errMsg为NULL
* 【注意】:response中不会添加字符串结束标志'\0',因为结果也可以是二进制内容
*/
int HTTPRequestPost(const char* url, const char* postBody, int bodyLen, const char* inHeaders, HTTP_RESPONSE_HEADER_T* outHeaders, int timeout, char* response, int size);
/**
* 以HEAD方式做HTTP请求
* IN:
* url: HTTP的URL,可以带query_string('?'后面的部分),例:http://user:passwd@host:port/file?query
* inHeaders: 请求头信息,如设置cookie的头信息,可以传NULL,格式是:"Header1: value1\nHeader2: value2",最后一个不加'\n'
* outHeaders: 响应的头信息,见HTTP_RESPONSE_HEADER_T定义,必须不为NULL
* timeout: 访问超时秒数,传0使用缺省值
* OUT:
* 0: 发生错误,错误原因可看headers中的errMsg
* >0: 请求成功,这时headers中的errMsg为NULL,其余信息见headers中其它字段
*/
int HTTPRequestHead(const char* url, const char* inHeaders, HTTP_RESPONSE_HEADER_T* outHeaders, int timeout);
/* 测试用 */
void dumpResponseHeaders(HTTP_RESPONSE_HEADER_T* headers, FILE* out);
#ifdef __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -