接⼊之获取⽤户头像的⽅法步骤
前段时间写了关于⽀付接⼊,顺便就把获取⽤户昵称,头像的⽅式也归纳下,这个其实挺简单的,具体的⽅法看官⽅⽂档即可。这⾥只提⼏个重点。
scope参数
看过⽂档的话,的规定是,对于scope参数,如果需要获取⽤户信息的话,scope参数为snsapi_userinfo。但是我接下来,使⽤过⼀次userinfo,实际上⽤snsapi_base也可以获得⽤户信息,⼀模⼀样的返回值,对于获取头像和昵称完全没有任何问题
获取头像
获取头像其实有⼀点⿇烦的就是跨域问题。要解决这个跨域问题,可以采⽤设置⼀个代理服务器,或者通过配置相关服务器(ngix,apache)来解决。这个⽹上⽅法很多,我这⾥说的是不通过配置服务器的⽅法。
在我们的项⽬中,我并不想使⽤配置⼀个web服务器或者代理,因为我们是游戏服务器,我们是⾃⼰实现的,并没有使⽤什么web服务器框架,那么这种情况下,我们解决跨域的问题就是由我们的服务器后端直接对跨域资源发起请求,在获得对应的资源后,再返回前端。OK,这就是具体⽅法
具体实现时,其实很简单,获取到头像的url后,直接发起⼀个http请求并获取返回即可。
注意:http请求⽅式为“GET”
另外需要提的⼀点是,对response的返回,要直接使⽤stream.Read,如果使⽤streamReader,以⽂本⽅式读取字节流读出来的数据是⽆法转成图⽚的。(我查阅过MSDN关于这两个接⼝的说明,只是读取时⼀个是⽂本形式,⼀个是字节流形式,其他并没有过多的说有什么区别)。
然后记得将字节流以Base64⽅式转换,交由我们的前端处理
request = HttpWebRequest.Create(url);
request.Method = "GET";
为什么换不了头像response = request.GetResponse();
stream = response.GetResponseStream();
var buffer = new byte[4096];
var num = stream.Read(buffer, 0, 4096);
var head = Convert.ToBase64String(buffer, 0, num);
stream.Dispose();
response.Close();
上⾯的代码有⼀个问题,我后来才注意到,就是当图⽚⽐较⼤的时候,⽐如头像地址最后的参数是64以上,或是/0(此时返回640*640⼤⼩的图⽚),这个时候,stream可能⼀次不能读取完所有的数据,所以修改代码为
var request = HttpWebRequest.Create(url);
request.Method = "GET";
var response = request.GetResponse();
var stream = response.GetResponseStream();
var buffer = new byte[response.ContentLength];
var num = stream.Read(buffer, 0, (int)response.ContentLength);
var total = num;
while(num > 0)
{
num = stream.Read(buffer, total, (int)(response.ContentLength - total));
total += num;
}
head = Convert.ToBase64String(buffer, 0, total);
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。