发表于: 2017-11-17 10:55:05

4 700


今天做的事:


早上想起昨天的遗留问题,就查了查,这篇blog,茅塞有点开了:http://blog.csdn.net/acoolboy1984/article/details/1848700


看一下之前我的代码

public List<String> getAccessToken(){
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + WeChatConstant.AppID + "&secret=" + WeChatConstant.AppSecret;
   
   String accessToken = null;
   String expriesIn = null;
   List<String> another = new ArrayList<String>();
   
   try{
URL urlGet = new URL(url);
       HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
       //请求方法
       http.setRequestMethod("GET");
       http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
       http.setDoOutput(true);
       http.setDoInput(true);
       http.connect();

       InputStream is = http.getInputStream();
       int size = is.available();
       byte[] jsonBytes = new byte[size];
       is.read(jsonBytes);
       String message = new String(jsonBytes,"UTF-8");
       
       Gson gson = new Gson();
       AccessToken token = gson.fromJson(message,AccessToken.class);
       
       accessToken = token.getAccess_token();
       expriesIn = token.getExpires_in();

       System.out.println("accessToken : " + accessToken);
       System.out.println("expiresIn : " + expriesIn);
       
       another.add(accessToken);
       another.add(expriesIn);
       
   }catch (Exception e){
e.printStackTrace();
   }
return another;
}

一点点拆解。


简单的说我自己的理解:

1.URL直接对相关的网络链接操作(就是网络地址),其中包含,主机名称;端口号;资源路径。

新建的时候如下:

URL urlGet = new URL(url);

其中的url是一个可访问的链接

2.打开链接,使用openConnection(),

HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();

可见,HttpURLConnection是一个表示链接的对象,我们可以通过操作这个链接,来设置相关的属性,并且进行操作。

除了openConnection(),还有一个方法可以获取Internet访问,openStream()。

上面的openStream()方法只能读取网络资源,若要既能读取又能发送数据,则要用到URL类的openConnection()方法来创建一个 URLConnection类的对象,此对象在本地机和URL指定的远程节点建立一条HTTP协议的数据通道,可进行双向数据传输。

3.在对链接的输入流和输出流进行读写操作之前,需要使用

http.setDoOutput(true);
http.setDoInput(true);

来指定哪些链接是可以进行读写的。

4.然后进行连接,使用

http.connect();

建立连接成功,就可以对输入流进行相关的读操作。

5.获得输入流

InputStream is = http.getInputStream();

6.

int size = is.available();

然后看一下这个方法,可以说这个是很关键的一步,没它不行。

inputstream.available()方法返回的值是该inputstream在不被阻塞的情况下一次可以读取到的数据长度。如果数据还没有传输过来,那么这个inputstream势必会被阻塞,从而导致inputstream.available返回0。

所以说这个方法是保证没有出现阻塞,且正常传输的关键。

不过这方法也没有想象的那么简单,它获取的大小是一个估计值,具体情况还是百度或者看java的api(话说我基本都没怎么看过java的API文档,这个习惯很不好,需要改)

7.

byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes,"UTF-8");

然后就是读取内容,并且转换成对应的字符串。


至此,整个网络连接就完成了,我们通过对应的url以及设置相关方法和属性,并通过InputStream获取到输入流,最后读取转换。


算是对java web这块有了新的理解吧,接下来就搞openedID这块了,硬着头皮来吧。



搞完OpenId了,通过OpenId获取到用户的基本信息:

因为这块需要前端配合,但是前端暂时配合不了,所以通过另一种取巧的方法获取到OpenId

GET

"https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken + "&next_openid="

获取到关注公众号的所有用户的OpenId列表,然后把列表里的值取出来,在通过AccessToken和OpenId获取用户的基本信息。

GET

"https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + accessToken + "&openid=" + openId+ "&lang=zh_CN"

然后接受数据即可,效果图如下

我的基本信息都取出来了。


这里只要掌握了如何发起GET请求,并建立连接(昨天日报中写了),然后按照返回格式接受数据即可。


经过了进一周的学习,终于达到获取用户信息的目的了。


明天计划:接下来就剩微信上传图片,以及定时刷新AccessToken。这两块内容完成,基本的微信接口也就差不多了(项目需求就这么多)


问题:基本解决


收获:对于微信这块,稍微有点自信了。。。




返回列表 返回列表
评论

    分享到