喜马拉雅第三方客户端开发(接口和接口数据解析)。

前言:最近闲来无事,看了网上豆瓣的第三方客户端,手有点痒,决定自己动手开发一个客户端,比较了荔枝和喜马拉雅,决定开发喜马拉雅的第三方客户端。

客户端使用了WPF开发。

1.抓取接口;

首先得解决接口数据的问题,使用了手机端的喜马拉雅,抓包看了接口。这里推荐使用fiddler2这个工具。从图中可以看到接口信息,包括接口地址和参数的一些数据。

2.通过http获取接口数据和转换接口数据格式。

这里提供一个HttpWebRequestOpt类来获取接口数据。

using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Text;namespace XIMALAYA.PCDesktop.Untils
{/// <summary>/// 数据操作类/// </summary>public class HttpWebRequestOpt{/// <summary>/// /// </summary>public string UserAgent { get; set; }/// <summary>/// cookie/// </summary>private CookieContainer Cookies { get; set; }private HttpWebRequestOpt(){//FileVersionInfo myFileVersion = FileVersionInfo.GetVersionInfo(Path.Combine(Directory.GetCurrentDirectory(), "XIMALAYA.PCDesktop.exe"));this.Cookies = new CookieContainer();//this.UserAgent = string.Format("ting-ximalaya_v{0} name/ximalaya os/{1} osName/{2}", myFileVersion.FileVersion, OSInfo.Instance.OsInfo.VersionString, OSInfo.Instance.OsInfo.Platform.ToString());//this.Cookies.Add(new Cookie("4&_token", "935&d63fef280403904a8c0a5ee0dbe228f2d064", "/", ".ximalaya.com"));
        }/// <summary>/// 添加cookie/// </summary>/// <param name="cookie"></param>public void SetCookies(Cookie cookie){this.Cookies.Add(cookie);}/// <summary>/// 添加cookie/// </summary>/// <param name="cookie"></param>public void SetCookies(string key, string val){this.Cookies.Add(new Cookie(key, val, "/", ".ximalaya.com"));}/// <summary>/// 通过POST方式发送数据/// </summary>/// <param name="Url">url</param>/// <param name="postDataStr">Post数据</param>/// <returns></returns>public string SendDataByPost(string Url, string postDataStr){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);request.CookieContainer = this.Cookies;request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";request.ContentLength = postDataStr.Length;request.UserAgent = this.UserAgent;Stream myRequestStream = request.GetRequestStream();StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));myStreamWriter.Write(postDataStr);myStreamWriter.Close();HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));string retString = myStreamReader.ReadToEnd();myStreamReader.Close();myResponseStream.Close();return retString;}/// <summary>/// 通过GET方式发送数据/// </summary>/// <param name="Url">url</param>/// <param name="postDataStr">GET数据</param>/// <returns></returns>public string SendDataByGET(string Url, string postDataStr){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);request.CookieContainer = this.Cookies;request.Method = "GET";request.ContentType = "text/html;charset=UTF-8";request.UserAgent = this.UserAgent;HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));string retString = myStreamReader.ReadToEnd();myStreamReader.Close();myResponseStream.Close();return retString;}/// <summary>/// 异步通过POST方式发送数据/// </summary>/// <param name="Url">url</param>/// <param name="postDataStr">GET数据</param>/// <param name="async"></param>public void SendDataByPostAsyn(string Url, string postDataStr, AsyncCallback async){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);request.CookieContainer = this.Cookies;request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";request.ContentLength = postDataStr.Length;request.UserAgent = this.UserAgent;Stream myRequestStream = request.GetRequestStream();StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));myStreamWriter.Write(postDataStr);myStreamWriter.Close();myRequestStream.Close();request.BeginGetResponse(async, request);}/// <summary>/// 异步通过GET方式发送数据/// </summary>/// <param name="Url">url</param>/// <param name="postDataStr">GET数据</param>/// <param name="async"></param>/// <returns></returns>public void SendDataByGETAsyn(string Url, string postDataStr, AsyncCallback async){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);request.CookieContainer = this.Cookies;request.Method = "GET";request.ContentType = "text/html;charset=UTF-8";request.UserAgent = this.UserAgent;request.BeginGetResponse(async, request);}/// <summary>/// 使用HttpWebRequest POST图片等文件,带参数/// </summary>/// <param name="url"></param>/// <param name="file"></param>/// <param name="paramName"></param>/// <param name="contentType"></param>/// <param name="nvc"></param>/// <returns></returns>public string HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc){string result = string.Empty;string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);wr.ContentType = "multipart/form-data; boundary=" + boundary;wr.Method = "POST";wr.KeepAlive = true;wr.Credentials = System.Net.CredentialCache.DefaultCredentials;Stream rs = wr.GetRequestStream();string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";foreach (string key in nvc.Keys){rs.Write(boundarybytes, 0, boundarybytes.Length);string formitem = string.Format(formdataTemplate, key, nvc[key]);byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);rs.Write(formitembytes, 0, formitembytes.Length);}rs.Write(boundarybytes, 0, boundarybytes.Length);string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";string header = string.Format(headerTemplate, paramName, file, contentType);byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);rs.Write(headerbytes, 0, headerbytes.Length);FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);byte[] buffer = new byte[4096];int bytesRead = 0;while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0){rs.Write(buffer, 0, bytesRead);}fileStream.Close();byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");rs.Write(trailer, 0, trailer.Length);rs.Close();WebResponse wresp = null;try{wresp = wr.GetResponse();Stream stream2 = wresp.GetResponseStream();StreamReader reader2 = new StreamReader(stream2);result = reader2.ReadToEnd();}catch (Exception ex){if (wresp != null){wresp.Close();wresp = null;}}finally{wr = null;}return result;}}
}
View Code

接口地址:http://mobile.ximalaya.com/m/index_subjects;接口数据如下:

{"ret":0,"focusImages":{"ret":0,"list":[{"id":1384,"shortTitle":"DJ张羊 谢谢你的美好(感恩特辑)","longTitle":"DJ张羊 谢谢你的美好(感恩特辑)","pic":"http://fdfs.xmcdn.com/group5/M06/A8/1D/wKgDtlR1oKHSsFngAAFlxraThWc933.jpg","type":3,"trackId":4428642,"uid":1315711},{"id":1388,"shortTitle":"小清新女神11月榜","longTitle":"小清新女神11月榜","pic":"http://fdfs.xmcdn.com/group5/M04/A8/25/wKgDtlR1owzjFmE7AAF3pxnuNxg222.jpg","type":5},{"id":1383,"shortTitle":"王朔《你也不会年轻很久》 静波播讲","longTitle":"王朔《你也不会年轻很久》 静波播讲","pic":"http://fdfs.xmcdn.com/group5/M03/A8/1C/wKgDtlR1oE-xEoq6AAEfe5PJmt4656.jpg","type":3,"trackId":4417987,"uid":12512006},{"id":1382,"shortTitle":"楚老湿大课堂(长效图-娱乐)","longTitle":"楚老湿大课堂(长效图-娱乐)","pic":"http://fdfs.xmcdn.com/group5/M06/A8/19/wKgDtlR1n7ORluWTAAFuKujnTB0163.jpg","type":3,"trackId":4422955,"uid":8401915},{"id":1365,"shortTitle":"唱响喜玛拉雅(活动图)","longTitle":"唱响喜玛拉雅(活动图)","pic":"http://fdfs.xmcdn.com/group5/M06/A5/6C/wKgDtVR0VFXA3LWXAAMruRW5vnI973.png","type":8,"url":"http://activity.ximalaya.com/activity-web/activity/57?app=iting"},{"id":1363,"shortTitle":"欧莱雅广告图24、25、27、28","longTitle":"欧莱雅广告图24、25、27、28","pic":"http://fdfs.xmcdn.com/group5/M05/A0/32/wKgDtlRyla6AnGneAAF2kpKTc2I036.jpg","type":4,"url":"http://ma8.qq.com/wap/index.html?utm_source=xmly&utm_medium=113282464&utm_term=&utm_content=xmly01&utm_campaign=CPD_LRL_MEN_MA8%20Campaign_20141118_MO_other"}]},"categories":{"ret":0,"data":[]},"latest_special":{"title":"感恩的心 感谢有你","coverPathSmall":"http://fdfs.xmcdn.com/group5/M04/AA/9B/wKgDtlR2q_jxMbU-AATUrGYasdg092_mobile_small.jpg","coverPathBig":"http://fdfs.xmcdn.com/group5/M04/AA/9B/wKgDtlR2q_jxMbU-AATUrGYasdg092.jpg","coverPathBigPlus":null,"isHot":false},"latest_activity":{"title":"唱响喜马拉雅-每年四季,打造你的音乐梦想","coverPathSmall":"http://fdfs.xmcdn.com/group5/M06/A4/DA/wKgDtlR0UQLik8xMABBJsD5tCNU868_mobile_small.jpg","isHot":true},"recommendAlbums":{"ret":0,"maxPageId":250,"count":1000,"list":[{"id":232357,"title":"今晚80后脱口秀 2014","coverSmall":"http://fdfs.xmcdn.com/group4/M01/19/5A/wKgDtFMsAq3COyRPAAUQ_GUt96k211_mobile_small.jpg","playsCounts":29318050},{"id":287570,"title":"大漠谣(风中奇缘)","coverSmall":"http://fdfs.xmcdn.com/group4/M07/7D/90/wKgDtFRGQFPzpmIsAAQ3HgQ6JRU598_mobile_small.jpg","playsCounts":669091},{"id":214706,"title":"段子来了 采采","coverSmall":"http://fdfs.xmcdn.com/group3/M04/64/9D/wKgDsVJ6DnSy_6Q7AAEXoFUKDKE679_mobile_small.jpg","playsCounts":29},{"id":233577,"title":"财经郎眼 2014","coverSmall":"http://fdfs.xmcdn.com/group2/M02/4E/2F/wKgDsFLTVG7RU3ZQAAPtxcqJYug831_mobile_small.jpg","playsCounts":8877870}]}}

 

有了数据就需要解析数据。接口数据为JSON格式,这里使用了FluentJson这个开源项目,可以把类与JSON数据互相转换。官网上有相关的源码和实例,可以下载看一下。下面介绍使用方法。

就针对上面的那个发现也接口我定义了一个类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XIMALAYA.PCDesktop.Core.Models.Album;
using XIMALAYA.PCDesktop.Core.Models.Category;
using XIMALAYA.PCDesktop.Core.Models.FocusImage;
using XIMALAYA.PCDesktop.Core.Models.Subject;
using XIMALAYA.PCDesktop.Core.Models.User;namespace XIMALAYA.PCDesktop.Core.Models.Discover
{public class SuperExploreIndexResult : BaseResult{/// <summary>/// 焦点图/// </summary>public FocusImageResult FocusImages { get; set; }/// <summary>/// 分类/// </summary>public CategoryResult Categories { get; set; }/// <summary>/// 最后一个专题/// </summary>public object LatestSpecial { get; set; }/// <summary>/// 最后一个活动/// </summary>public object LatestActivity { get; set; }/// <summary>/// 推荐专辑/// </summary>public AlbumInfoResult1 Albums { get; set; }public SuperExploreIndexResult(): base(){this.doAddMap(() => this.FocusImages, "focusImages");this.doAddMap(() => this.Categories, "categories");this.doAddMap(() => this.LatestActivity, "latest_activity");this.doAddMap(() => this.LatestSpecial, "latest_special");this.doAddMap(() => this.Albums, "recommendAlbums");}}
}
View Code

 这个SuperExploreIndexResult类的构造函数对应了接口数据中的射影关系。

生成的映射类如下:

// <auto-generated>
//     此代码由工具生成。
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
//        如存在本生成代码外的新需求,请在相同命名空间下创建同名分部类实现 SuperExploreIndexResultConfigurationAppend 分部方法。
// </auto-generated>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;using FluentJson.Configuration;
using FluentJson;
using XIMALAYA.PCDesktop.Core.Data.Decorator;
using XIMALAYA.PCDesktop.Core.Models.Discover;namespace XIMALAYA.PCDesktop.Core.Data
{/// <summary>///     SuperExploreIndexResult/// </summary>/// <typeparam name="T"></typeparam>public partial class SuperExploreIndexResultDecorator<T> : Decorator<T>{partial void doAddOtherConfig();/// <summary>///     /// </summary>/// <typeparam name="result"></typeparam>public SuperExploreIndexResultDecorator(Result<T> result): base(result){}/// <summary>///     /// </summary>/// <typeparam name="result"></typeparam>public override void doAddConfig(){base.doAddConfig();this.Config.MapType<SuperExploreIndexResult>(map => map.Field<System.Int32>(field => field.Ret, type => type.To("ret")).Field<System.String>(field => field.Message, type => type.To("msg")).Field<XIMALAYA.PCDesktop.Core.Models.FocusImage.FocusImageResult>(field => field.FocusImages, type => type.To("focusImages")).Field<XIMALAYA.PCDesktop.Core.Models.Category.CategoryResult>(field => field.Categories, type => type.To("categories")).Field<System.Object>(field => field.LatestActivity, type => type.To("latest_activity")).Field<System.Object>(field => field.LatestSpecial, type => type.To("latest_special")).Field<XIMALAYA.PCDesktop.Core.Models.Album.AlbumInfoResult1>(field => field.Albums, type => type.To("recommendAlbums")));this.doAddOtherConfig();}}
}
View Code

这里只列出了一个SuperExploreIndexResult类,还有CategoryResult,FocusImageResult,AlbumInfoResult1这三个类,也做了同样的映射。这样这个接口的数据最终就可以映射为SuperExploreIndexResult类了。总之,把接口中JSON数据中的对象是全部需要隐射的。

下面演示了如何调用上面的映射类。代码中所有带Decorator后缀的类都是映射类。采用了下装饰模式。

using System;
using System.ComponentModel.Composition;
using FluentJson;
using XIMALAYA.PCDesktop.Core.Data;
using XIMALAYA.PCDesktop.Core.Data.Decorator;
using XIMALAYA.PCDesktop.Core.Models.Discover;
using XIMALAYA.PCDesktop.Core.Models.Tags;
using XIMALAYA.PCDesktop.Untils;namespace XIMALAYA.PCDesktop.Core.Services
{/// <summary>/// 发现页接口数据/// </summary>[Export(typeof(IExploreService))]class ExploreService : ServiceBase<SuperExploreIndexResult>, IExploreService{#region 属性private ServiceParams<SuperExploreIndexResult> SuperExploreIndexResult { get; set; }#endregion#region IExploreService 成员/// <summary>/// 获取发现首页数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="act"></param>/// <param name="param"></param>public void GetData<T>(Action<object> act, T param){Result<SuperExploreIndexResult> result = new Result<SuperExploreIndexResult>();new SuperExploreIndexResultDecorator<SuperExploreIndexResult>(result);//分类new CategoryResultDecorator<SuperExploreIndexResult>(result);new CategoryDataDecorator<SuperExploreIndexResult>(result);//焦点图new FocusImageResultDecorator<SuperExploreIndexResult>(result);new FocusImageDataDecorator<SuperExploreIndexResult>(result);//推荐用户//new UserDataDecorator<SuperExploreIndexResult>(result);//推荐专辑new AlbumInfoResult1Decorator<SuperExploreIndexResult>(result);new AlbumData1Decorator<SuperExploreIndexResult>(result);//专题列表//new SubjectListResultDecorator<SuperExploreIndexResult>(result);//new SubjectDataDecorator<SuperExploreIndexResult>(result);this.SuperExploreIndexResult = new ServiceParams<SuperExploreIndexResult>(Json.DecoderFor<SuperExploreIndexResult>(config => config.DeriveFrom(result.Config)), act);//this.Act = act;//this.Decoder = Json.DecoderFor<SuperExploreIndexResult>(config => config.DeriveFrom(result.Config));try{this.Responsitory.Fetch(WellKnownUrl.SuperExploreIndex, param.ToString(), asyncResult =>{this.GetDecodeData<SuperExploreIndexResult>(this.GetDataCallBack(asyncResult), this.SuperExploreIndexResult);});}catch (Exception ex){this.SuperExploreIndexResult.Act.BeginInvoke(new SuperExploreIndexResult{Ret = 500,Message = ex.Message}, null, null);}}#endregion}
}
View Code

如上,只要配置好映射关系,通过T4模板我们可以生成对应的映射关系类。

附上源码

下篇,客户端使用了prism+mef这个框架,单独开发模块,最后组合的方式。未完待续。。。。

 

转载于:https://www.cnblogs.com/nicktyui/p/4126698.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聚合复合_聚合复合微生物菌剂的功能

不点蓝字关注我飞走啦&#xff01;在经营肥料上来讲&#xff0c;大家都知道做复合微生物菌剂&#xff0c;不仅可以活化疏松土壤&#xff0c;而且在各种作物上抗逆、防病、增产的效果都非常的好。问为什么说大家都要重点使用聚合微生物菌剂呢&#xff1f;答因为聚合微生物菌剂和…

代理模式详解(静态代理和动态代理的区别以及联系)

原文链接:https://www.cnblogs.com/takumicx/p/9285230.html 1. 前言 代理模式可以说是生活中处处可见。比如说在携程上定火车票,携程在这里就起到了一个代理的作用,比起我们在官网上或者直接去柜台订票&#xff0c;携程可以为用户提供更多人性化的选择。再比如代购,我自己的mb…

一个简单的HelloWorld程序

/* * 编译器:  VC6.0 * 类 型:  C语言 */ 1 #include <stdio.h>//#includes代表是C预处理指令,stdio.h代表是在此行位置键入了库文件stdio.h的完整内容,是标准输入输出头文件,< and >代表是直接从库文件加载stdio.h文件。2 3 intmain(void)//int代表此main…

sass 安装配置和使用

一、什么是SASSSASS在CSS的基础上做了一些扩展&#xff0c;使用SASS你可以使用一些简单的编程思想进来编写CSS。比如&#xff0c;SASS中可以定义变量、混合、嵌套以及 函数等功能。只不过SASS不像CSS&#xff0c;可以直接运用到项目中&#xff0c;如果你需要将样式运用到项目中…

为什么我的对象被 IntelliJ IDEA 悄悄修改了?

背景 最近&#xff0c;在复习JUC的时候调试了一把ConcurrentLinkedQueue的offer方法&#xff0c;意外的发现Idea在debug模式下竟然会 “自动修改” 已经创建的Java对象&#xff0c;当时觉得这个现象很是奇怪&#xff0c;现在把问题的原因以及解决过程记录下来&#xff0c;希望你…

​std::multimap

2019独角兽企业重金招聘Python工程师标准>>> std::multimap multimap,是一个关联性容器,用于存放这样的元素,这些元素是由键以及关联的值组成.容器内容将根据元素的键进行排序.并且容器可以插入多个具有相同键的元素.接口 pair<const_iterator,const_iterator>…

容器部署解决方案Docker

一、Docker简介 1.1 虚拟化 【什么是虚拟化】 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&…

BREW做的第一个程序--Hello world!

这几天开始做BREW开发了&#xff0c;刚开始挺晕的。又是C指针&#xff0c;又是BREW的SDK文档&#xff0c;还有环境配置&#xff0c;一大堆东东&#xff0c;真是让人手忙脚乱。好不容易配好了环境&#xff0c;写出了第一个Hello world!程序。感觉还不错&#xff0c;就把代码和想…

careercup-链表 2.1

2.1 编写代码&#xff0c;移除未排序链表中的重复节点。 不使用临时缓存&#xff1a; 如果不允许使用临时的缓存(即不能使用额外的存储空间)&#xff0c;那需要两个指针&#xff0c; 当第一个指针指向某个元素时&#xff0c;第二个指针把该元素后面与它相同的元素删除&#xff…

随机排列_“按字母顺序排列”其实是种随机顺序

闲话之前有聊过&#xff0c;微信公众号这边接的广告不多&#xff0c;主要收益来自于微信自带的中插广告。后来同学们还开玩笑说“研究半天没发现这个图片哪里没品了&#xff0c;才发现是广告。”另外还有一部分收益&#xff0c;来自于各位的打赏。鉴于大部分人都是打赏一两块钱…

android 获取应用的资源id和uri

2019独角兽企业重金招聘Python工程师标准>>> 在某些应用中&#xff0c;为了实现应用apk资源放入重复利用&#xff0c;或者使用反射得到本应用的资源&#xff0c;需要使用反射反射方式获得&#xff0c;但Resources类中也自带了这种获取方式&#xff0c;并且功能更加强…

(SQL语句)按指定时间段分组统计

我现在有一张表&#xff1a; 列名1 时间 03174190188 2009-11-01 07:17:39.217 015224486575 2009-11-01 08:01:17.153 013593006926 2009-11-12 08:04:46.560 013599584239 2009-11-22 08:53:27.763 013911693526 2009-11-23 08:53:51.683 013846472440 2009…

数据库迁移_数据库迁移了解一下

mongodb数据迁移因服务器到期&#xff0c;需要将之前机器上面的数据进行数据迁移&#xff0c;并将服务全部docker化备份首先需要将现有即将到期的服务器上面的mongo数据进行备份mongodump -h dbhost -d dbname -o dbdirectory-h&#xff1a;mongodb所在服务器地址&#xff0c;可…

人脸颜值评分软件_在线算个颜值,特科学的那种 | 知多少

用 AI&#xff0c;科学的为颜值打个分。用 AI&#xff0c;打造科学颜值打分器https://www.zhihu.com/video/1185672892095848448图文版本送给不方便打开的朋友 (●u●)」如何科学的为颜值打个分&#xff1f;三庭五眼、四高三低&#xff1f;脸部是否对称&#xff1f;是否与本民族…

图片翻转

图片翻转 原文:图片翻转本人录制技术视频地址&#xff1a;https://edu.csdn.net/lecturer/1899 欢迎观看。这一节继续为大家介绍CSS3的动画效果: 图片翻转。 在iOS中的章节中&#xff0c;我也介绍过类似的效果&#xff0c;如果感兴趣的话&#xff0c;请点击这里查看&#xff1a…

【原】页面跳转以及表单提交中有中文的解决办法

这两天一直碰到一个郁闷的问题&#xff0c;在对表单进行提交的时候&#xff0c;用户名是中文的&#xff0c;怎么测试都不通过, 今天上午突然想起来是不是因为中文字符编码的问题!经过测试&#xff0c;果然是因为这个问题&#xff01; 现在把解决方法贴出来&#xff01;呵呵&…

实验吧之NSCTF misc250

下载的是一个流&#xff0c;用wireshark打开&#xff0c;由于原题是这样的&#xff1a;小绿在学习了wireshark后&#xff0c;在局域网内抓到了室友下载的小东东0.0 你能帮他找到吗&#xff1f;说明我们应该重点关注http传送的东西&#xff1a; 这里面一共有四个http文件&#x…

西澳大学商科专业排名_澳洲西澳大学优势专业排名多少

澳洲西澳大学优势专业排名多少西澳大学农业和林业专业在2018年QS世界排名中排名第32西澳大学解剖学和生理学专业在2018年QS世界排名中排名第13西澳大学地球与海洋科学专业在2018年QS世界排名中排名第32西澳大学土木结构工程专业在2018年QS世界排名中排名第37西澳大学矿产和采矿…

基于SOUI开发的应用展示

本页面列出基于SOUI开发的产品 欢迎使用SOUI的朋友提供资源&#xff1a;setoutsoft#qq.com #-> U大师 http://www.udashi.com EiisysIM: 是一款为工作场景而设计的企业即时通讯软件, &#xff0c;含PC版和手机版。具有完善的即时通讯、文件传输、语音通话等功能。通讯录由企…

供应商寄售库存管理_【论文解读】物流联合外包下库存管理模式对供应链运作的影响...

物流联合外包下库存管理模式对供应链运作的影响作者&#xff1a;冯颖&#xff0c;林晴&#xff0c;张景雄&#xff0c;张炎治目录 1 引言2 问题描述3 数学模型4 协调模型5 数值算例6 结论1 引言传统库存管理模式下&#xff0c;供应链中各节点企业的库存管理各自为政&#xff0c…