公司在当当上经营了一家店铺,通过当当提供的API,用C#写代码,通过NCO3.0调用SAP RFC将订单信息抓取到SAP。

如果你是新手,在当当网上有店铺,且你公司使用SAP系统,恭喜你,下面这些代码直接复制过去,改下商家编码和密钥就可以直接抓单了。如果你只是当当网有店铺,没有SAP系统,下面这些代码也同样对你有用,你或许要插入自己的数据库,这更简单了。

需要准备的环境:

1、  Microsoft Visual Studio 2010 开发环境。

2、  NCO3.0 (下载地址:http://download.csdn.net/detail/szlaptop/4635144)

(VS2010环境下必须这个版本:sapnco30dotnet40P_8-20007347.zip)

3、  Log4net (百度下,在官方下载)

4、  在SAP里建2张表,用SAP专业术语,建一个抬头表,建一个行项目表

5、  当当API手册(在商家后台,公告栏处可以看见)

Step1

登录当当网商家后台,设置商家接口密码(这些内容当当API里有)

注意:

1、 商家修改接口密码(key)时,需要提供原key值;如果商家是第一次使用该功能,那么可以不输入原key值;

2、 新key值区分大小写,设置时请特别注意;

3、 新key值长度为8-20位,不能全部为数字,不能全部为小写字母,不能全部为大写字母;

4、 如果商家忘记原key值,请联系当当技术支持,进行key值重置。

Step2

打开VS2010新建一个Windows窗体应用程序,命名:DangDang

在解决方案资源管理器,引用里引用NCO3.0的sapnco.dll和sapnco_utils 及 log4net

右击项目名称DangDang,点击“属性”,打开属性面板:将目标框架里默认的.NET Framework 4 Client Profile 改为:.NET Framework 4。(很重要)

在解决方案资源管理器里打开配置文件APP.CONFIG,配置如下:

Step3

经过Step2的设置,VS环境这边算是搭建OK了。第3步,我们去SAP建表去(建表详细略)

因为我们这里这是抓取当当订单的信息。所以建2张表,表的字段和含义请熟读当当API手册。

上面这张图不是完全的,因为截图截不了那么多,下面还有很多字段,这些字段都是根据API手册来设置的,当然你可以灵活的从这些字段中取认为你需要的信息。

这两张表,我都选了”订单编号”做为主键,方便以后关联查询。

Step4

写RFC(写RFC可以参照我之前写的博客)

Source code里的代码很简单。

 IF IT_ZDDITEM[] IS NOT INITIAL.MODIFY ZDDITEM FROM TABLE IT_ZDDITEM[].IF SY-SUBRC = 0.R_SUBRC = '数据已成功写入ZDDITEM表里'.ENDIF.ENDIF.IF IT_ZDDITEMMAS[] IS NOT INITIAL.MODIFY ZDDITEMMAS FROM TABLE IT_ZDDITEMMAS[].IF SY-SUBRC = 0.R_SUBRC = '数据已成功写入ZDDITEMMAS表里'.ENDIF.ENDIF.

Step5

到第5部了,开始在VS里写代码了。首先要解决的是”验证码算法”,API手册了给了解释:

validateString参数是每个API请求中必须发送的参数,由请求中的其它参数以及后台设置的key值两部分,采用MD5加密生成,具体算法如下:

第一步,把请求中的参数(XML文件以及validateString本身除外),按照参数名称进行正向排序

第二步,把各个参数的值按照GBK编码后,按照排序顺序串联起来(不能有空格)

第三步,把后台设置的key值按照GBK编码后,串接到“第二步”得到的字符串尾部(不能有空格)

第四步,采用MD5算法对“第三步”得到的字符串进行加密,生成validateString的值

好了,我直接上C#代码,将这4步翻译成代码:

public static string MD5(string str, string encode){MD5 md5 = new MD5CryptoServiceProvider();byte[] data = md5.ComputeHash(Encoding.GetEncoding(encode).GetBytes(str));StringBuilder sBuilder = new StringBuilder();for (int i = 0; i < data.Length; i++){sBuilder.Append(data[i].ToString("x2"));}return sBuilder.ToString();}public static string SignTopRequest(IDictionary<string, string> parameters, string key){IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);string str = string.Empty;foreach (var item in sortedParams){if (!string.IsNullOrEmpty(item.Value)){str += System.Text.Encoding.GetEncoding("GBK").GetString(System.Text.Encoding.Default.GetBytes(item.Value));}}str += System.Text.Encoding.GetEncoding("GBK").GetString(System.Text.Encoding.Default.GetBytes(key));return MD5(str, "UTF-8");}private static IDictionary<string, string> SplitUrlQuery(string query){IDictionary<string, string> result = new Dictionary<string, string>();string[] pairs = query.Split(new char[] { '&' });if (pairs != null && pairs.Length > 0){foreach (string pair in pairs){string[] oneParam = pair.Split(new char[] { '=' }, 2);if (oneParam != null && oneParam.Length == 2){result.Add(oneParam[0], oneParam[1]);}}}return result;}}

Step 6

这个验证码有了,就好像有了进当当系统的通行证了,现在我们拿着通行证到当当里把订单信息取出来,代码如下:

        public void GetOrder(){string getorderdetail = "gShopID=商家编号&o=&productID=&oit=&os=&sm=&pm=&sendMode=&name=&lastModifyTime_start=&"+ "lastModifyTime_end=&osd=&oed=&sgsd=&sged=&ol=&pageSize=&p=&validateString=";IDictionary<string, string> Idiction = SplitUrlQuery(getorderdetail);string serverUrl = "http://api.dangdang.com/v2/searchOrders.php?" + getorderdetail;string validateString = SignTopRequest(Idiction, "密钥");string xmlContent = Get(serverUrl + validateString);ds = XmlToData.CXmlToDataSet(@xmlContent);dsall.Merge(ds);}}

Step7

上面这段代码,有个方法就是将XML文件转化成DATASET,这个方法也是我从百度搜来的,懒的自己写了。如下:(你建一个类,类名XmlToData,把这些代码放进去即可)

public class XmlToData{public static DataSet CXmlToDataSet(string xmlStr){if (!string.IsNullOrEmpty(xmlStr)){StringReader StrStream = null;XmlTextReader Xmlrdr = null;try{DataSet ds = new DataSet();StrStream = new StringReader(xmlStr);Xmlrdr = new XmlTextReader(StrStream);              ds.ReadXml(Xmlrdr);return ds;}catch (Exception e){throw e;}finally{if (Xmlrdr != null){Xmlrdr.Close();StrStream.Close();StrStream.Dispose();}}}else{return null;}}}

Step8

如果你按照上面讲的,操作无误的话,设断点,点调试,在DS里就能看到20条订单列表信息了。当当不会那么容易让你一下取很多数据的,默认的就是20条,且1分钟只能请求30次。拿到这个简单的订单列表信息后,你还需要通过订单编号和通行证,再去取一次该订单的详细信息。这第7步,我来说怎么把VS和SAP打通。

首先你得这样:using SAP.Middleware.Connector;

然后这样,直接上代码:

        #region 通过NCO3.0将数据写入SAP(ZDDHEADER)public void SAP_DANGDANG_RFC(DataSet dsall){//读取配置文件信息,建立与SAP连接RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("DEV");try{RfcRepository SapRfcRepository = SapRfcDestination.Repository;IRfcFunction myfun = SapRfcRepository.CreateFunction("ZDANGDANG_RFC_HEADER");// Set some input values for the structure.IRfcStructure import = null;IRfcTable table = myfun.GetTable("IT_ZDDHEADER");for (int i = 0; i < dsall.Tables[3].Rows.Count; i++){import = SapRfcRepository.GetStructureMetadata("ZDDHEADER").CreateStructure();import.SetValue("DD1", dsall.Tables[3].Rows[i][0].ToString());    //订单编号import.SetValue("DD21", dsall.Tables[3].Rows[i][1].ToString());   //收货人姓名import.SetValue("DD28", dsall.Tables[3].Rows[i][2].ToString());   //固定电话import.SetValue("DD29", dsall.Tables[3].Rows[i][3].ToString());   //手机号码import.SetValue("DD22", dsall.Tables[3].Rows[i][4].ToString());   //收货人地址import.SetValue("DD30", dsall.Tables[3].Rows[i][5].ToString());   //送货方式import.SetValue("DD63", dsall.Tables[3].Rows[i][7].ToString());   //订单总额import.SetValue("DD62", dsall.Tables[3].Rows[i][8].ToString());   //下单时间import.SetValue("DD7", dsall.Tables[3].Rows[i][9].ToString());    //最后修改时间import.SetValue("DD2", dsall.Tables[3].Rows[i][10].ToString());   //订单状态import.SetValue("DD5", dsall.Tables[3].Rows[i][11].ToString());   //备注import.SetValue("DD6", dsall.Tables[3].Rows[i][12].ToString());   //标记table.Insert(import);}myfun.Invoke(SapRfcDestination); //执行函数}catch (Exception e){MessageBox.Show(e.ToString());}finally{RfcSessionManager.EndContext(SapRfcDestination);SapRfcDestination = null;}}#endregion

Step9

如果上面都无误的话,点运行。然后到SAP的表里就可以看到20条数据了。

关于log4net是什么,怎么用,请看我的下一篇博文:http://blog.csdn.net/szlaptop/article/details/8561650

实战项目:通过当当API将订单抓取到SAP(一)相关推荐

  1. RabbitMQ 相关整合实战项目(完结)

    RabbitMQ 整合 PD 商城实战项目流程总结 一.订单流量削峰(解耦) 简单模式,若多添加几个消费者则用工作模式. 导入商城项目 将 step5 课前资料里面 /elasticsearch/pd ...

  2. UNIAPP实战项目笔记45 订单页面布局完成和数据渲染

    UNIAPP实战项目笔记45 订单页面布局完成和数据渲染 实际案例图片 订单页面 具体内容图片自己替换哈,随便找了个图片的做示例 具体位置见目录结构 通过 模拟数据list 来实现数据渲染 完善布局页 ...

  3. 【WEB API项目实战干货系列】- API登录与身份验证(三)

    上一篇: [WEB API项目实战干货系列]- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. ...

  4. App项目实战之路(二):API篇

    原创文章,转载请注明:转载自Keegan小钢 并标明原文链接:http://keeganlee.me/post/practice/20160812 微信订阅号:keeganlee_me 写于2016- ...

  5. 【PBL项目实战】户外智慧农场项目实战系列——5.天气预报API接口对接

    [PBL项目实战]户外智慧农场项目实战系列--5.天气预报API接口对接 原文链接  https://mp.weixin.qq.com/s/jditkIEd-UK6cSQyCC_-Eg 本系列以户外智 ...

  6. 实战项目 78 : 从 Web API 获取数据

    这篇文章分享我的 Android 开发(入门)课程 的第七个和第八个实战项目:书籍列表应用和新闻应用.这两个项目都托管在我的 GitHub 上,分别是 BookListing 和 NewsApp 这两 ...

  7. Vue.js-Day08【项目实战(附带 完整项目源码)-day03:订单确认页面、美团支付页面、flex弹性盒子布局】

    Vue.js实训[基础理论(5天)+项目实战(5天)]博客汇总表[详细笔记] 实战项目源码[链接:https://pan.baidu.com/s/1r0Mje3Xnh8x4F1HyG4aQTA   提 ...

  8. JAVA项目实战开发电商项目案例(十)订单与支付模块

    文章目录 1项目架构 2项目采用技术 3订单与支付模块功能演示 4如何开发支付宝的支付模块以及订单模块 4.1首先需要编写前端页面以及JS文件 4.2其次需要编写JAVA后台接口 4.3支付模块分析 ...

  9. Vue3 的学习教程汇总、源码解释项目、支持的 UI 组件库、优质实战项目

    大家好,我是你们的 猫哥,一个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 关于猫哥,大家可以看看我的年终总结 前端工程师的 2020 年终总结 - 3 年之痒. 前言 猫哥是一个常年混迹在 GitHub 上 ...

最新文章

  1. 使用 LSTM 进行多变量时间序列预测的保姆级教程
  2. 基于mysql 5.5+mysql-master-ha实现mysql ha架构
  3. 推荐搜索系统论文干货集锦(持续更新)
  4. 机器学习:从感知机模型体会随机梯度下降
  5. 每日程序C语言33-打印杨辉三角
  6. linux下openldap版本查询,用openldap进行linux认证
  7. 获取一个目录下的所有文件
  8. web集群之Ngnix相关配置
  9. CVPR2021 | TrivialAugment:不用调优的SOTA数据增强策略
  10. discuz字典doc_Discuz! X2.5数据字典
  11. head first html与css 代码_手把手教你使用Flask轻松部署机器学习模型(附代码amp;链接) | CSDN博文精选...
  12. 智能车竞赛技术报告 | 智能车视觉 - 西北工业大学 - 赤霄2021
  13. 关于主机的思维导图_思维导图可以整理哪些东西?
  14. 李雅普诺夫(第二方法)稳定性分析+例题
  15. linux查找文件内容 linux文件关键字搜索
  16. 【长安的荔枝】读书摘记
  17. Linux中超过4G文件下载至windows
  18. 计算机圣诞节教案,2010我们的圣诞节(2010圣诞节教案)
  19. PMP证书可以办北京工作居住证的消息,别说你还不知道!
  20. Android CameraX的PreviewView Ar背景实景实时预览

热门文章

  1. java毕业设计网络办公系统mybatis+源码+调试部署+系统+数据库+lw
  2. Vue 报错error:0308010C:digital envelope routines::unsupported
  3. 教程:Oracle数据库12.2中的JSON特性
  4. html超出父元素,【Web前端问题】HTML CSS:子元素什么时候可以超出父元素限制的范围?...
  5. MATLB|分布式能源的选址与定容IEEE30节点实现
  6. 程序员应该用什么样的鼠标
  7. macOS High Sierra 10.13.5 (17F77) 正式版 最新自带Clover v2.4k r4512黑苹果原版镜像
  8. 能量原理与变分法笔记19:最小余能原理+可能功原理
  9. java 死锁 活锁_Java之死锁/活锁
  10. Mac版Excel怎样添加数据分析