使用Poco库编写一个简单的http客户端原理

来源:互联网 发布:ps淘宝调色 编辑:程序博客网 时间:2024/05/29 17:39


1. 发起一个GET请求

 

//使用给定的服务器ip 和端口实例化一个http客户端类,但并没建立连接.

HTTPClientSession session(hostIPPort); 

 

//建立一个请求类,但也没有真正连接,path是请求的路径,如果请求http://192.168.4.19:8000/radapi10/userauth.htm那么这时string path=/radapi10/userauth.htm

HTTPRequest request(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);

 

//创建一个类接收返回的数据

HTTPResponse response;

 

//发起post请求,这时才真正开始建立连接,所是有可能会抛Poco::Exception

session.sendRequest(request);

 

//接收服务器反回的数据

std::istream& rs = session.receiveResponse(response);

 

//取得返回响应码及对应的解释信息如:200 OK/401 Unauthorized:请求未经授

std::cout << response.getStatus() << " " << response.getReason()<< std::endl;

 

//把数据从服务器响应的数据流里读取出来,这里是定到显示器,应该也可以写到文件或其它流,但没有试过。

StreamCopier::copyStream(rs, std::cout);

 

//一个完整的会话结束,如果没有exception发生,所有session/request/response都可以循环使用。如果发生了则要调用 session.reset()关闭套按字。

 

2. 发起一个POST请求.

//使用给定的服务器ip 和端口实例化一个http客户端类,但并没建立连接.

HTTPClientSession session(hostIPPort); 

 

//建立一个请求类,但也没有真正连接,path是请求的路径,如果请求http://192.168.4.19:8000/radapi10/userauth.htm那么这时string path=/radapi10/userauth.htm

HTTPRequest request(HTTPRequest::HTTP_POST, path, HTTPMessage::HTTP_1_1);

 

//设置内容编码,纯文本格式,也可以设置为JSON,text/xml等

request.setContentType("application/x-www-form-urlencoded");

 

//设置内容的长度,mystr是我们要发送的字串

request.setContentLength( (int)mystr.length() );

 

//取得服务器io流,发送出去

std::ostream& send = session.sendRequest(request);

send <<mystr<<flush;//发送出去

 

//取得服务器返回的流,并读出其中数据

std::istream& res = session.receiveResponse(response);//receiveResponse(...)返回一个输入流的引用,用法见下句

res.read(buffer,1024);//buffer为数据缓冲区

Cout<<buffer<<endl;

 

l POST和GET一样,session,request和response都是可以循环使用的。

l 注意:sendRequestreceiveResponse才是真正连接服务器,所以是有可能会抛Poco::Exception

 

l virtual std::ostream& sendRequest(HTTPRequest& request);

把http请求头发送到session指定的服务器.HTTPClientSession会设置好主机名keep-alive属性。返回的ostream直到receiveResponse()调用或者session销毁前都是可用的。

 

l void reset();

重置会话session并且关闭socket,即使设置了长连接下一次请求(sendRequest)也会重新建立连接.

如果你想循环使用某个session,或者保持长连接,那么在receiveResponse()和sendRequest()发生抛出异常或相应的流不可用时请调用此函数。如果不再使用这个会话,可以不用管它。

0 0
原创粉丝点击