Delphi-----接口请求,Get与Post
标签:final 密码 exception nil test returns source Opens host
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
///
/// 把JSON转换为ULR的参数
///
///
///
function TranferJsonAsUrlParam(aJsonParam: ISuperObject): string;
{ Private declarations }
///
/// get请求
///
/// 接口地址
/// 接口请求的参数
/// 接口返回值
///
function HttpRequestByGet(aUrl: string; aJsonParam: ISuperObject; var aResponse: string): Boolean;
///
/// post请求
///
/// 接口地址
/// 接口请求的参数
/// 接口返回值
/// 基本验证的用户名,可选
/// 基本验证的密码,可选
///
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‘] = ‘1000‘ 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 := 5000; //请求超时设置
tmpHttp.HandleRedirects := True;
if UpperCase(Copy(aUrl, 1, 5)) = ‘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‘] = ‘1000‘ 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, 2, Length(sSource) - 2);
sltTemp := TStringList.Create;
sUrlParams := ‘‘;
try
sltTemp.DelimitedText := sSource;
sltTemp.Delimiter := ‘,‘;
for i := 0 to sltTemp.Count - 1 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‘] := ‘123456‘;
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‘] := ‘123456‘;
if not HttpRequestByPost(sUrl, soParam, sResponse) then
begin
ShowMessage(‘接口请求失败‘);
Exit;
end;
soResponse := SO(sResponse);
ShowMessage(IntToStr(soResponse.I[‘age‘]));
end;
end.
Delphi-----接口请求,Get与Post
标签:final 密码 exception nil test returns source Opens host
原文地址:https://www.cnblogs.com/wangxiaoxiao77/p/12071997.html
评论