在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的更多相关文章

  1. 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

    [源码下载] 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互 作者: ...

  2. 原创:【ajax | axios跨域简单请求+复杂请求】自定义header头Token请求Laravel5后台【亲测可用】

    如标题:我想在ajax的header头增加自定义Token进行跨域api认证并调用,api使用laravel5编写,如何实现? 首先,了解下CORS简单请求和复杂请求.  -- CORS简单请求 -- ...

  3. Feign 自定义编码器、解码器和客户端,Feign 转发请求头(header参数)、Feign输出Info级别日志

    Feign 的编码器.解码器和客户端都是支持自定义扩展,可以对请求以及结果和发起请求的过程进行自定义实现,Feign 默认支持 JSON 格式的编码器和解码器,如果希望支持其他的或者自定义格式就需要编 ...

  4. 解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题

    1. 问题 由于在http请求头的头部中设置了一些自定义字段,刚好这些字段中含有下划线,比如bundle_name这种,后端在进去获取头部信息时,发现取不到对应的值 2. 原因及解决办法 分析 首先看 ...

  5. python3使用requests模块完成get/post/代理/自定义header/自定义Cookie

    一.背景说明 http请求的难易对一门语言来说是很重要的而且是越来越重要,但对于python一是urllib一些写法不太符合人的思维习惯文档也相当难看,二是在python2.x和python3.x中写 ...

  6. python3 get/post/使用代理/自定义header/自定义Cookie

    说明:urllib发送http请求并不是很人性化,更推荐使用在urllib基础上封装的.python2和python3都兼容的requests模块,移步查看. 一.get请求 get请求就是在构造Re ...

  7. 使用Typescript重构axios(五)——实现基础功能:处理请求的header

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  8. js ajax设置和获取自定义header信息的方法总结

    目录 1.js ajax 设置自定义header 1.1 方法一: 1.2 方法二: 2.js ajax 获取请求返回的response的header信息 3.js ajax 跨域请求的情况下获取自定 ...

  9. jquery + node 通过 CORS 实现跨域访问,支持cookie和自定义header

    跨域有多种方式,现在的情况看来还是CORS更适合一些,有很多优点,比如浏览器正式支持.支持post.可以控制跨域访问的网站等. 我们来看看node如何实现cors方式的跨域.在网上找到了一些代码,考过 ...

随机推荐

  1. [Oracle] ROWNUM和分页

    rownum是oracle的一个伪劣,它的顺序依据从表中获取记录的顺序递增,这里要注意的是:由于记录在表中是无序存放的.因此你无法通过简单的rownum和order by的组合获得相似TOP N的结果 ...

  2. Kmeans基本思想

    https://blog.csdn.net/zjc_game_coder/article/details/78595833 Kmeans算法的基本思想:看如下图: 解决小样本 .非线性及高维模式识别问 ...

  3. java 迭代器遍历List Set Map

    Iterator接口: 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现Iterator接口的对象 Iterator对象称作为迭代器,用以方便的对容器内元素的遍历 ...

  4. Oracle 在存储过程或函数中执行字符串sql

    有时,我们需要在存储过程或函数中根据条件拼凑一些sql字符串语句,然后再执行拼凑后的sql字符串,如何做到呢? 参考以下代码: FUNCTION CALCULATE_TARGET_SCORE (CUR ...

  5. bat无故报错打印混乱的解决

    1. 下面语句加了一个无意义的ping操作.不加的时候经常报错,报操作数不是数字,实际上打印发现NOW值和格式并没有错误.怀疑是下面操作数太多了,而执行速度又太快,导致执行时总是很容易出错.通过增加一 ...

  6. C# 异步上传图片案例

    好久没写博客了,都感觉自己快堕落了!今天随性写一篇关于异步上传图片的程序及插件! 说是程序及插件,其实程序占大头,所谓的插件只是两个JS.分别为:jquery.html5upload.js 和 jqu ...

  7. [Spark][Python]Spark Join 小例子

    [training@localhost ~]$ hdfs dfs -cat people.json {"name":"Alice","pcode&qu ...

  8. pyenv+virtual 笔记

    Pyenv + virtualEnv 设置 安装这两个组件是为了适应不同版本的python在同一个系统下的运行:例如现在最明显就是python2.7和python3.6的两个版本,很多库依旧是使用了P ...

  9. 对于ps基本操作的归纳

    1.开始新的制作 1)新建 快捷键:Ctrl+n      格式:宽高根据要求自选:颜色模式常用R(红)G(绿)B(蓝) 2)打开电脑上的图片 快捷键:Ctrl+o 2.选框工具 快捷键:M 作用:能 ...

  10. 微信小程序开发工具 ubuntu linux版本

    安装 http://blog.csdn.net/zhangyingguangails/article/details/72517182 sudo apt install wine sudo git c ...