前言:

1、公司delphi7开发的传统软件还活得好好的,但是大家都知道delphi早已经日落西山了,现在成了后进、追随者。细细算了已经6、7不用了。新的delphixe7呢,没有时间成本去适应和研究。

由于大量使用了第3方的组件和控件,想升级估计是吃力不讨好的事情...

2、保留原有代码,开发新功能可调用远程主机(云主机)的REST ful风格的api,使用Json交换数据。这样就赶上了新潮流,复活了。

由于网上搜索了很多次,发现符合需求的文章很少,这里记录下来,授人以鱼吧。

  • delphi7使用Json
  • delphi7使用msxml 的“IXMLHttpRequest”对象实现发起 Http post get请求,并传递Json。
  • delphi7使用base64编码图片通过Json传递

以下是关键代码:

(1)msxml,SuperObject(第3方,delphi7不自带), EncdDecd 的引用

(2)XMLHttpRequest的使用:

//提交会员开卡信息
procedure TFormMakeCard.btnOKClick(Sender: TObject);
var
url: string;
resultJson,paramsJson: ISuperObject;
begin
if (CheckInput) then
begin
HttpReq := CoXMLHTTPRequest.Create;
//两种提交请求的方式:Get和Post,Get是通过URL地址传递参数如果是中文需要转码,需要添加时间戳 Post不需要添加时间戳
//get url := 'http://localhost:5269/api/webmemberapi/NewMemberRegister?timestamp='+inttostr(Windows.GetTickCount);
url := 'http://localhost:5269/api/webmemberapi/NewMemberRegister?';
HttpReq.open('Post', url, False, EmptyParam, EmptyParam);
//http post
HttpReq.setRequestHeader('Accept', 'application/json');
HttpReq.setRequestHeader('Content-Type', 'application/json');
//请求主体
try
paramsJson:= GetMemberEntity();
Memo1.Lines.Clear;
memo1.Text := paramsJson.AsString();
HttpReq.send(paramsJson.AsString());
resultJson:=SO(HttpReq.responseText);
if (resultJson<>nil) then
begin
showmessage(resultJson.S['Message']);
//发卡成功,如果有照片或者签名则执行上传
if (resultJson.B['Success']=true) then
begin
if (mbPhoto) then
begin
url := 'http://localhost:5269/api/webmemberapi/UploadMemberImage?';
HttpReq.open('Post', url, False, EmptyParam, EmptyParam);
//http post
HttpReq.setRequestHeader('Accept', 'application/json');
HttpReq.setRequestHeader('Content-Type', 'application/json'); paramsJson:=SO();
paramsJson.S['ImageFileContent']:= BitmapToString(ImageMemberPhoto.Picture.Bitmap);
paramsJson.S['ImageCategory']:='头像';
paramsJson.S['MemberCardNo']:=self.edtCardNo.Text;
HttpReq.send(paramsJson.AsString());
resultJson:=SO(HttpReq.responseText); end;
if (mbSign) then
begin
url := 'http://localhost:5269/api/webmemberapi/UploadMemberImage?';
HttpReq.open('Post', url, False, EmptyParam, EmptyParam);
//http post
HttpReq.setRequestHeader('Accept', 'application/json');
HttpReq.setRequestHeader('Content-Type', 'application/json'); paramsJson:=SO();
paramsJson.S['ImageFileContent']:= BitmapToString(ImageMemberSign.Picture.Bitmap);;
paramsJson.S['ImageCategory']:='签名';
paramsJson.S['MemberCardNo']:=self.edtCardNo.Text;
HttpReq.send(paramsJson.AsString());
resultJson:=SO(HttpReq.responseText);
end;
end;
end;
except
on Ex:Exception do
showmessage(Ex.Message);
end; end;
end;

//XMLHttpRequest实例化

HttpReq := CoXMLHTTPRequest.Create;
//两种提交请求的方式:Get和Post,Get是通过URL地址传递参数如果是中文需要转码,需要添加时间戳 Post不需要添加时间戳
//get url := 'http://localhost:5269/api/webmemberapi/NewMemberRegister?timestamp='+inttostr(Windows.GetTickCount);
url := 'http://localhost:5269/api/webmemberapi/NewMemberRegister?';

// Post或者Get
HttpReq.open('Post', url, False, EmptyParam, EmptyParam);
//http post  **这是关键代码**RequestHeader的设置'application/json',服务器端才能识别为Json
HttpReq.setRequestHeader('Accept', 'application/json');
HttpReq.setRequestHeader('Content-Type', 'application/json');

//这是请求的主体

HttpReq.send(paramsJson.AsString());

//把服务器返回的Json字符串反序列化成一个SuperObject对象。

resultJson:=SO(HttpReq.responseText);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Com.Aidpoint.MemberApi.Models
{
/// <summary>
/// Action返回值实体
/// </summary>
public class ApiActionResult
{
public bool Success
{
get;
set;
} public string Message
{
get;
set;
} public object Result
{
get;
set;
}
}
}

if (resultJson<>nil) then
begin
   showmessage(resultJson.S['Message']);
   //发卡成功,如果有照片或者签名则执行上传
   if (resultJson.B['Success']=true) then ...

end

(3)Josn包含base64编码的图片:

//位图文件转Base64字符串
function TFormMakeCard.BitmapToString(img:TBitmap):string;
var
ms:TMemoryStream;
ss:TStringStream;
s:string;
begin
ms := TMemoryStream.Create;
img.SaveToStream(ms);
ss := TStringStream.Create('');
ms.Position:=;
EncodeStream(ms,ss);//将内存流编码为base64字符流
s:=ss.DataString;
ms.Free;
ss.Free;
result:=s;
end; url := 'http://localhost:5269/api/webmemberapi/UploadMemberImage?';
HttpReq.open('Post', url, False, EmptyParam, EmptyParam);
//http post
HttpReq.setRequestHeader('Accept', 'application/json');
HttpReq.setRequestHeader('Content-Type', 'application/json'); paramsJson:=SO();
paramsJson.S['ImageFileContent']:= BitmapToString(ImageMemberPhoto.Picture.Bitmap);
paramsJson.S['ImageCategory']:='头像';
paramsJson.S['MemberCardNo']:=self.edtCardNo.Text;
HttpReq.send(paramsJson.AsString());
resultJson:=SO(HttpReq.responseText);

(4)服务器端的web api

 public ApiActionResult NewMemberRegister([FromBody]MemberDTO memberDTO)
{
//初始化返回值
var result = new ApiActionResult()
{
Success = false,
Result = null,
Message = "操作失败。"
};
if (memberDTO != null)
{
try
{
using (MemberEntities db = new MemberEntities())
{
var dbEntity = CheckMemberExists(memberDTO, db);
if (dbEntity==null)
{
//插入会员表
var entity = DTO2Entity.ConvertToEntityObject<会员表>(memberDTO) as 会员表;
db.AddTo会员表(entity);
//生成储值流水--w:误收,d:积分兑换礼品,f:发新卡,c:储值,q:取款,j:积分消费记录
var detailRec = new 会员储值流水表();
detailRec.会员卡号 = memberDTO.卡号;
detailRec.储值标志 = "f";
detailRec.充值金额 = memberDTO.开卡额.Value;
detailRec.新卡 = "Y";
db.AddTo会员储值流水表(detailRec);
try
{
db.SaveChanges();
result.Success = true;
result.Result = entity;
result.Message = string.Format("操作成功。新发会员卡[{0}],开卡金额:{1}。", entity.自编号, entity.开卡额);
}
catch (Exception ex)
{
var exx = ex.InnerException == null ? ex : ex.InnerException;
throw new Exception(exx.Message);
}
}
else
{
result.Success = false;
result.Result = null;
result.Message = string.Format("卡号[{0}]已经存在。发卡门店[{1}],持卡人:{2}。",dbEntity.自编号,dbEntity.发行分店编号,dbEntity.姓名);
}
}
}
catch (Exception ex)
{
var exx = ex.InnerException == null ? ex : ex.InnerException;
result.Success = false;
result.Result = exx;
result.Message = string.Format("操作异常,异常消息:{0}。", exx.Message);
}
}
return result;
}

  

  

  

delphi7的新生,参与分布式应用开发,调用RESTful API,Json的应用的更多相关文章

  1. C#调用RESTful API

    如今非常多的网络服务都用RESTful API来实现. 比方百度的搜索推广API介绍使用Rest原因:REST+JSON风格的API相比SOAP+XML,优点是:调用更加灵活.也更easy扩展:JSO ...

  2. 用 Go 快速开发一个 RESTful API 服务

    何时使用单体 RESTful 服务 对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,而单体服务具有架构简单,部署简单,开发成本低等优点,可以帮助我们快速实现产品需求.我们在使用单体服务 ...

  3. Java 调用Restful API接口的几种方式--HTTPS

    摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful ...

  4. python requests 调用restful api

    #!/usr/bin/python# -*- coding: utf-8 -*- import jsonimport requestsfrom urlparse import urljoin BASE ...

  5. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API

    写在前面的话 看了一下博客目录,距离上次更新这个系列的博文已经有两个多月,并不是因为不想继续写博客,由于中间这段时间更新了几篇其他系列的文章就暂时停止了,如今已经讲述的差不多,也就继续抽时间更新< ...

  6. SpringMVC Restful api接口实现

    [前言] 面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎. .net平台有WebAPi项目是专门用来实现Restful ...

  7. RESTful API 编写指南

    基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无法很好的 ...

  8. openstack操作之二 restful api

    Restful api 是openstack各服务调用的接口,简单理解为可以通过网络去调用的函数.postman是一款前端调用工具,测试后端接口的时候往往是使用该工具去验证.在openstack的使用 ...

  9. 什么是restful api

    https://blog.csdn.net/laotianv5/article/details/81634997 什么是Restful API Restful API 从字面就可以知道,他是rest式 ...

随机推荐

  1. Atitit.人力资源管理原理与概论

    Atitit.人力资源管理原理与概论 1. 人力资源管理 第一章 人力资源管理概述 第二章 人力资源理论基础与发展演变 第三章 人力资源规划 第四章工作分析与工作设计 第五章 员工招聘与录用 第六章 ...

  2. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  3. 用自己的算法实现startsWith和endsWith功能

    package hanqi; import java.util.Random; import java.util.Scanner; public class zuoye { public static ...

  4. PHP学习计划

  5. C#窗体全屏功能

    最近有朋友让我给他弄个应用程序全屏的功能,例如银行的取号程序界面.所以我从网上查询了一些实现的方法. C#应用程序中如何实现全屏幕显示功能? 效果就像windows自带的屏幕保护程序和众多的游戏那样, ...

  6. python实现自动发送微博,当自己写博客时同步上去。

    一.需求: 自己在github上搭建一个基于Jekyll的博客(http://beginman.cn/),每次写完博客后就要push上去,博客写的再好,基本上没人访问,为了增加访问量,就想利用起来微博 ...

  7. 闲暇时间开发的个人app

    最近一段时间公司不是很忙,晚上基本没怎么加班.所以自己利用晚上在家的时间开发了一个app(奇趣营),其实自从转android开发以来,就有想过要自己开发一个app.一方面可以提升自己的经验:另一方面可 ...

  8. Android 多线程-----AsyncTask详解

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  9. 如何选择开源许可证&如何修改项目使其符合某种开源许可证

    作者:zyl910 很多文章介绍了详细的解说了各种开源许可证及它们的区别.但是,具体该选择哪一种许可证?如何修改项目使其符合某种开源许可证?就很少见到指导了.于是本文探讨这两个问题. 一.如何选择开源 ...

  10. 【Vegas原创】EXCEL光标所在的行自动变色

      方法: 1,excel中,按Alt+F11,打开VBA编辑界面,双击需要改的工作表名称,将下面代码粘贴到右边框中,即可. 2,代码: Private Sub Worksheet_Selection ...