delphi7的新生,参与分布式应用开发,调用RESTful API,Json的应用

前言:

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:=0;
    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;
        }

  

  

  

时间: 2024-08-29 07:24:11

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

C#调用RESTful API

如今非常多的网络服务都用RESTful API来实现. 比方百度的搜索推广API介绍使用Rest原因:REST+JSON风格的API相比SOAP+XML,优点是:调用更加灵活.也更easy扩展:JSON格式传输信息比XML降低约30%的数据量,效率更高.因此建议开发人员使用REST风格的API. 查找了非常多调用Rest API网络碎片资料,总是无法理解或者生效. 以下摘一点认为有效果的作为參考吧. http://www.makeyuan.com/2014/02/27/1117.html 利用该

Python自动化开发学习-RESTful API

RESTful API RESTful API 是一种面向资源编程,也叫表征状态转移(英文:Representational State Transfer,简称REST).认为网络上所有的东西都是资源,对资源的操作无非就是增删改查. 传统的方法 比如有个资产的页面,URL是 www.example.com/asset.要对它进行增删改查,可能使用不同的url来区分: www.example.com/addAsset :增加资产,一般是POST方法. www.example.com/delAsse

ionic 调用restful API services时全局错误处理的实现 或自定义错误处理的实现

往往我们的ionic程序需要调用API Service. 比如天气,地图等等.当这些API Service 不稳定或者不可访问时,我们可以通过在注册一个自定义的ErrorHandler, 来处理此类错误. 1.   将自定义错误处理类作为provider,  也就是Service.   在终端使用命令: ionic g provider GlobalErrorHandler .  ionic generate 命令行定义可以参考此处 2.     实现GlobalErrorHandler, 完整

SpringMVC Restful api接口实现

[前言] 面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎. .net平台有WebAPi项目是专门用来实现Restful api的,其良好的系统封装,简洁优雅的代码实现,深受.net平台开发人员所青睐,在后台服务api接口中,已经逐步取代了辉煌一时MVC Controller,更准确地说,合适的项目使用更加合适的工具,开发效率将会更加高效. python平台有tornado框架,也是原生支持了Restful api,在

RESTful API 编写指南

基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无法很好的理解和使用.下文Gevin结合自己的实践经验,整理了从零开始开发RESTful API的核心要点,完善的RESTful开发组件基本都会包含全部或大部分要点,对于支持不够到位的要点,我们也可以自己写代码实现. 1. Request 和 Response RESTful API的开发和使用,无非是客户端

【Tech】CAS RESTful API使用笔记

在被maven,cas,tomcat各种贱人就是矫情的虐了好几天之后,终于跑通了demo,哈哈哈哈哈哈哈~ 在这里详细记录一下,给和我一样连maven都不会的小白一点福利,同时欢迎大神指正. 首先上最好的参考资料:http://stackoverflow.com/questions/22625368/working-java-rest-client-example-to-access-cas-rest-api 这个大神讲的非常清楚了,只要跟着他的步骤一定是可以的,但是...大神一句话,通常我要花

asp.net 分布式应用开发

Net Framework推出的许多新技术为上述任务的实现提供了相对简单的解决方案.其中,基于SOAP的Web Service在处理分布式应用时具有比传统的DCOM/CORBA明显的优点,结合基于Web的ASP.NET页面开发技术和SQL Server数据存储技术(或Xml文档),在.Net下开发N层应用程序也不再困难. 一.分布式处理概述 分布式处理是将应用程序逻辑分布到2台或者更多台计算机上,在物理上或逻辑上分离的单元中.这一概念并不是新生事物,在大型工程已经得到广泛使用.只不过,Inter

开发restful api总结的几点小经验

与其说是开发,不如说是打补丁! 是个jesery+spring的restful service,加了一个权限校验部分,做了一些调整. 本来其实很简单的一个事,后来发现,这个代码太霸道.本来传个参数是action_id 这个东西,结果参数名字有如下:action_id,actionID,id 我只能说傻傻分不清楚到底你传的什么, 因为还有其他id,参数名字参考刚才的. 代码中的也是混乱,虽然我知道有很多先人在修改了,但是也不至于这样吧. 吐槽完毕. 1.N次开发restful api主意版本迭代,

002.AngularJs调用Restful实现CRUD

本节我们主要给大家介绍AngularJs如何调用Restful,实现数据的CRUD. 主要用到的技术: 后端:ASP.NET WebApi + SQLServer2008 前端:AngularJs,Bootstrap3 主要用到的开发工具 后端:VisualStudio2013 + SQLServer2008 前端:WebStorm8 1.创建后端项目AngularJs_WebApi 1.1建立空解决方案名称AngularJs_WebApi 1.2 创建AngularJs_WebApi_Serv