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) 编辑 收藏 举报