• 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和开源进军。

  • 相关阅读:
    大数据技术
    大数据技术
    大数据技术
    设计模式之代理模式
    大数据技术
    大数据技术
    大数据技术
    Intellij IDEA 解决 Maven 依赖下载慢的问题
    大数据技术
    QUdpSocket Class
  • 原文地址:https://www.cnblogs.com/redmondfan/p/5080564.html
Copyright © 2020-2023  润新知