这是最新(主)开发分支的文档。如果您正在查找以前版本的文档,使用左侧的下拉菜单选择所需的版本。

HTTP Client

概述

HTTP Client 提供了一些 API 用于完成 HTTP 协议请求,相关的响应会通过同步事件进行回调。进行 HTTP 请求的具体步骤如下:

  • wm_http_client_open_request():要使用 HTTP 客户端请求数据,我们首先要做的就是为请求分配适当的空间,并进行请求前的初始化工作。HTTP Client 提供了对应的 同步事件,用户可以在接口中定义自己的同步回调,便于用户去控制和操作自己的 HTTP 请求。具体同步事件如下:

    • WM_HTTP_EVENT_CONNECTED(HTTP 连接成功)

    • WM_HTTP_EVENT_DISCONNECTED(HTTP 断开连接)

    • WM_HTTP_EVENT_HEADER_SENTED(HTTP 请求头发送成功)

    • WM_HTTP_EVENT_RECV_HEADER(HTTP 接收到请求头信息)

    • WM_HTTP_EVENT_RECV_DATA(HTTP 接收到请求数据)

    • WM_HTTP_EVENT_FINISH(HTTP 请求完成)

  • wm_http_client_send_request():准备工作完成后,就可以进行 HTTP 请求,这里需要配置请求的 url,数据等内容。

  • wm_http_client_recv_response():一旦我们发出 HTTP 请求后,就会收到来自服务器的响应。我们调用该接口可以获取到请求头信息,通过解析请求头,我们可以获取到请求数据的类型,长度等信息。

  • wm_http_client_read_data():在调用了 wm_http_client_recv_response() 之后,我们调用该接口才能获取到请求的数据。

  • wm_http_client_close_request:当我们完成一次请求之后,我们需要关闭这次连接,并释放相应的资源。

应用实例

void wm_httpc_event_handle(uint32_t pSession, int event, void *param, void* priv)
{
    switch(event)
    {
        case WM_HTTP_EVENT_CONNECTED:
            wm_log_info("WM_HTTP_EVENT_CONNECTED");
            break;
        case WM_HTTP_EVENT_DISCONNECTED:
            wm_log_info("WM_HTTP_EVENT_DISCONNECTED");
            break;
        case WM_HTTP_EVENT_HEADER_SENTED:
            wm_log_info("WM_HTTP_EVENT_HEADER_SENTED");
            wm_log_info("%s", (char *)(((wm_http_event_param_t *)param)->data));
            break;
        case WM_HTTP_EVENT_RECV_HEADER:
            wm_log_info("WM_HTTP_EVENT_RECV_HEADER");
            wm_log_info("%s", (char *)(((wm_http_event_param_t *)param)->data));
            break;
        case WM_HTTP_EVENT_RECV_DATA:
            wm_log_info("WM_HTTP_EVENT_RECV_DATA");
            wm_log_info("%s", (char *)(((wm_http_event_param_t *)param)->data));
            break;
        case WM_HTTP_EVENT_FINISH:
            wm_log_info("WM_HTTP_EVENT_FINISH");
            break;
    }
    return;
}

uint32_t wm_httpc_example_send_req(wm_http_client_config_t *cfg, char *url, char *data, uint32_t len)
{
    int nRetCode;
    u32_t nSize, nTotal = 0;
    char *Buffer = NULL;
    wm_http_client_t session;

    do
    {
        Buffer = (char *)wm_os_malloc(HTTPC_CLIENT_BUFFER_SIZE);
        if (Buffer == NULL)
        {
            return HTTP_CLIENT_ERROR_NO_MEMORY;
        }
        memset(Buffer, 0, HTTPC_CLIENT_BUFFER_SIZE);

        // Open the HTTP request handle
        session = wm_http_client_open_request(cfg);
        if (!session)
        {
            nRetCode =  HTTP_CLIENT_ERROR_INVALID_HANDLE;
            break;
        }

        if ((nRetCode = wm_http_client_send_request(session, url, data, len, true, 0, 0)) != HTTP_CLIENT_SUCCESS)
        {
            break;
        }

        // Retrieve the the headers and analyze them
        if ((nRetCode = wm_http_client_recv_response(session, HTTPC_CLIENT_DEFAULT_TIMEOUT)) != HTTP_CLIENT_SUCCESS)
        {
            break;
        }
        wm_log_info("Start to receive data from remote server...");

        // Get the data until we get an error or end of stream code
        while (nRetCode == HTTP_CLIENT_SUCCESS || nRetCode != HTTP_CLIENT_EOS)
        {
            // Set the size of our buffer
            nSize = HTTPC_CLIENT_BUFFER_SIZE;
            // Get the data
            nRetCode = wm_http_client_read_data(session, Buffer, nSize, HTTPC_CLIENT_DEFAULT_TIMEOUT, &nSize);
            if(nRetCode != HTTP_CLIENT_SUCCESS && nRetCode != HTTP_CLIENT_EOS)
                break;
            nTotal += nSize;
        }
    } while(0);

    wm_os_free(Buffer);
    if(session)
        nRetCode = wm_http_client_close_request(&session);
    return nRetCode;
}

wm_http_client_config_t cfg = {0};
cfg.method = WM_HTTP_REQUEST_TYPE_GET;
cfg.event_handler = wm_httpc_event_handle;
wm_httpc_example_send_req(&cfg, "http://www.baidu.com/img/bdlogo.gif", NULL, 0);

HTTPS

HTTP Client 支持使用 mbedtls 的 SSL 连接,URL 以 https 开头即可使用 HTTPS 请求。