Delphi处理Http请求自定义Header
在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 := BeforePost;
通过替换的方式把原来的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): boolean;
var
url, content: string;
begin
result := false;
try
url := Format(URL_AltPass, [FWebSite, oldPass, newPass]);
content := GetResponseContent(url);
result := GetResponseState(content);
except
SetLastError('网络故障,更改用户密码失败!');
end;
end;
procedure TDataSync.BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
const
csCustomHeader =
'Content-Type: application/x-www-form-urlencoded; charset=UTF-8';
begin
HttpAddRequestHeaders(Data, PChar(csCustomHeader), Length(csCustomHeader),
HTTP_ADDREQ_FLAG_REPLACE);
end;
function TDataSync.GetResponseContentPost(url: string;
const DataMsg: String): string;
var
strStream, strSend: TStringStream;
begin
result := '';
strStream := TStringStream.Create('', TEncoding.UTF8);
strSend := TStringStream.Create(DataMsg, TEncoding.UTF8);
try
FHttpReq.url := url;
FHttpReq.OnBeforePost := BeforePost;
FHttpReq.Execute(strSend, strStream);
result := strStream.DataString;
except
SetLastError('无效数据包,可能网络故障!');
end;
strStream.Free;
strSend.Free;
end;
// 重载简单接口调用
function TDataSync.GetResponseContent(url: string): string;
begin
result := GetResponseContentPost(url, '');
end;
function TDataSync.GetResponseState(strResponse: string): boolean;
var
code: string;
jo: ISuperObject;
begin
result := false;
if strResponse = '' then
begin
SetLastError('服务端无响应当前服务请求!');
exit;
end;
jo := TSuperObject.ParseString(PWideChar(strResponse), false);
if jo = nil then
exit;
if jo['flag'] = nil then
begin
SetLastError('未知的服务响应!');
exit;
end;
code := jo['flag'].AsString;
result := (code = QUERY_SUCC) or (code = OP_SUCC);
if jo['info'] <> nil then
SetLastError(jo['info'].AsString)
else
begin
if code = 'EMPLOYEECODE_EXIST' then
SetLastError('工号已存在')
else if code = 'EXCEED_MORE_THAN_LIMIT' then
SetLastError('超过公司的总人数')
else
SetLastError(code);
end;
end;
{ ------------------------------------------------------------------------------ }
constructor TDataSync.Create(AOwner: TSWObject; url, dicURL: string);
begin
inherited Create(AOwner);
FWebSite := url;
FDicSite := dicURL;
FHttpReq := THTTPReqResp.Create(AOwner);
FHttpReq.UseUTF8InHeader := true;
end;
destructor TDataSync.Destroy();
begin
FHttpReq.Free;
inherited;
end;
Delphi处理Http请求自定义Header的更多相关文章
- 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互
[源码下载] 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互 作者: ...
- 原创:【ajax | axios跨域简单请求+复杂请求】自定义header头Token请求Laravel5后台【亲测可用】
如标题:我想在ajax的header头增加自定义Token进行跨域api认证并调用,api使用laravel5编写,如何实现? 首先,了解下CORS简单请求和复杂请求. -- CORS简单请求 -- ...
- Feign 自定义编码器、解码器和客户端,Feign 转发请求头(header参数)、Feign输出Info级别日志
Feign 的编码器.解码器和客户端都是支持自定义扩展,可以对请求以及结果和发起请求的过程进行自定义实现,Feign 默认支持 JSON 格式的编码器和解码器,如果希望支持其他的或者自定义格式就需要编 ...
- 解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题
1. 问题 由于在http请求头的头部中设置了一些自定义字段,刚好这些字段中含有下划线,比如bundle_name这种,后端在进去获取头部信息时,发现取不到对应的值 2. 原因及解决办法 分析 首先看 ...
- python3使用requests模块完成get/post/代理/自定义header/自定义Cookie
一.背景说明 http请求的难易对一门语言来说是很重要的而且是越来越重要,但对于python一是urllib一些写法不太符合人的思维习惯文档也相当难看,二是在python2.x和python3.x中写 ...
- python3 get/post/使用代理/自定义header/自定义Cookie
说明:urllib发送http请求并不是很人性化,更推荐使用在urllib基础上封装的.python2和python3都兼容的requests模块,移步查看. 一.get请求 get请求就是在构造Re ...
- 使用Typescript重构axios(五)——实现基础功能:处理请求的header
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- js ajax设置和获取自定义header信息的方法总结
目录 1.js ajax 设置自定义header 1.1 方法一: 1.2 方法二: 2.js ajax 获取请求返回的response的header信息 3.js ajax 跨域请求的情况下获取自定 ...
- jquery + node 通过 CORS 实现跨域访问,支持cookie和自定义header
跨域有多种方式,现在的情况看来还是CORS更适合一些,有很多优点,比如浏览器正式支持.支持post.可以控制跨域访问的网站等. 我们来看看node如何实现cors方式的跨域.在网上找到了一些代码,考过 ...
随机推荐
- 【转】BASE64编码简介
BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据. 这是一种可逆的编码方式. 编码后的数据是一个字符串,其中包含的字符为:A-Z.a-z.0-9.+./ 共64个字符:26 ...
- (3)HomeAssistant 连接MQTT
整体说明 1 自己在阿里云上搭建MQTT服务器 2 自己笔记本电脑windos10搭建HASS,配置参数连接阿里云服务器 3 手机下载MQTT调试助手,当测试端 4手机当终端---阿里云MQTT--- ...
- day04--流程控制之if
编程的目的是让计算机像人脑一样工作,因此就需要让计算机具备人脑一样的逻辑思维,这里就需要用到计算机语言的流程控制: 流程控制之if......else 语法1: if 条件: 代码块 # 一组代码块的 ...
- slf4j+logback搭建超实用的日志管理模块
文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们 ...
- [转]qtcreator中常用快捷键总结
F1 查看帮助 F2 跳转到函数定义(和Ctrl+鼠标左键一样的效果) Shift+F2 声明和定义之间切换 F4 头文件和源文件之间切换 Ctrl+ 欢迎模式 Ctrl+ 编辑模式 Ctrl+ 调试 ...
- 这款 WordPress商用插件 0day 漏洞满满,且已遭利用
Wordfence 安全研究员发布报告称,WordPress 商用插件 Total Donations 受多个 0day 漏洞的影响,且这些漏洞已遭利用. 这些严重的漏洞影响所有已知的 Total D ...
- 项目Alpha冲刺 1
作业描述 课程: 软件工程1916|W(福州大学) 作业要求: 项目Alpha冲刺(团队) 团队名称: 火鸡堂 作业目标: 进行github实战训练,锻炼团队合作能力 1.团队信息 队名:火鸡堂 队员 ...
- @synchronized深入理解
@synchronized是线程同步锁,易用.可读性高. @synchronized(self) { 临界区 } 利用如下命令将其重写 clang -rewrite-objc file 得到C++实 ...
- React-使用react-redux
react-redux可以方便在react中使用redux,我们就可以忘记subscribe,只需要记住reducer,action和dispatch就可以了.react-redux提供Provide ...
- 在angularjs实现一个时钟
想在网页上,显示当前系统时钟. <body ng-app="App2" ng-controller="Ctrl2"> <div ng-bind ...