您的位置:首页 > 理论基础 > 计算机网络

使用httpclient4.3.2来实现微信临时素材的上传

2015-10-27 10:55 525 查看
   一直在用java来做微信的二次开发,经过一段时间的沉淀总算有了一点门路。其实用java这种强大的语言来做微信的二次开发是很简单的事情。只要解决了加密、https请求的发送、xml的解析这些基本的操作后,用java来进行微信二次开发就变的容易了很多。这里我主要上传一个用httpclient来实现多媒体素材上传的例子。当然也可以使用urlconnection来实现该功能。但是httpclient要简单的多也省心的多。废话不错,直接上代码了,代码注释很详细。
private static String up_temporary_url = "https://api.weixin.qq.com/cgi-bin/media/upload";
public static void httpsClient() throws Exception {// 获得utf-8编码的mbuilderMultipartEntityBuilder mBuilder = get_COMPATIBLE_Builder("UTF-8");/*** 原生的微信使用的url是https://api.weixin.qq.com/cgi-bin/media/upload?* access_token=##ACCESS_TOKEN##&type=##TYPE##* 一般都会使用这个把参数直接携带在url中。我个人不喜欢这样,因为既然使用了httpclient,完全可以把参数* 设置在我们的body体中。所以我们使用的url是这样的* https://api.weixin.qq.com/cgi-bin/media/upload 然后通过在body体中设置参数来设置* access_token和type这两个字段** */// 设置type,我这里用一个缩略图来做实验,所以type是thumbmBuilder.addTextBody("type", "thumb");// 设置access_token,mBuilder.addTextBody("access_token", getAccessToken());// 这里就是我要上传到服务器的多媒体图片mBuilder.addBinaryBody("media", getFile("d:/test.jpg"),ContentType.APPLICATION_OCTET_STREAM, getFile("d:/test.jpg").getName());// 建造我们的http多媒体对象HttpEntity he = mBuilder.build();// 建立一个sslcontext,这里我们信任任何的证书。SSLContext context = getTrustAllSSLContext();// 建立socket工厂SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(context);// 建立连接器CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(factory).build();try {// 得到一个post请求的实体HttpPost post = getMultipartPost();// 给请求添加参数post.setEntity(he);// 执行请求并获得结果CloseableHttpResponse reponse = client.execute(post);try {// 获得返回的内容HttpEntity entity = reponse.getEntity();// 输出System.out.println(EntityUtils.toString(entity));// 消耗实体EntityUtils.consume(entity);} finally {// 关闭返回的reponsereponse.close();}} finally {// 关闭clientclient.close();}}
	private static String getBoundaryStr(String str) {return "------------" + str;}private static File getFile(String path) {return new File(path);}private static MultipartEntityBuilder get_COMPATIBLE_Builder(String charSet) {MultipartEntityBuilder result = MultipartEntityBuilder.create();result.setBoundary(getBoundaryStr("7da2e536604c8")).setCharset(Charset.forName(charSet)).setMode(HttpMultipartMode.BROWSER_COMPATIBLE);return result;}private static String getAccessToken() {// 这里返回一个access_token,我在实际项目中是使用redis来缓存起来的。这里就直接返回了,要改成自己的哦return "PFKLPAJ6HqxylpsKM7CWUoFoKeQlvLRRfArUmR9QEji2uWIEh9qsbGQ0eEih8gsnKrtjoCME_PgPV2ut_Wt3XTNmoJLDycpjtID0KItfVk";}private static String getUrl() {return up_temporary_url;}private static HttpPost getMultipartPost() {/* 这里设置一些post的头部信息,具体求百度吧 */HttpPost post = new HttpPost(getUrl());post.addHeader("Connection", "keep-alive");post.addHeader("Accept", "*/*");post.addHeader("Content-Type", "multipart/form-data;boundary="+ getBoundaryStr("7da2e536604c8"));post.addHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");return post;}private static SSLContext getTrustAllSSLContext() throws Exception {SSLContext context = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() {@Overridepublic boolean isTrusted(X509Certificate[] arg0, String arg1)throws CertificateException {// 这一句就是信任任何的证书,当然你也可以去验证微信服务器的真实性return true;}}).build();return context;}
这是最后返回的结果,主要就是那个thumb_media_id了,用这个就可以给用户发送图片消息了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: