美文网首页
测试Protobuf在Http传输测试

测试Protobuf在Http传输测试

作者: fanlv | 来源:发表于2018-08-19 18:08 被阅读262次

    Demo:https://github.com/fanlv/ProtobufOnHttpGo

    一、编写Proto文件

    syntax = "proto3";
    
    // 生成go代码
    //protoc --go_out=. user.proto
    
    // 生成oc代码
    //protoc --objc_out=. user.proto
    
    package user;
    
    
    message LoginRequest {
      string username = 1;
      string password = 2;
    }
    
    message BaseResponse{
      int64 code = 1;
      string msg = 2;
    }
    
    
    message User{
        string uid = 1;
        string name = 2;
        string logo = 3;
    }
    message LoginResponse {
        User user = 1;
        BaseResponse baseResp = 255;
    }
    

    二、生成目标项目代码

    // cd 到user.proto文件目录
    // 生成go代码
    //protoc --go_out=. user.proto
    
    // 生成oc代码
    //protoc --objc_out=. user.proto
    

    三、服务端测试代码

    r.POST("/login", func(c *gin.Context) {
        body, err := c.GetRawData()
        if err == nil {
            req := &user.LoginRequest{}
            err = proto.Unmarshal(body, req)
            if err == nil {
                if req.Username == "admin" && req.Password == "123456" {
                    err = nil
                } else {
                    err = errors.New("login fail")
                }
            } else {
                fmt.Print(err.Error())
            }
        }
        var req *user.LoginResponse
        if err == nil {
            req = &user.LoginResponse{
                User: &user.User{
                    Uid:  "0010",
                    Name: "admin",
                    Logo: "url",
                },
                BaseResp: &user.BaseResponse{
                    Code: 1,
                    Msg:  "ok",
                },
            }
        } else {
            req = &user.LoginResponse{
                User: nil,
                BaseResp: &user.BaseResponse{
                    Code: 100,
                    Msg:  "login fail",
                },
            }
        }
    
        out, err := proto.Marshal(req)
        if err == nil {
            c.Data(200, "application/x-protobuf", out)
        }
    })
    

    四、客户端测试代码

    NSDate *startDate = [NSDate date];
    LoginRequest *req = [[LoginRequest alloc] init];
    req.username = @"admin";
    req.password = @"123456";
    [self postUrl:@"http://127.0.0.1:8080/login" dataBody:[req data] Completetion:^(id result, NSError *error) {
        if (!error && [result isKindOfClass:[NSData class]]) {
            NSData *data = (NSData *)result;
            NSError *pError;
            LoginResponse *resp = [[LoginResponse alloc] initWithData:data error:&pError];
            if (!pError) {
                NSDate *endDate1 = [NSDate date];
                _infolabel.text = [NSString stringWithFormat:@"数据大小 : %.3f KB, 请求耗时:%f",[data length]/1000.0,[endDate1 timeIntervalSinceDate:startDate]];
                _textView.text = resp.description;
            }
        }
    }];
    

    Done

    相关文章

      网友评论

          本文标题:测试Protobuf在Http传输测试

          本文链接:https://www.haomeiwen.com/subject/yxzciftx.html