采用JSON方式调用SI的实例分享(研发勤哥分享)
金蝶云社区-天冥异
天冥异
3人赞赏了该文章 236次浏览 未经作者许可,禁止转载编辑于2018年07月19日 20:39:56

该文档可在文库中在线预览
http://open.kingdee.com/K3cloud/WenKu/DocumentView.aspx?docId=110033
最近因为项目的需要做了一个通过JSON来访问SI的例子和大家一起分享一下;
这里面的关键就是在于调用接口时首先要进行登录,并在登录后持有这次访问的CookieContainer,在下次访问后用同样一个CookieContainer去访问。

分享的例子如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using Newtonsoft.Json.Converters;
using test.ServiceReference1;
using Newtonsoft.Json;
using System.Net;
using System.IO;
using System.Web.UI.WebControls;

namespace test
{
    /// <summary>
    /// HTTP访问代理
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="content"></param>
    public delegate void HttpClientDelegate(DateTime sender, string content);

    /// <summary>
    /// 封装HTTP的访问
    /// </summary>
    public class HttpClient
    {
        /// <summary>
        /// SI方法URL
        /// </summary>
        public string Url { get; set; }
        /// <summary>
        /// SI内容(方法里面的参数)
        /// </summary>
        public string Content { get; set; }
        /// <summary>
        /// Cookie,保证登录后,所有访问持有一个Cookie;
        /// </summary>
        static CookieContainer _cc = new CookieContainer();

        /// <summary>
        /// HTTP访问
        /// </summary>
        /// <param name="sendTime"></param>
        /// <param name="resultCallback"></param>
        /// <param name="contentType"></param>
        /// <param name="isByte"></param>
        public void SysncRequest(DateTime sendTime, HttpClientDelegate resultCallback, string contentType = "")
        {
            byte[] postData = UnicodeEncoding.UTF8.GetBytes(Content);
            HttpWebRequest httpWebRequest = WebRequest.Create(Url) as HttpWebRequest;
            httpWebRequest.Method = "POST";
            httpWebRequest.Accept = "application/json";
            httpWebRequest.ContentLength = postData.Length;
            httpWebRequest.CookieContainer = _cc;
            if (contentType != "")
            {
                httpWebRequest.ContentType = contentType;
            }

            using (Stream requestStream = httpWebRequest.GetRequestStream())
            {
                requestStream.Write(postData, 0, postData.Length);
                requestStream.Close();
            }
            HttpWebResponse httpWebResponse = null;
            Stream responseStream = null;
            StreamReader streamReader = null;

            try
            {
                httpWebRequest.Timeout = 60 * 60 * 1000;
                httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
                responseStream = httpWebResponse.GetResponseStream();
                streamReader = new StreamReader(responseStream);
                string result = streamReader.ReadToEnd();
                resultCallback(sendTime, result);
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (streamReader != null) streamReader.Close();
                if (responseStream != null) responseStream.Close();
                if (httpWebResponse != null) httpWebResponse.Close();
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Login();
        }
        /// <summary>
        /// 登陆
        /// </summary>
        static void Login()
        {
            HttpClient httpClient = new HttpClient();
            httpClient.Url = "http://localhost/K3CloudServiceInterface_rhz/json/syncreply/Auth";
            httpClient.Content = "{\"provider\":\"credentials\",\"State\":\"\",\"oauth_token\":\"\",\"oauth_verifier\":\"\",\"UserName\":\"Administrator\",\"Password\":\"888888\",\"RememberMe\":true,\"Continue\":\"\",\"nonce\":\"\",\"uri\":\"\",\"response\":\"\",\"qop\":\"\",\"nc\":\"\",\"cnonce\":\"\",\"PasswordIsEncrypted\":false}";
            httpClient.SysncRequest(DateTime.Now, CallBack, "application/json; charset=utf-8");
        }

        /// <summary>
        /// 获取组织
        /// </summary>
        static void GetOrgs()
        {
            HttpClient httpClient = new HttpClient();
            httpClient.Url = "http://localhost/K3CloudServiceInterface_rhz/json/syncreply/ORG_Organizations_View";
            httpClient.Content = "{\"CreateOrgId\":0,\"Number\":\"100\"}";
            httpClient.SysncRequest(DateTime.Now, CallOrgBack, "application/json; charset=utf-8");

        }

        static void CallBack(DateTime sender, string content)
        {
            GetOrgs();
        }

        static void CallOrgBack(DateTime sender, string content)
        {
            int i = 0;
            i++;
        }

    }
}

赞 3