【原生态】Http请求数据 与 发送数据
今天项目组小弟居然问我怎么用java访问特定的地址获取数据和发送请求
Http请求都是通过输入输出流来进行操作的,首先要制定GET或者POST,默认是GET,在安全和数据量较大情况下请使用post
根据url建立链接,读取输入输出流,从中取得相应的返回数据,
http是无序的,在安全性极高的地方请使用https,但是https传输效率差不多只是http的1/10,所以除非特别必要,请谨慎选择
我将我以前写的微信开发代码贴一部分出来,这里就有根据地址获取请求数据和向某一个特定端口发送数据
package com.xiao.weixin.service.impl; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; import javax.annotation.Resource; import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import com.xiao.weixin.common.jdbc.DataSource;
import com.xiao.weixin.dao.WeixinApiMapper;
import com.xiao.weixin.entity.AccessToken;
import com.xiao.weixin.service.WeixinApiService;
import com.xiao.weixin.utils.ApiUrl;
import com.xiao.weixin.utils.CommonUtil;
import com.xiao.weixin.utils.DateUtil; @Service(value = "weixinApiService")
public class WeixinApiServiceImpl implements WeixinApiService { private Logger log = LoggerFactory.getLogger(WeixinApiServiceImpl.class); @Value("${weixin.appID}")
private String appID; @Value("${weixin.appsecret}")
private String appsecret; @Value("${weixin.menu}")
private String menuString; @Value("${weixin.token}")
private String weixinToken; @Resource
private WeixinApiMapper weixinApiMapper; @Override
@DataSource
public String getAccessToken() {
String access_token = null;
try {
AccessToken token = weixinApiMapper.findToken();// 数据库查找没过期的token并返回
if (token != null) {
access_token = token.getAccessToken();
}
} catch (Exception e) {
log.error("获取accessToken出错");
e.printStackTrace();
}
log.debug("获取到的accessToken是:" + access_token);
return access_token;
} @Override
public void refreshAccessToken() {
log.debug("重新生成accessToken开始");
try {
String url = ApiUrl.GET_ACCESSTOKEN.replace("APPID", appID)
.replace("APPSECRET", appsecret);
log.debug("重新获取token的请求地址为:" + url);
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);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); 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");
System.out.println("message:" + message);
JSONObject json = new JSONObject(message);
String access_token = json.getString("access_token");
Integer expiresIn = json.getInt("expires_in");
log.debug("重新生成accessToken结束 成功"); // 根据取得的accessToken 来获取jsapi_ticket
String ticketUrl = ApiUrl.GET_JSAPITICKET.replace("ACCESSTOKEN",
access_token);
log.debug("重新获取jsapi_ticket的请求地址为:" + ticketUrl);
URL ticketUrlGet = new URL(ticketUrl);
HttpURLConnection tickeHttp = (HttpURLConnection) ticketUrlGet
.openConnection(); tickeHttp.setRequestMethod("GET");
tickeHttp.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
tickeHttp.setDoOutput(true);
tickeHttp.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); tickeHttp.connect(); InputStream tickeIs = tickeHttp.getInputStream();
byte[] tickeJsonBytes = new byte[tickeIs.available()];
tickeIs.read(tickeJsonBytes);
String tickeMessage = new String(tickeJsonBytes, "UTF-8");
System.out.println("message:" + message);
JSONObject ticketJson = new JSONObject(tickeMessage);
String ticket = ticketJson.getString("ticket"); AccessToken accessToken = new AccessToken();
accessToken.setAppId(appID);
accessToken.setSecret(appsecret);
accessToken.setAccessToken(access_token);
accessToken.setJsApiTicket(ticket);
accessToken.setExpireTime(DateUtil.getExpiresTime(expiresIn));
accessToken.setCreateTime(new Date());
weixinApiMapper.insertToken(accessToken);// 将新生成的token保存到数据库
} catch (Exception e) {
log.error("获取accessToken出错");
e.printStackTrace();
}
} @Override
public String createMenu() {
String access_token = getAccessToken();
String url = ApiUrl.CREATE_MENU.replace("ACCESSTOKEN", access_token);
log.debug("创建菜单的请求地址为:" + url);
try {
log.debug("menuString:" + menuString);
URL urlPost = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlPost
.openConnection();
http.setRequestMethod("POST");
http.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); http.connect();
OutputStream os = http.getOutputStream();
os.write(menuString.getBytes("UTF-8"));
os.flush();
os.close(); InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
return message;
} catch (MalformedURLException e) {
e.printStackTrace();
return "-1";
} catch (IOException e) {
e.printStackTrace();
return "-1";
}
} @Override
public Map<String, String> getSignature(String url) {
Map<String, String> map = new HashMap<String, String>();
try {
String jsapi_ticket = getJsApiTicket();
String nonceStr = "Wm3WZYTPz0wzccnW";
long timestamp = System.currentTimeMillis() / 1000; map.put("appId", appID);
map.put("timestamp", timestamp + "");
map.put("nonceStr", nonceStr); String[] paramArr = new String[] { "jsapi_ticket=" + jsapi_ticket,
"timestamp=" + timestamp, "noncestr=" + nonceStr,
"url=" + url };
Arrays.sort(paramArr);
String content = paramArr[0].concat("&" + paramArr[1])
.concat("&" + paramArr[2]).concat("&" + paramArr[3]);
log.debug("拼接之后的content为:" + content);
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(content.toString().getBytes());
String gensignature = CommonUtil.byteToStr(digest);
map.put("signature", gensignature);
return map;
} catch (Exception e) {
e.printStackTrace();
log.error("获取JSAPI签名信息失败,错误信息:" + e);
return null;
}
} @Override
public String getJsApiTicket() {
String jsApiTicket = null;
try {
AccessToken token = weixinApiMapper.findToken();// 数据库查找没过期的token并返回
if (token != null) {
jsApiTicket = token.getJsApiTicket();
}
} catch (Exception e) {
log.error("获取jsApiTicket出错");
e.printStackTrace();
}
log.debug("获取到的jsApiTicket是:" + jsApiTicket);
return jsApiTicket;
} }
【原生态】Http请求数据 与 发送数据的更多相关文章
- python实用脚本-定时导出数据库中的数据并且发送数据到邮箱
1.发送邮件脚本 #coding=utf-8 import smtplib from email.header import Header from email.mime.text import MI ...
- 一文搞懂 Netty 发送数据全流程 | 你想知道的细节全在这里
欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 在<Netty如何高效接收网络数据 ...
- HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Query通过Ajax向PHP服务端发送请求并返回JSON数据
Query通过Ajax向PHP服务端发送请求并返回JSON数据 服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据.本文将通过实例演示了jQuer ...
- (三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
文章来源:http://www.cnblogs.com/smyhvae/p/4006009.html 一.GET和POST的对比: 在漫长的时间当中,其他的方法逐渐的退出了历史舞台,最常用的只剩下GE ...
- Android使用HttpUrlConnection请求服务器发送数据详解
HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
讲这个之前,我们先来说说get和post两种请求的区别吧!!! 1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=te ...
- 安卓中使用OkHttp发送数据请求的两种方式(同、异步的GET、POST) 示例-- Android基础
1.首先看一下最终效果的截图,看看是不是你想要的,这个年代大家都很忙,开门见山很重要! 简要说下,点击不同按钮可以实现通过不同的方式发送OkHttp请求,并返回数据,这里请求的是网页,所以返回的都是些 ...
随机推荐
- Struts2中跳转问题
struts2 跳转类型 result type=chain.dispatcher.redirect(redirect-action) dispatcher 为默认跳转类型,用于返回一个视图资源(如: ...
- 如果你想真正了解Struts2,不妨可以进来看看
首先我们就一起来认识认识Struts2到底是什么?作为框架,它又是用来处理哪些问题的呢?正所谓脚踏实地走,即时离梦想会远一点,但却很真实,那我们就一步一步的来了解Struts2吧! 一.既然 ...
- nodejs 模块恩仇录
anywhere 一句话:随时随地将你的当前目录变成一个静态文件服务器的根目录. 安装 npm install anywhere -g anywhere -h localhost -p 8060 fa ...
- U盘安装Ubuntu 10.4 Server
试了几次的U盘安装Ubuntu Server失败后,只能求助网络了,找了半天终于安装成功了.问题就是虽然从U盘启动了安装程序,但是在系统安装到一半的过程中,会进行CD-ROM的检查,检查不到安装程序, ...
- 如何在Windows7上完全卸载Oracle 11g(转)
http://blog.csdn.net/haishu_zheng/article/details/19180081
- 禁用nested loop join里的spool
禁用nested loop join里的spool 转载自: https://blogs.msdn.microsoft.com/psssql/2015/12/15/spool-operator-and ...
- CYQ.Data V5 数据库读写分离功能介绍
前言 好多年没写关于此框架的新功能的介绍了,这些年一直在默默地更新,从Nuget上的记录就可以看出来: 这几天在看Java的一些东西,除了觉的Java和.NET的相似度实在太高之外,就是Java太原始 ...
- 剑指Offer面试题:28.连续子数组的最大和
一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3 ...
- 关于printf错用格式化字符串导致double和long double输出错误的小随笔
[题外话] 以前用HUSTOJ给学校搭建Online Judge,所有的评测都是在Linux下进行的.后来为了好往学校服务器上部署,所以大家重新做了一套Online Judge,Web和Judge都是 ...
- 我的LESS编译方案
背景 近期项目前端决定使用less,简单介绍一下,详细信息有兴趣查看官方文档(http://www.lesscss.net/article/home.html) LESSCSS是一种动态样式语言,属于 ...