#ifndef __HTTP_REQUEST_H__

#define __HTTP_REQUEST_H__

#include "cocos2d.h"

#include "ExtensionMacros.h"

NS_CC_EXT_BEGIN

class CCHttpClient;

class CCHttpResponse;

typedef void (CCObject::*SEL_HttpResponse)(CCHttpClient* client, CCHttpResponse* response);

#define httpresponse_selector(_SELECTOR) (cocos2d::extension::SEL_HttpResponse)(&_SELECTOR)

/**

@brief defines the object which users must packed for CCHttpClient::send(HttpRequest*) method.

Please refer to samples/TestCpp/Classes/ExtensionTest/NetworkTest/HttpClientTest.cpp as a sample

@since v2.0.2

*/

class CCHttpRequest : public CCObject

{

public:

/** Use this enum type as param in setReqeustType(param) */

typedef enum

{

kHttpGet,

kHttpPost,

kHttpPut,

kHttpDelete,

kHttpUnkown,

} HttpRequestType;

/** Constructor

Because HttpRequest object will be used between UI thead and network thread,

requestObj->autorelease() is forbidden to avoid crashes in CCAutoreleasePool

new/retain/release still works, which means you need to release it manually

Please refer to HttpRequestTest.cpp to find its usage

*/

CCHttpRequest()

{

_requestType = kHttpUnkown;

_url.clear();

_requestData.clear();

_tag.clear();

_pTarget = NULL;

_pSelector = NULL;

_pUserData = NULL;

};

/** Destructor */

virtual ~CCHttpRequest()

{

if (_pTarget)

{

_pTarget->release();

}

};

/** Override autorelease method to avoid developers to call it */

CCObject* autorelease(void)

{

CCAssert(false, "HttpResponse is used between network thread and ui thread \

therefore, autorelease is forbidden here");

return NULL;

}

// setter/getters for properties

/** Required field for HttpRequest object before being sent.

kHttpGet & kHttpPost is currently supported

*/

inline void setRequestType(HttpRequestType type)

{

_requestType = type;

};

/** Get back the kHttpGet/Post/... enum value */

inline HttpRequestType getRequestType()

{

return _requestType;

};

/** Required field for HttpRequest object before being sent.

*/

inline void setUrl(const char* url)

{

_url = url;

};

/** Get back the setted url */

inline const char* getUrl()

{

return _url.c_str();

};

/** Option field. You can set your post data here

*/

inline void setRequestData(const char* buffer, unsigned int len)

{

_requestData.assign(buffer, buffer + len);

};

/** Get the request data pointer back */

inline char* getRequestData()

{

return &(_requestData.front());

}

/** Get the size of request data back */

inline int getRequestDataSize()

{

return _requestData.size();

}

/** Option field. You can set a string tag to identify your request, this tag can be found in HttpResponse->getHttpRequest->getTag()

*/

inline void setTag(const char* tag)

{

_tag = tag;

};

/** Get the string tag back to identify the request.

The best practice is to use it in your MyClass::onMyHttpRequestCompleted(sender, HttpResponse*) callback

*/

inline const char* getTag()

{

return _tag.c_str();

};

/** Option field. You can attach a customed data in each request, and get it back in response callback.

But you need to new/delete the data pointer manully

*/

inline void setUserData(void* pUserData)

{

_pUserData = pUserData;

};

/** Get the pre-setted custom data pointer back.

Don't forget to delete it. HttpClient/HttpResponse/HttpRequest will do nothing with this pointer

*/

inline void* getUserData()

{

return _pUserData;

};

/** Required field. You should set the callback selector function at ack the http request completed

*/

CC_DEPRECATED_ATTRIBUTE inline void setResponseCallback(CCObject* pTarget, SEL_CallFuncND pSelector)

{

setResponseCallback(pTarget, (SEL_HttpResponse) pSelector);

}

inline void setResponseCallback(CCObject* pTarget, SEL_HttpResponse pSelector)

{

_pTarget = pTarget;

_pSelector = pSelector;

if (_pTarget)

{

_pTarget->retain();

}

}

/** Get the target of callback selector funtion, mainly used by CCHttpClient */

inline CCObject* getTarget()

{

return _pTarget;

}

/* This sub class is just for migration SEL_CallFuncND to SEL_HttpResponse,

someday this way will be removed */

class _prxy

{

public:

_prxy( SEL_HttpResponse cb ) :_cb(cb) {}

~_prxy(){};

operator SEL_HttpResponse() const { return _cb; }

CC_DEPRECATED_ATTRIBUTE operator SEL_CallFuncND()   const { return (SEL_CallFuncND) _cb; }

protected:

SEL_HttpResponse _cb;

};

/** Get the selector function pointer, mainly used by CCHttpClient */

inline _prxy getSelector()

{

return _prxy(_pSelector);

}

/** Set any custom headers **/

inline void setHeaders(std::vector<std::string> pHeaders)

{

_headers=pHeaders;

}

/** Get custom headers **/

inline std::vector<std::string> getHeaders()

{

return _headers;

}

protected:

// properties

HttpRequestType             _requestType;    /// kHttpRequestGet, kHttpRequestPost or other enums

std::string                 _url;            /// target url that this request is sent to

std::vector<char>           _requestData;    /// used for POST

std::string                 _tag;            /// user defined tag, to identify different requests in response callback

CCObject*          _pTarget;        /// callback target of pSelector function

SEL_HttpResponse            _pSelector;      /// callback function, e.g. MyLayer::onHttpResponse(CCHttpClient *sender, CCHttpResponse * response)

void*                       _pUserData;      /// You can add your customed data here

std::vector<std::string>    _headers;      /// custom http headers

};

NS_CC_EXT_END

#endif //__HTTP_REQUEST_H__


HttpRequest的更多相关文章

  1. .net学习笔记----HttpRequest,WebRequest,HttpWebRequest区别

    WebRequest是一个虚类/基类,HttpWebRequest是WebRequest的具体实现 HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所 ...

  2. 防刷票机制研究和.NET HttpRequest Proxy

    最近应朋友之约 测试他做的投票网站 防刷票机制能力如何,下面有一些心得和体会. 朋友网站用PHP写的,走的是HttpRequest,他一开始认为IP认证应该就差不多了.但说实话这种很low,手动更换代 ...

  3. python httprequest, locust

    r = self.client.get("/orders", headers = {"Cookie": self.get_user_cookie(user[0] ...

  4. c# WebBrower 与 HttpRequest配合 抓取数据

    今天研究一个功能,发现一个问题. 通过webbrower模拟用户自动登录可以完成,并且可以取到相对应的页面内容. 但是如果页面中通过ajax,动态加载的内容,这种方式是取不到的,于是用到了httpRe ...

  5. Asp.net中HttpRequest.Params与Reques.Item之异同

    今天才注意到HttpRequest.Params与HttpRequest.Item这两个玩意竟然有微妙的不同.上午的时候同事被坑了发现这玩意的说明还真微妙. 场景再现: 前台提交一个POST请求到后台 ...

  6. HttpRequest重写,解决资源战胜/链接超时/分块下载事件通知 问题。

    /************************************************************************************** 文 件 名: WebRe ...

  7. 对象化的Http和请求对象HttpRequest

    在面向对象的语言中,有种“万物皆对象”的说法.在上篇文章中介绍了HttpRuntime类,在该类收到请求之后,立即通过HttpWorkerRequest工作者对象对传递的参数进行分析和分解,创建方便网 ...

  8. ASP.Net核心对象HttpRequest

    描述context. Request["username"]; 通过这种方式,能够得到一个HttpRequest对象.HttpRequest对象描述了,关于请求的相关信息,我们可以 ...

  9. .net学习笔记----HttpRequest类

    一.HttpRequest的作用 HttpRequest的作用是令到Asp.net能够读取客户端发送HTTP值.比如表单.URL.Cookie传递过来的参数. 返回字符串的那些值就不说了,那些基本上都 ...

  10. Win7下 httpRequest带证书请求https网站

    常规情况下创建Web请求,并获取请求数据的代码如下: WebRequest req = WebRequest.Create(url); req.Timeout = 15000; WebResponse ...

随机推荐

  1. crtmpserver流媒体服务器的介绍与搭建

    crtmpserver流媒体服务器的介绍与搭建 (2012-02-29 11:28) 标签:  crtmpserver  C++ RTMP Server  rtmp  Adobe FMS(Flash ...

  2. JAVA模块化

    今天转载JAVA模块化系列的三篇文章. 在过去几年,Java模块化一直是一个活跃的话题.从JSR 277(现已废止)到JSR 291,模块化看起来是Java进化过程中的必经一环.即便是基于JVM的未来 ...

  3. SharePoint 2010中列表Add和Delete事件解析

    转:http://winsystem.ctocio.com.cn/26/11400026_2.shtml [IT专家网独家撰稿]SharePoint 2010与以前的版本相比,天翻地覆的变化并不为过. ...

  4. 【转】STL空间配置器

    STL空间配置器(allocator)在所有容器内部默默工作,负责空间的配置和回收.STL标准为空间配置器定义了标准接口(可见<STL源码剖析>P43).而具体实现细节则由各编译器实现版本 ...

  5. Python抓取单个网页中所有的PDF文档

    Github博文地址,此处更新可能不是很及时. 1.背景 最近发现算法以及数据结构落下了不少(其实还是大学没怎么好好学,囧rz),考虑到最近的项目结构越来越复杂了,用它来练练思路,就打算复习下数据结构 ...

  6. CAKeyframeAnimation

    之所以叫做关键帧动画是因为,这个类可以实现,某一属性按照一串的数值进行动画,就好像制作动画的时候一帧一帧的制作一样. 一般使用的时候  首先通过 animationWithKeyPath 方法 创建一 ...

  7. 《Python CookBook2》 第一章 文本 - 改变多行文本字符串的缩进 && 扩展和压缩制表符(此节内容待定)

    改变多行文本字符串的缩进 任务: 有个包含多行文本的字符串,需要创建该字符串的一个拷贝.并在每行行首添加或者删除一些空格,以保证每行的缩进都是指定数目的空格数. 解决方案: # -*- coding: ...

  8. virtualbox虚拟机中mysql远程连接登陆报2003错误的解决方法

    最近在virtualbox中安装了Ubuntu 14,配置了一个mysql server,设置的桥接网络模式.在其他电脑连接的时候,总是报2003错误.开始以为是localhost没有置换为%,运行u ...

  9. .net mvc HtmlHelper扩展使用

    如果是你是从webform开始接触.net,你应该记得webform开发中,存在自定义控件这东西,它使得我们开发起来十分方便,如今mvc大势所趋,其实在mvc开发时,也存在自定义控件这么个东西,那就是 ...

  10. JEE , EJB概念深入概括

    说起EJB,不得不提JEE,java EE 英文全称为:java Enterprise Edition企业级应用的软件架构,是一种思想,也是一种规范,方便从事这方面的开发者以及开发厂商进行规范性的开发 ...