WebAPI调用笔记
前言
即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录。
接口描述
首先说明一下,基于Http协议的Get、Post请求,网上有很多例子,其实方法都是一样的,这块没什么好说的,我也测试过我的代码,正常的调用是没问题的。问题不是在请求方法上,而是在如何取出数据上。
因为对应我需求接口的开发是个实习生,对于如何提供接口,他并不熟悉,其中我还帮了一些忙,但我毕竟不是很熟BS端那块,纠结了1天多才调通接口。
描述一下需求接口:
OA方需要提供头像下载的接口供即时通信初次登陆时下载头像。
思路如下:
1.接口内将OA头像文件夹打包压缩成zip文件
2.将zip文件,转成字节流byte[]
3.将字节流byte[]序列化成json格式 返回
问题
思路1、2他按照我的要求做了,我测试接口后遇到的问题是取出的byte[]顺序不对,我本地反序列化后转成zip文件没法解压,多次测试后我又让他按照思路3来做。
测试接口,遇到了个问题,我反序列化出来的json字符串,包含了d,如下:
解决
因为不熟悉这块,我不知道如何取出d中的数据,上网查也不好查,因为几乎没有问这块的,后来我问OA做手机端的同事,才知道他们提供的接口方法都是void,不在返回值的,都是通过http的Context.Response返回的,在调用的时候不会出现这个d字符。然而他也不知道如何取出d中的数据,没办法只能在网上再找,后来在一篇CSDN的博客中的评论里找到了办法,将json转换成hash表的格式,然后直接取出来d的数据,然后反序列化json成对象,如下:
string headjson = WebAPIHelper.HttpPost(OAAddress, null);
JavaScriptSerializer json = new JavaScriptSerializer();
Hashtable table = (Hashtable)json.Deserialize(headjson, typeof(Hashtable));
string d = table["d"].ToString();//取出d中的数据
HeadByte h1 = JsonConvert.DeserializeObject<HeadByte>(d);
到此为止,问题终于解决。
拓展
因为比较在意普通的接口是如何提供返回结果的,我特意看一下OA中的WebAPI方法,同事说过,不带d的方法无需返回值,使用void即可,请求返回的结果都在Response中,json字符串出现d的原因是方法的返回值是string类型,特附上不需要另外取json中d的方法:
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
[WebMethod(Description = " 获取筛选条件", EnableSession = true)]
public void GetTestList(string Type,string UserID)
{
Context.Response.ContentType = "text/plain";
Context.Response.Charset = "UTF-8";
Context.Response.ContentEncoding = System.Text.Encoding.UTF8;
Dictionary<string, object> dicReturn = new Dictionary<string, object>();
Dictionary<string, object> dic = new Dictionary<string, object>();
string jsonStr = string.Empty;//保存返回的json字符串
try
{
//将返回的结果放到dic中
//可以放到list里也可以放到DataTable中
List<SortModel> list = xxx.GetXXXXXList(parames1, parames2);
dic.Add("Count", xxx.GetXXXXXCount(parames1, parames2));
dic.Add("List", list);
//或者
DataTable dt = xxx.GetXXXXX(parames1, parames2);
dic.Add("Count", xxx.GetXXXXXCount(parames1, parames2);
dic.Add("List2", dt);
//获取成功
dicReturn.Add("State", "");
dicReturn.Add("ErrorMsg", "获取成功");
dicReturn.Add("Data", dic);
dicReturn.Add("ErrCode", "");
}
catch (Exception ex)
{
dicReturn.Add("State", "");
dicReturn.Add("ErrorMsg", ex.Message);
dicReturn.Add("Data", "");
dicReturn.Add("ErrCode", "");
}
//序列化 json字符串
jsonStr = JsonConvert.SerializeObject(dicReturn);
Context.Response.Write(jsonStr);
Context.Response.End(); }
附上post请求的方法:
/// <summary>
/// 同步Post
/// </summary>
/// <param name="Url"></param>
/// <param name="postDataStr"></param>
/// <returns>返回json格式</returns>
public static string HttpPost(string Url, IDictionary<string, string> Params)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
//request.ContentType = "application/x-www-form-urlencoded";
request.ContentType = "application/json";
request.CookieContainer = cookie; //发送POST数据
StringBuilder bufferParams = new StringBuilder();
if (!(Params == null || Params.Count == ))
{
int i = ;
foreach (string key in Params.Keys)
{
if (i > )
{
bufferParams.AppendFormat("&{0}={1}", key, Params[key]);
}
else
{
bufferParams.AppendFormat("{0}={1}", key, Params[key]);
i++;
}
}
}
request.ContentLength = Encoding.UTF8.GetByteCount(bufferParams.ToString()); Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
myStreamWriter.Write(bufferParams);
myStreamWriter.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); response.Cookies = cookie.GetCookies(response.ResponseUri);
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
#region ContentType = "application/x-www-form-urlencoded"处理方式
//服务器端返回的是一个XML格式的字符串,XML的Content才是我们所需要的数据
//XmlTextReader Reader = new XmlTextReader(myResponseStream);
//Reader.MoveToContent();
//string retString = Reader.ReadInnerXml();//取出Content中的数据
//Reader.Close();
#endregion
myStreamReader.Close();
myResponseStream.Close(); return retString;
}
总结
对于WebAPI调用,在BS端中,实在是很小白的东西,但是再怎么小白,没做过还是会花一些时间的。2019年,希望自己可以成长的更快,变得更优秀。
WebAPI调用笔记的更多相关文章
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换
路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...
- 输出的数据格式是如何决定的-------Asp.net WebAPI学习笔记(二)
在上一篇文章<路由其实也可以很简单>,我们解决了路由问题,这篇文章,我们来研究剩下的另一个问题,为何我们的方法返回的是一个列表,输出到客户端的时候,变成json呢,大家应该还记得我们上一篇 ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)
MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中,一切皆路由,url中是完全拒绝"?"和“&”.对此,我 ...
- WebAPI学习笔记
WebAPI WebApi是添加到Asp.Net平台的一个新特性,可以快速的创建Web服务,并对客户端提供HTTP的API调用接口 WebApi是建立在MVC框架基础之上,但不属于MVC的一部分. 序 ...
- keras模块学习之-参数初始化与对象调用-笔记
本笔记由博客园-圆柱模板 博主整理笔记发布,转载需注明,谢谢合作! 参数初始化(Initializations) 这个模块的作用是在添加layer时调用init进行这一层的权重初始化,有两种初始化方法 ...
- MySql存储过程的创建与使用及在thinkphp中如何调用笔记
学习sql的存储过程,笔记总结如下: MySQL默认将分号,即";"作为语句的分隔符.如果是这样的话,则一个存储过程将很难正常创建,因为它的BEGIN和END之间可以是任意数量的S ...
- 关于webapi调用wcf并发假死的分析
原来IDFA(IOS推广获取到用户IOS手机的唯一标识,如果不刷机的话跟安卓的IMEI一样)在公司正常的页面是公用用一个网站和数据库的. 起初怀疑并发数太多,把数据库连接池的数量从一百设置到三百,确实 ...
随机推荐
- java 自动拆箱
Integer a0 = ; Integer a1 = ; Integer b0 = ; Integer b1 = ; ; System.out.println(a0 == a1); >> ...
- luogu P1003 铺地毯
水题 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; t ...
- ubuntu18.04 安装pip3
Ubuntu18.04默认内嵌python2.python3,pip安装时,python2对应安装pip,python3对应安装pip3. sudo apt install python3-pip 检 ...
- html5 css练习 画廊 元素旋转
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- vue开发目录
基于 vue-cli 脚手架生成项目模板基础上做了些改动,加入了 vue-router ,vuex 等配套设施,本地 dev server 中加入了接口 mock 功能,还增加一个 build ser ...
- 【js】高阶函数是个什么?
所谓高阶函数,就是函数中可以传入另一个函数作为参数的函数. 简单一张图,方便理解全文. function 高阶函数(函数){} 这是一个高阶函数,f是传入的函数作为参数. 其实高阶函数用的很多.其实平 ...
- latch releae overview
1. MainFsmStates add MAIN_FSM_LATCH_OPEN_FOR_DOOR_CLOSE 2. mb_PcuTriggerReInit = TRUE; /* start PCU ...
- Hibernate一级缓存和二级缓存详解
(1)一级缓存 是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么h ...
- 在vim下打开终端
注意:仅在vim8.1下可用 使用方法: :term 打开默认的终端 如果是linux,或者使用wsl, :term bash Ctrl+W/Ctrl+N 将终端设置成normal模式
- 2018年-2019年第二学期第五周C#学习个人总结
在本周我学习了第五章面向对象高级中的5.3多态,5.3多态中主要包括重写父类方法,多态的实现,base关键字,里氏转换原则,Object类.在重写父类方法中要求当重写父类的方法时,要求子类的方法名,参 ...