using namespace std;
using namespace cocos2d::network;
using namespace rapidjson;//json的操作 头文件盒命名解析
using namespace tinyxml2;//xml操作头文件盒命名空间
//网络请求数据
//Get
void httpGet()
{
HttpRequest * request = new HttpRequst();//一个网络请求
request->setUrl("http://42.96.151.161:83/service/userlogin?user_name=test12&user_password=123456");
//指定资源的位置get形势的 数据接在url后面 安全性低 数据量小 方便快捷
request->setRequestType(cocos2d::network::HttpRequst::Type::GET);//指明请求的类型
request->setTag(“requestget”);//指定tag
requst->setResponseCallback(CC_CALLBACK_2(HelloWorld::httpcallback,this));//指定请求成功或者失败调用的函数
//HttpCllient 在我们第一次请求的时候,会创建一个队列,并创建一个线程,线程指定的函数会查看队列有没有请求,如果有请求,线程会帮我们做网络请求,最后调用我们指定的httpcallback
HttpClient::getInstance()->send(request);
//进行网络请求 send中会retain一次。
request->release();//马上执行的语句
}
//Post
void HelloWorld::httpPost()
{
HttpRequest * request=new HttpRequest();
request->setUrl(“http://42.96.151.161:83/service/userlogin?”);
request->setRequestType(cocos2d::network::HttpRequest::Type::POST);
__String * str=__String::createWithFormat(“user_name=test12&user_password=123456”);
request->setRequestData(str->getCString(), str->length());
request->setTag(“httpPost”);
request->setResponseCallback(CC_CALLBACK_2(HelloWorld::httpcallback, this));
//安全数据量大
HttpClient::getInstance()->setTimeoutForConnect(30);//设置连接的超时时间
HttpClient::getInstance()->setTimeoutForRead(30);//设置读取数据的超时时间
HttpClient::getInstance()->send(request);
request->release();
}
//数据请求的回调函数
void HelloWorld::httpcallback(HttpClient* client, HttpResponse* response)
{
if (!response)
{
return;
}
/*
1xx:指示信息--表示请求已接受,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
*/
log(“%li”,response->getResponseCode());
if (response->getResponseCode()==200)//200代表成功
{
HttpRequest * request=response->getHttpRequest();
log("%s",request->getTag());
std::vector<char>*data=response->getResponseData();//获取服务器返回的数据
for (int i=0; i<data->size(); i++)
{
cout<<data->at(i);
}
cout<<endl;
}
}
//UserDefault存储数据
void HelloWorld::userDefault()
{
UserDefault * d=UserDefault::getInstance();//单例
// 存储数据
// d->setIntegerForKey(“int1”, 10);
// d->setStringForKey(“string1”, “string1”);
// d->setBoolForKey(“bool1”, true);
// d->setDoubleForKey(“double1”, 10.0);
// d->flush();//强制写入文件 这些数据会写入到com.neworigin.httpdemo.plist
//log("%s",FileUtils::getInstance()->fullPathForFilename("HelloWorld.png").c_str());
log("%i",d->getIntegerForKey("int1"));//如果没有,输出0
log("%i",d->getIntegerForKey("int2",10));//如果没有,输出10
log("%s",FileUtils::getInstance()->getWritablePath().c_str());//获取可读可写路径document data/data/com/neworigin/httpdemo/
if (d->getBoolForKey("musicion",true))
{
//checkbox 是选中的状态
}
else
{
//checkbox 是非选中的状态
}
}
//解析前
copyFile(“Chapters.xml”);//拷贝chapters.xml到可读可写的路径下
//文件复制
void HelloWorld::copyFile(std::string name)
{
string path1=FileUtils::getInstance()->fullPathForFilename(name);//.app 文件全路径
string path2=FileUtils::getInstance()->getWritablePath()+name;//获得可读可写的文件夹 +name
log(“%s”,path1.c_str());
log(“%s”,path2.c_str());
if (!FileUtils::getInstance()->isFileExist(path2))//在可读可写文件夹中没有文件
{
string data=FileUtils::getInstance()->getStringFromFile(path1);
FILE * file=fopen(path2.c_str(), "w");//以写的方式打开文件(“w”) 如果文件不存在会创建文件
fputs(data.c_str(), file);//写入内容
fclose(file);//关闭文件
}
}
//xml解析
void HelloWorld::xmlDemo()
{
tinyxml2::XMLDocument doc;//document对象,可以对xml字符串进行解析
//获得xml字符串
string path= FileUtils::getInstance()->getWritablePath()+"Chapters.xml";
string data=FileUtils::getInstance()->getStringFromFile(path.c_str());
//使用document对象解析字符串
doc.Parse(data.c_str());
//判断解析是否成功
if (doc.Error())
{
return;
}
//获取值
XMLElement * rootElement=doc.RootElement();
XMLElement * element1_1=rootElement->FirstChildElement();
log(“%s”,element1_1->Value());
XMLElement * element1_1_1=element1_1->FirstChildElement();
log(“%s”,element1_1_1->Value());
log(“%s”,element1_1_1->GetText());
XMLElement * element1_1_2=element1_1_1->NextSiblingElement();
log(“%s”,element1_1_2->Value());
log(“%s”,element1_1_2->GetText());
XMLElement * element1_2=rootElement->FirstChildElement();
XMLElement * element1_2_1=element1_2->NextSiblingElement()->FirstChildElement();
log("%s",element1_2_1->Value());
log("%s",element1_2_1->GetText());
//修改
XMLElement * ele=doc.RootElement()->FirstChildElement()->FirstChildElement()->NextSiblingElement();//<Number>1</Number>
XMLNode * node=ele->FirstChild();
node->SetValue("2");
doc.SaveFile(path.c_str());
//添加
XMLElement * myelement=doc.NewElement("levels");//<levels></levels>
XMLText * text=doc.NewText("1");
myelement->LinkEndChild(text);
doc.RootElement()->FirstChildElement()->InsertAfterChild(ele, myelement);//InsertAfterChild函数的调用者是想添加元素的父元素 第一个参数是在哪个元素之后添加我们指定的元素 第二个参数是需要添加的元素
doc.SaveFile(path.c_str());//保存到文件
//删除
doc.DeleteNode(ele);//删除指定的文件
doc.SaveFile(path.c_str());//保存到文件
}
//json解析
void HelloWorld::jsonDemo()
{
rapidjson::Document doc;//创建一个docunment对象
//doc.Parse<<#unsigned int parseFlags#>>(<#const Ch *str#>)//会开新空间
std::string path=FileUtils::getInstance()->getWritablePath()+”Data.json”;
std::string data=FileUtils::getInstance()->getStringFromFile(path.c_str());
doc.ParseInsitu<rapidjson::kParseInsituFlag>((char *)data.c_str());//在原空间操作 在原内存直接解析 这一步运行完成 就解析完成
if(doc.HasParseError())//查看是否有错误
{
return;
}
if (doc.HasMember("username"))//有没有这个元素
{
log("%s",doc["username"].GetString());
}
if (doc.HasMember("costume"))
{
if (doc["costume"].IsObject())
{
if (doc["costume"].HasMember("clothing"))
{
log("%s",doc["costume"]["clothing"].GetString());
}
}
}
if (doc.HasMember("costume"))
{
if (doc["costume"].IsObject())
{
if (doc["costume"].HasMember("headpiece"))
{
log("%s",doc["costume"]["headpiece"].GetString());
}
}
}
if (doc.HasMember("weapon"))
{
if (doc["weapon"].IsArray())
{
int i=0;
log("%i",doc["weapon"][i].GetInt());
}
}
//修改
__String * str=__String::createWithFormat("username");
doc["username"].SetString(str->getCString(), str->length());//这样只是对doc对象中的数据修改了
doc.AddMember("hp", "10", doc.GetAllocator());//添加一个元素
doc.RemoveMember("levels");//删除元素
//保存
rapidjson::StringBuffer buffer;//用来放doc内容 字符串形势的
rapidjson::Writer<rapidjson::StringBuffer>write(buffer);//可以把doc内容 改为字符串形势写入到buffer里面
doc.Accept(write);//将doc内容写入到buffer
FILE * file=fopen(path.c_str(), "w");
if (file)
{
fputs(buffer.GetString(), file);
fclose(file);
}
}