如何使用465端口发送邮件WinInet的API来发送一个HTTP POST请求在Delphi-delphi

问题: delphi中使用HTTP(TIDHttp)控件,怎么使用POST的异步方式?
delphi中使用HTTP控件,怎么使用POST的异步方式?即怎么控制post方法的同步或异步调用?解决方案1:
在HTTP的Content中设置:
&&Keep-Live&:&False&;
解决方案2:
偶也想研究这块
解决方案3:
可以用独立线程封装,这样不就可以了?
_____________________
comment&by&Liu&Yang
http://lysoft.7u7.net
解决方案4:
indy&控件(版本9以前),只能用阻塞(同步)方式。具体可以看《Indy&in&Depth》
Indy10有无改变不清楚。
以上介绍了“ delphi中使用HTTP(TIDHttp)控件,怎么使用POST的异步方式?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/3682444.html
上一篇: 下一篇:在HTTP请求中,get方法是默认的,但在URL地址长度是有限的,请求方法能传送的数据也是有限的,一般get方法传递的数据不能大于2KB,当get请求方法传递的数据长度不能满足需求时,就需要采用另一种请求方法post,读取post方法传递过来的数据时,需要采用form方法来获取;post方法提交请求时,地址栏看不到传送过来的参数数据,更加有利于页面的安全,所以一般情况采用post方法传送页面数据。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS5中最大量为100KB。
由于目前后台的接口采用的是Servlet来响应HTTP请求,所有的请求也必须遵循javaee servlet的规范。在Servlet 2.3及以后的版本中,已经默认增加了Filter处理,所以如果要在Servlet中的request对象能够自动读取post form的数据要满足以下条件:
1.request是HTTP/HTTPS request
2.HTTP method是POST。
3.content type是application/x-www-form-urlencoded。
在Delphi中有很多实体类可以实现HTTP请求,但比较方便的就是使用THTTPReqResp,比较原始的TIdHTTP类(需要自行管理cookie的值)。
因为THTTPReqResp自动封装了请求的细节处理,可以省去很多麻烦,特别是对Cookie的管理,但该对象发送请求的时候Header默认的content-type="text/xml"
所以要修改请求头的content-type才可以可以服务器端接收到post的数据。
要实现自定义Header需要在OnBeforePost事件中重定义Header信息
FHttpReq.OnBeforePost := BeforeP
通过替换的方式把原来的content-type改为想要的结果:
HttpAddRequestHeaders(Data, PChar(csCustomHeader), Length(csCustomHeader),
HTTP_ADDREQ_FLAG_REPLACE);
详细的代码如下:
{ -------------------------------------------------------------------------------
TDataSync.ModPassword
oldPass:原密码
newPass:新密码
true表示成功;false表示失败,失败时可以通过GetLastError获得错误信息
------------------------------------------------------------------------------- }
function TDataSync.ModPassword(oldPass, newPass: string):
url, content:
url := Format(URL_AltPass, [FWebSite, oldPass, newPass]);
content := GetResponseContent(url);
result := GetResponseState(content);
SetLastError('网络故障,更改用户密码失败!');
procedure TDataSync.BeforePost(const HTTPReqResp: THTTPReqR Data: Pointer);
csCustomHeader =
'Content-Type: application/x-www-form- charset=UTF-8';
HttpAddRequestHeaders(Data, PChar(csCustomHeader), Length(csCustomHeader),
HTTP_ADDREQ_FLAG_REPLACE);
function TDataSync.GetResponseContentPost(url:
const DataMsg: String):
strStream, strSend: TStringS
result := '';
strStream := TStringStream.Create('', TEncoding.UTF8);
strSend := TStringStream.Create(DataMsg, TEncoding.UTF8);
FHttpReq.url :=
FHttpReq.OnBeforePost := BeforeP
FHttpReq.Execute(strSend, strStream);
result := strStream.DataS
SetLastError('无效数据包,可能网络故障!');
strStream.F
// 重载简单接口调用
function TDataSync.GetResponseContent(url: string):
result := GetResponseContentPost(url, '');
function TDataSync.GetResponseState(strResponse: string):
jo: ISuperO
if strResponse = '' then
SetLastError('服务端无响应当前服务请求!');
jo := TSuperObject.ParseString(PWideChar(strResponse), false);
if jo = nil then
if jo['flag'] = nil then
SetLastError('未知的服务响应!');
code := jo['flag'].AsS
result := (code = QUERY_SUCC) or (code = OP_SUCC);
if jo['info'] && nil then
SetLastError(jo['info'].AsString)
if code = 'EMPLOYEECODE_EXIST' then
SetLastError('工号已存在')
else if code = 'EXCEED_MORE_THAN_LIMIT' then
SetLastError('超过公司的总人数')
SetLastError(code);
{ ------------------------------------------------------------------------------ }
constructor TDataSync.Create(AOwner: TSWO url, dicURL: string);
inherited Create(AOwner);
FWebSite :=
FDicSite := dicURL;
FHttpReq := THTTPReqResp.Create(AOwner);
FHttpReq.UseUTF8InHeader :=
destructor TDataSync.Destroy();
FHttpReq.F
阅读(...) 评论()| Copyright &
. All Rights Reserved .

我要回帖

更多关于 使用javamail发送邮件 的文章

 

随机推荐