Delphi-----接口请求,Get与Post
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, superobject, IdHTTP, IdSSLOpenSSL, StdCtrls; const
//几个常量
CONTENT_TYPE_XML = 'application/xml';
CONTENT_TYPE_JSON = 'application/json'; type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
/// <summary>
/// 把JSON转换为ULR的参数
/// </summary>
/// <param name="aJsonParam"></param>
/// <returns></returns>
function TranferJsonAsUrlParam(aJsonParam: ISuperObject): string;
{ Private declarations }
/// <summary>
/// get请求
/// </summary>
/// <param name="aUrl">接口地址</param>
/// <param name="aJsonParam">接口请求的参数</param>
/// <param name="aResponse">接口返回值</param>
/// <returns></returns>
function HttpRequestByGet(aUrl: string; aJsonParam: ISuperObject; var aResponse: string): Boolean;
/// <summary>
/// post请求
/// </summary>
/// <param name="aUrl">接口地址</param>
/// <param name="aJsonParam">接口请求的参数</param>
/// <param name="aResponse">接口返回值</param>
/// <param name="aUserName">基本验证的用户名,可选</param>
/// <param name="aPassword">基本验证的密码,可选</param>
/// <returns></returns>
function HttpRequestByPost(aUrl: string; aJsonParam: ISuperObject; var aResponse: string;
aUserName: string = ''; aPassword: string = ''): Boolean;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} { TForm1 } function TForm1.HttpRequestByGet(aUrl: string; aJsonParam: ISuperObject; var aResponse: string): Boolean;
var
tmpHttp: TIdHTTP;
ResponseStream: TStringStream;
soResult: ISuperObject;
sUrl, sUrlParam: string;
begin
Result := False;
aResponse := '';
tmpHttp := TIdHTTP.Create(nil);
tmpHttp.Request.ContentType := CONTENT_TYPE_JSON;
//以流的方式发起请求
sUrlParam := TranferJsonAsUrlParam(aJsonParam);
sUrl := aUrl + '?' + sUrlParam;
ResponseStream := TStringStream.Create('');
try
try
tmpHttp.Get(sUrl, ResponseStream);
soResult := SO(UTF8Decode(ResponseStream.DataString));
//返回的标准JSON格式 如果成功,固定返回ecode = 1000 ,如果失败,则错误信息记录在msg中
//{
// "ecode": "1000",
// "msg": "操作成功",
// "data": {
// "age": 18
// }
//} if soResult.S['ecode'] = '' then
begin
aResponse := soResult.S['data'];
Result := True;
end
else
begin
aResponse := soResult.S['msg'];
end;
except
on e: Exception do
begin
aResponse := e.Message;
Result := False;
end;
end;
finally
FreeAndNil(tmpHttp);
FreeAndNil(ResponseStream);
end;
end; function TForm1.HttpRequestByPost(aUrl: string; aJsonParam: ISuperObject;
var aResponse: string; aUserName, aPassword: string): Boolean;
var
tmpHttp: TIdHTTP;
RequestStream: TStringStream; //请求信息
ResponseStream: TStringStream; //返回信息
soResult: ISuperObject;
io: TIdSSLIOHandlerSocketOpenSSL;
begin
{
400错误原则上应该是传上去的数据不符合平台的要求导致的,目前总结有以下几种可能性:
1、启用基础验证,如TOKEN,没有传验证参数
2、PostData传入的XML不符合上游接口的规则
解决方案最简单,与接口方联机调试。很重要!!!
}
Result := False;
aResponse := ''; tmpHttp := TIdHTTP.Create(nil);
tmpHttp.ReadTimeout := ; //请求超时设置
tmpHttp.HandleRedirects := True;
if UpperCase(Copy(aUrl, , )) = 'HTTPS' then
begin
io := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
tmpHttp.HandleRedirects := False;
tmpHttp.IOHandler := io;
end;
tmpHttp.Request.ContentType := CONTENT_TYPE_JSON;
tmpHttp.Request.Accept := CONTENT_TYPE_JSON; //如果请求需要做基本验证,验证失败会返回http 400错误
if aUserName <> '' then
begin
tmpHttp.Request.Username := aUserName;
tmpHttp.Request.Password := aPassword;
tmpHttp.Request.BasicAuthentication := True;
end; RequestStream := TStringStream.Create('');
ResponseStream := TStringStream.Create('');
try
try
//平台以JSON方式接收参数
RequestStream.WriteString(UTF8Encode(AnsiToUtf8(aJsonParam.AsJSon())));
tmpHttp.Post(AUrl, RequestStream, ResponseStream);
soResult := SO(UTF8Decode(ResponseStream.DataString));
//返回的标准JSON格式 如果成功,固定返回ecode = 1000 ,如果失败,则错误信息记录在msg中
//{
// "ecode": "1000",
// "msg": "操作成功",
// "data": {
// "age": 18
// }
//}
if soResult.S['ecode'] = '' then
begin
aResponse := soResult.S['data'];
Result := True;
end
else
begin
aResponse := soResult.S['msg'];
end; except
on e: Exception do
begin
Result := False;
end;
end;
finally
FreeAndNil(tmpHttp);
FreeAndNil(ResponseStream);
FreeAndNil(RequestStream);
end;
end; function TForm1.TranferJsonAsUrlParam(aJsonParam: ISuperObject): string;
var
sSource, sUrlParams, sParam: string;
sltTemp: TStringList;
i: Integer;
begin
Result := '';
//只能做一层转换,如果里面还包含有JSON子集,待扩展
sSource := UTF8Encode(AnsiToUtf8(aJsonParam.AsJSon()));;
sSource := StringReplace(sSource, '"', '', [rfReplaceAll]);
sSource := Copy(sSource, , Length(sSource) - );
sltTemp := TStringList.Create;
sUrlParams := '';
try
sltTemp.DelimitedText := sSource;
sltTemp.Delimiter := ',';
for i := to sltTemp.Count - do
begin
sParam := StringReplace(sltTemp[i], ':', '=', []);
if sUrlParams <> '' then sUrlParams := sUrlParams + '&';
sUrlParams := sUrlParams + sParam;
end;
Result := sUrlParams;
finally
sltTemp.Free;
end;
end; procedure TForm1.Button1Click(Sender: TObject);
var
sUrl: string;
soParam, soResponse: ISuperObject;
sResponse: string;
begin
sUrl := 'http://localhost/index.php';
soParam := SO();
soParam.S['userName'] := 'aaa';
soParam.S['password'] := ''; if not HttpRequestByGet(sUrl, soParam, sResponse) then
begin
ShowMessage('接口请求失败');
Exit;
end; soResponse := SO(sResponse);
ShowMessage(IntToStr(soResponse.I['age'])); end; procedure TForm1.Button2Click(Sender: TObject);
var
sUrl: string;
soParam, soResponse: ISuperObject;
sResponse: string;
begin
sUrl := 'http://localhost/index.php';
soParam := SO();
soParam.S['userName'] := 'aaa';
soParam.S['password'] := ''; if not HttpRequestByPost(sUrl, soParam, sResponse) then
begin
ShowMessage('接口请求失败');
Exit;
end; soResponse := SO(sResponse);
ShowMessage(IntToStr(soResponse.I['age'])); end; end.
Delphi-----接口请求,Get与Post的更多相关文章
- Postman - 功能强大的 API 接口请求调试和管理工具
Postman 是一款功能强大的的 Chrome 应用,可以便捷的调试接口.前端开发人员在开发或者调试 Web 程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的 Fi ...
- xmlrpc实现bugzilla api调用(无会话保持功能,单一接口请求)
xmlrpc实现bugzilla4 xmlrpc api调用(无会话保持功能,单一接口请求),如需会话保持,请参考我的另外一篇随笔(bugzilla4的xmlrpc接口api调用实现分享: xml ...
- Loadrunner模拟JSON接口请求进行测试
Loadrunner模拟JSON接口请求进行测试 一.loadrunner脚本创建 1.Insert - New step -选择Custom Request - web_custom_re ...
- SoapUI接口测试·第一个HTTP Request接口请求和断言
一.新建SOAP项目 [File]-[New SOAP Project],在[Project Name]输入{工程名},点击[OK]. 二.新建TestSuite 选中项目,右键选择[New Te ...
- zw版_Halcon图像库delphi接口文件
zw版_Halcon图像库delphi接口文件 Halcon图像库delphi接口文件,根据安装时用户设置的文件目录不同,会有所差异,笔者一般安装在delphi的import目录下. 参见:& ...
- Facebook Graph API 接口请求
Graph API 调试器 这两天因项目需求,在调试FB的接口.项目的应用在FB上面.L特傻.没有区分FB的api的使用方式. 因为应用是在FB上面的.所以在登录应用的时候,就已经登录了FB平台.对于 ...
- 四、VueJs 填坑日记之搭建Axios接口请求工具
上一章,我们认识了项目的目录结构,以及对项目的目录结构做了一些调整,已经能把项目重新跑起来了.今天我们来搭建api接口调用工具Axios.Vue本身是不支持ajax调用的,如果你需要这些功能就需要安装 ...
- (C#)日志接口请求响应时间
日志接口响应时间,记录接口请求信息,响应结果以及响应时间等.可以清楚的分析和了解接口状态. 如果一个一个地在接口下面做日志,那不是我们想要的结果.所以,我们选择做一个特性来控制接口要不要记录请求响应日 ...
- Vue + webpack 项目配置化、接口请求统一管理
准备工作 需求由来: 当项目越来越大的时候提高项目运行编译速度.压缩代码体积.项目维护.bug修复......等等成为不得不考虑而且不得不做的问题. 又或者后面其他同事接手你的模块,或者改你的bug ...
- 【转】js生成接口请求参数签名加密
js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...
随机推荐
- 4、Shiro之IniRealm以及用户登录认证,角色认证,权限认证
1.我们在项目test文件夹下面新建resourse文件夹并将她设置为资源文件夹: 2.在resourse文件夹下面新建user.ini文件 user.ini文件里面声明一个用户: 先写一个用户标签[ ...
- 在JavaScript中引用类型和值类型的区别
一.存储方式不一样 基本数据类型 变量存储的是简单的数据段,存储的是具体的值,是轻量级的数据存储方式 引用类型 引用类型的值,可以由多个值构成的对象,引用类型的变量存储的是对象引用地址.引用类型是重量 ...
- 阶段3 1.Mybatis_03.自定义Mybatis框架_7.自定义Mybatis的编码-实现基于注解配置的查询所有
注解的方式,这里进行修改.上面注释的是原来xml的方式. 在dao类里面加上注解 创建注解类 声明注解的生命周期为Runntime 改变注解出现的位置,在Mehtod方法上 写完之后这里就不报错了. ...
- JS中设置cookie,读取cookie,删除cookie
在开发时,碰到一个需求,需要保存一个表的信息(非隐私),希望下次打开还存在.于是想到用cookie,一番折腾完成.示例数据都是假的,打马赛克是怕泄密. 这个表取名为Data,为Array,每一行是一个 ...
- Shiro Demo 示例(SpringMVC-Mybatis-Shiro-redis)
Shiro Demo 准备工作 运行前申明 请看完本页面的所有细节,对你掌握这个项目来说很重要,别一上来就搞,你不爽,我也不爽. 本项目需要一定的Java功底,需要对SpringMvc,Mybatis ...
- ugui拖拽
整理了下以前写的 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityE ...
- dotnet core排序异常,本地测试和linux上结果不一致
根据汉字排序,本地测试结构正常,发到docker之后,发现汉字升序降序和本地相反,检查代码后,没找到任何可能出现问题的点. 然后去翻文档:字符串比较操作 看到了这一句,会区分区域性 然后猜测应该是do ...
- Ubuntu新建用户以及安装pytorch
环境:Ubuntu18,Python3.6 首先登录服务器 ssh username@xx.xx.xx.xxx #登录一个已有的username 新建用户 sudo adduser username ...
- 关于BeautifulSoup4 解析器的说明
一.解析器概述 如同前几章笔记,当我们输入: soup=BeautifulSoup(response.body) 对网页进行析取时,并未规定解析器,此时使用的是python内部默认的解析器“html. ...
- 浅谈JVM及原理
前言 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点. 运行流程 我们都 ...