2015这一年的进步

很快地一年过去了,这年我在编程方面有什么进步,我想写下来,今年没怎么看书,孩子仍然也没得到,只是程序技术方面进步了,我学会了用tinyxml和gsoap和REST SDK类库,今年还发现POCO库比较好用的,我已经编译了几个POCO了,按网上的例子。至于BOOST库还没怎么玩。C++学会了int main函数来测试函数是否运行正确。

首先让我写一下TINYXML和GSOAP的例子吧,我学会了结合OPENSSL可以调用HTTPS的SOAP的WEB SERVICE

另外多谢很多网友帮过我,包括GSOAP的作者(虽然他没有完全将答案给我,但他叫我遇到问题要多看说明书),还有QQ里GSOAP的Q群里朋友,还有很多写过GSOAP博客的人对我很大帮助,没有这些支持我没可能做出下面的东西的。首先,GSOAP要支持中文的话要改一下 typemap.dat,将所有char * 或者 string 定义为 wchar_t 或者 wstring 这样就可以支持中文UTF-8

如果要 支持OPENSSL 就要预编译头那里加 "WITH_OPENSSL" 以及链接库里加入 “libeay32.lib” 和 “ssleay32.lib

然后像网上很多例子那样

wsdl2h -o message.h http://xxxx/rcx?WSDL

soapcpp2 -C message.h

下面

 

 setlocale(LC_ALL, "");
    
    
     soap_ssl_init();
    
      struct soap soap;
     soap_init(&soap);
    
    // if (soap_ssl_client_context(&soap, SOAP_SSL_DEFAULT, NULL, NULL, "d:\\my.crt", NULL, NULL ))
     if (soap_ssl_client_context(&soap, SOAP_SSL_SKIP_HOST_CHECK, NULL, NULL, NULL, NULL, NULL ))
      {
          stringstream strstream;
          soap_stream_fault(&soap,strstream);
          const string str=strstream.str();
          write_text_to_log_file( str );
          exit(1);

       }
         _ns1__login  request;
      _ns1__loginResponse  response;
     
       char *endpoint = "https://xxxxx/services/CommFileService?wsdl";
      string xmlstr="";
      const char * thestr="PASSWORD";
      buildloginxml(username,password,thestr,xmlstr);
      if (xmlstr=="err")
          return -1;
      wchar_t * dtypestr=L"XML";
      request.dType=dtypestr;
      wchar_t *  ywflstr=L"XMLPROCESSOR";
      request.ywfl=ywflstr;
      wchar_t *  fnstr=L"FN1";
      request.fn=fnstr;

       const char * myxmlcstyle=xmlstr.c_str();
       wchar_t * myxmlcstylew = new wchar_t[strlen(myxmlcstyle) + 1];
       mbstowcs_s(NULL, myxmlcstylew, strlen(myxmlcstyle) + 1, myxmlcstyle, strlen(myxmlcstyle));
       request.args=myxmlcstylew;

      int  returncode=0;

    //  soap_set_imode(&soap, SOAP_C_UTFSTRING);  //input
    //  soap_set_omode(&soap, SOAP_C_UTFSTRING);  //output
      string myfhz,mymsg,mysession;

       if ( soap_call___ns1__login(&soap, endpoint, NULL, &request,  response) != SOAP_OK)
      {
          stringstream strstream;
          soap_stream_fault(&soap,strstream);//这是可以把错误信息拿出来的办法
          const string str=strstream.str();
           write_text_to_log_file( str );
          returncode=-4;
      }
      else
      {

//把代码转回char *
         TiXmlDocument doc;
         const wchar_t * filedatewstr=response.return_;
         int utf8Size = WideCharToMultiByte(CP_UTF8, 0, filedatewstr, -1, NULL, 0, NULL, false);
         char* filedate = new char[utf8Size+1];
         WideCharToMultiByte(CP_UTF8, 0, filedatewstr, -1, filedate, utf8Size, NULL, false);
         doc.Parse(filedate, 0, TIXML_ENCODING_UTF8);
        
          TiXmlElement *pRoot, *pParm,  *pApp,*pbody ;
          pRoot = doc.FirstChildElement( "hnisi" );
          if ( pRoot )
           {
               pbody= pRoot->FirstChildElement( "body" );

               if(pbody)
               {
                     pParm= pbody->FirstChildElement( "params" );

                    if(pParm)
                    {
                       pApp = pParm->FirstChildElement("param" );
                       while(pApp)
                       {
                   
                          string mykey=pApp->Attribute("key");

                           if(mykey=="FHZ")
                              myfhz=pApp->Attribute("val");
                           else if(mykey=="MSG")
                           {
                              mymsg=pApp->Attribute("val");
                              if(myfhz!="1")
                               write_text_to_log_file( mymsg );

                           }
                            else if(mykey=="SESSIONID")

                            mysession=pApp->Attribute("val");

                           pApp = pApp->NextSiblingElement( "param" );
                       }
                    }
                    else
                      returncode=-10;
               }
               else
                     returncode=-10;
            //
              
           }
          else
                 returncode=-10;
       }
       
        soap_destroy(&soap);
        soap_end(&soap);
        soap_done(&soap);     

        return 0;

 

另外还收获了微软的 REST SDK,这个类库延用微软的一向风格易用,VS是世界上最好的IDE,这句一点也不夸张,类库不用你去折腾去编译,自动下载下来,微软的东西超级棒。一定要VS2013和版本2.5以后的版本或者以上才在XP支持HTTPS。

但是由于MSDN上的都是C++11 LAMBDA的例子,我开始吓坏了,怎么这种语法?我吓得好几个月没看它,原来这是异步,直到后来在网上找到“同步”的例子,“同步”并不需要LAMBDA语法,我自己也找了些项目测试过这个库,没有大规模测试

wchar_t * cpusnw = new wchar_t[strlen(cpuids.c_str()) + 1];
    mbstowcs_s(NULL, cpusnw, strlen(cpuids.c_str()) + 1, cpuids.c_str(), strlen(cpuids.c_str()));

    try
    {
        json::value obj;
        obj[L"username"] = json::value::string(usernamew);
        obj[L"pass"] = json::value::string(passw);
        obj[L"cpusn"] = json::value::string(cpusnw);
        http_response response = client.request(methods::POST, builder.to_string(), obj.serialize(), L"application/json").get();
        if (response.status_code() == status_codes::OK)
        {
            try
            {
                const json::value & jv = response.extract_json().get();
                const web::json::object &jobj = jv.as_object();
                int returncode = jobj.at(L"returncode").as_integer();
                wstring errtext = jobj.at(L"errortext").as_string();
                if (returncode != 0)
                {
                    if (errtext.size() != 0)
                    {
                        std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> converter(new std::codecvt<wchar_t, char, std::mbstate_t>("CHS"));
                        std::string narroerr = converter.to_bytes(errtext);
                        expmsg = new char[strlen(narroerr.c_str()) + 1];
                        strcpy_s(expmsg, strlen(narroerr.c_str()) + 1, narroerr.c_str());
                    }

                    return -4;
                }
                return 0;

            }
            catch (const std::exception &e)
            {
                write_text_to_log_file(e.what());
                return -6;
            }
        }
        else
            return -3;

    }
    catch (const std::exception &e)
    {
        write_text_to_log_file(e.what());
        return -6;,
    }

 

另外今年也收获了LIBXL,由于使用很简单,也不在这里写例子。

今年也学习了一下JAVA,我用JAVA 写了个RESTFUL WEB服务,但这是现在还没能跑起来,地址在这

https://github.com/abcdef123ghi/jerseytest

一直出现404,让网友看了一下说我是配置文件没配置好,明年要把这个代码改好让它可以运行。

我有个堂妹是华南理工(国家名牌大学之一)软件专业出来的,现在招去了腾讯了,我问她这个怎样改,她连看都不看直接拒绝了,这个世界真冷漠,这么亲的亲戚也不帮我,但居然网友肯帮我,这个世界太奇怪了。

另外我也不满意ANDROID手机的VPN功能,每次要登陆都要设个密码,自己写了一个,只写了界面部分,内部代码还没写,明年也想把这个项目完成了

我明年会彻底抛弃.NET,为什么微软的东西这么好我还要抛弃呢?因为我觉得微软做得太自动化,我如果长此以往不会进步。.NET的东西除了旧项目还维护以外,新项目我尽量不用.NET。我要转去JAVA 写JAVAEE 即网叶 和WEB SERVICE,还要学会开发ANDROID手机程序,如果时间来得及也要学一下SWIFT学苹果开发。总之2016向JAVA和开源进军。

posted on 2015-12-27 18:31  redmondfans  阅读(517)  评论(1编辑  收藏  举报