基于 mongoose HttpClient

3 篇文章 0 订阅
/*
 * Copyright (c) 2014 Cesanta Software Limited
 * All rights reserved
 *
 * This program fetches HTTP URLs.
 */
#include "mongoose.h"
#include <sstream>
static int s_exit_flag = 0;

#define POSTFIELDS1 "username=aitest&password=123456&manage=vip&rememberme=true&isApp=1"
#define POSTFIELDS2 "action=get_carer_psgs&lineId=2757&issueId=244&classesId=6006"
#define POSTFIELDS3 "imgName=/ossfs/cpn/user/psg_photo/20170904/05f9f6c9-5b72-41ff-a04e-5fda53fc994a_small.jpg"
#define CONTENTTYPE "Content-Type: application/x-www-form-urlencoded\r\n"
#define CONTENTTYPE1 "Content-Type: application/json;charset=utf-8\r\n"

#define  DEBUG  1



using namespace std;
string cookie;
struct mg_mgr mgr;

static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
    struct http_message *hm = (struct http_message *) ev_data;
    switch (ev) {
        case MG_EV_CONNECT:
            if (*(int *) ev_data != 0) {
                fprintf(stderr, "connect() failed: %s\n", strerror(*(int *) ev_data));
                s_exit_flag = 1;
            }
            break;
        case MG_EV_HTTP_REPLY://建立http服务器并收到数据
            switch(hm->resp_code){
                case 200://请求已成功
                {
#if DEBUG
//            fwrite(hm->message.p, 1, hm->message.len, stdout);
                    fwrite(hm->body.p, 1, hm->body.len, stdout);
                    //这是是接收到的数据
#endif
                    nc->flags |= MG_F_SEND_AND_CLOSE;
                    s_exit_flag = 1;
                    // 获取真正的cookie  必须使用
                    struct mg_str *cookie_header = mg_get_http_header(hm, "Set-Cookie");
                    if(cookie_header == nullptr){
                        return;
                    } else{
                        cookie.clear();
                        cookie.append(CONTENTTYPE);
                        cookie.append("Cookie:");
                        cookie.append(cookie_header->p,cookie_header->len);
                        cookie.append("\r\n");
                    }


                }
                    break;
                case 302://重定向 请求的资源临时从不同的 URI响应请求
                {
                    //获取设置Cookie头  可以不使用
#if COOKIE_HANDER
                    struct mg_str *cookie_header = mg_get_http_header(hm, "Set-Cookie");
                    cookie.clear();
                  cookie.append("Cookie:");
                   cookie.append(cookie_header->p,cookie_header->len);
                    cookie.append("\r\n");
#endif 
                    struct mg_str *url = mg_get_http_header(hm, "Location");
                    //获取 Location
                    string strURL;
                    strURL.append(url->p,url->len);
                    mg_connect_http(&mgr, ev_handler,strURL.c_str(), NULL, NULL);
                }
                    break;
                default:
                    break;
            }
            break;
        case MG_EV_CLOSE:
            if (s_exit_flag == 0) {
                printf("Server closed connection\n");
                s_exit_flag = 1;
            }
            break;
        default:
            break;
    }
}
void connectHhttp(const char* url,const char* contentType,const char* params){
    mg_connect_http(&mgr, ev_handler, url, contentType,params );//POST模拟表单提交
    while (s_exit_flag == 0) {
        mg_mgr_poll(&mgr, 1000);
    }
    s_exit_flag=0;//重置标志位
}
int main(int argc, char *argv[]) {
    mg_mgr_init(&mgr, NULL);
    connectHhttp( "http://127.0.0.1:8000/login", CONTENTTYPE,POSTFIELDS1 );
    connectHhttp( "http://127.0.0.1:8000/auth/api", cookie.c_str(),POSTFIELDS2);
    connectHhttp( "http://127.0.0.1:8000/getImg", cookie.c_str(),POSTFIELDS3 );

    mg_mgr_free(&mgr);
    return 0;
}

使用C++进行http通讯的过程中用过libcurl,后来发现mongoose 更加轻量,只需要 mongoose.h 和 mongoose.c就能够运行

特意写了一个简单的调用例子,实际使用中可以封装成一个Class 进行使用

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于mongoose的http服务是一种使用mongoose框架搭建的基于HTTP协议的服务器。Mongoose是一个轻量级的嵌入式Web服务器,它具有跨平台、高性能、低内存占用等特点,非常适合用来构建嵌入式系统或低功耗设备上的HTTP服务。 使用mongoose搭建http服务非常简单,只需几行代码即可实现一个基本的HTTP服务器。首先,我们需要引入mongoose模块,并创建一个Server对象: ``` var mongoose = require('mongoose'); var server = new mongoose.Server(); ``` 接下来,我们可以通过设置server的一些属性来配置HTTP服务器的行为,比如监听端口、设置回调函数等: ``` server.listen(8080, function() { console.log('Server is running on port 8080'); }); ``` 这样,我们就成功地创建了一个监听8080端口的HTTP服务器。当有HTTP请求到达时,服务器会触发回调函数,并对请求进行处理。我们可以在回调函数中添加业务逻辑,比如根据请求的URL返回相应的内容: ``` server.on('request', function(request, response) { // 处理HTTP请求 response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello, World!'); }); ``` 以上代码会将响应的Content-Type设置为text/plain,并返回一个简单的Hello, World!消息。 基于mongoose的http服务还支持其他一些高级的功能,比如路由、中间件等,可以帮助我们更好地组织和处理HTTP请求。除此之外,mongoose还提供了很多其他的组件和工具,可以帮助开发者更方便地构建各种类型的Web应用。 总之,基于mongoose的http服务是一种简单、高效的方式来构建基于HTTP协议的服务器,它提供了丰富的功能和工具,可以帮助我们快速开发各种类型的Web应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值