【原生态】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请求,并返回数据,这里请求的是网页,所以返回的都是些 ...
随机推荐
- Difference between WCF and Web API and WCF REST and Web Service
The .Net framework has a number of technologies that allow you to create HTTP services such as Web S ...
- Font Squirrel
Font Squirrel FontSquirrel:国外免费字体下载网是一个提供高质量商业字体下载网站,提供海量的英文字体库,用户可以随意下载并应用于各种商业用字,无需考虑其版权问题. 官网地址:h ...
- <input>和<textarea>
作为一个刚刚涉足PHP开发的菜鸟,第一次使用博客.在这里分享一些经验给和需要的朋友,互相探讨.共同学习,希望对你有所帮助. 废话不多说,下面进入正题. 应该有朋友和我一样,需要用到文本框,要求它会自动 ...
- 关于ARC下需要dealloc的相关内容
今天在项目中使用KVO添加观察者模式的时候,在返回上一级的时候竟然崩了.可是,看了很久,代码没有问题.最后,终于知道了需要添加dealloc 防止以后再出错,所以,便纪录下来.关于ARC下需要手动释放 ...
- 关于call和apply函数的区别及用法
call和apply函数是function函数的基本属性,都可以用于更改函数对象和传递参数,是前端工程师常用的函数.具体使用方法请参考以下案列: 例如: 申明函数: var fn = function ...
- WIN32 窗口类封装 框架实现部分
上面已经讲了窗口封装部分,内容可点击:http://www.cnblogs.com/mengdejun/p/4010320.html,下面分享框架部分内容,完成WINDOWS消息迭代 CQFrameW ...
- Odoo 二次开发教程(四)-只读、唯一性验证和ORM方法介绍
一.只读和唯一性验证 只读的设置有两种方法,一种是实在字段定义时设置为只读,第二种是在页面视图中进行设置. 接前例,我们将学生(tech.student)的名字name字段设置成只读. 方法一:字段定 ...
- Python之路第一课Day7--随堂笔记(面向对象编程进阶...未完待续 )
本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 一.静态方法 通过@s ...
- HDU2433 BFS最短路
Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- FastReport.Net 常用功能总汇
一.常用控件 文本框:输入文字或表达式 表格:设置表格的行列数,输入数字或表达式 子报表:放置子报表后,系统会自动增加一个页面,你可以在此页面上设计需要的报表.系统在打印处理时,先按主报表打印,当碰到 ...