今天项目组小弟居然问我怎么用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请求数据 与 发送数据的更多相关文章

  1. python实用脚本-定时导出数据库中的数据并且发送数据到邮箱

    1.发送邮件脚本 #coding=utf-8 import smtplib from email.header import Header from email.mime.text import MI ...

  2. 一文搞懂 Netty 发送数据全流程 | 你想知道的细节全在这里

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 在<Netty如何高效接收网络数据 ...

  3. HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。

    什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...

  4. Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  5. Query通过Ajax向PHP服务端发送请求并返回JSON数据

    Query通过Ajax向PHP服务端发送请求并返回JSON数据 服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据.本文将通过实例演示了jQuer ...

  6. (三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

    文章来源:http://www.cnblogs.com/smyhvae/p/4006009.html 一.GET和POST的对比: 在漫长的时间当中,其他的方法逐渐的退出了历史舞台,最常用的只剩下GE ...

  7. Android使用HttpUrlConnection请求服务器发送数据详解

    HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...

  8. Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)

    讲这个之前,我们先来说说get和post两种请求的区别吧!!! 1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=te ...

  9. 安卓中使用OkHttp发送数据请求的两种方式(同、异步的GET、POST) 示例-- Android基础

    1.首先看一下最终效果的截图,看看是不是你想要的,这个年代大家都很忙,开门见山很重要! 简要说下,点击不同按钮可以实现通过不同的方式发送OkHttp请求,并返回数据,这里请求的是网页,所以返回的都是些 ...

随机推荐

  1. php中echo(),print(),print_r(),var_dump()间的区别

    echo()函数:输出一个或多个字符串.实际上它并不是一个函数,所以不必对它使用括号,直接用echo就行.然而,如果您希望向echo()传递一个以上的参数,使用括号将会生成解析错误.echo()函数比 ...

  2. 简单谈谈如何利用h5实现音频的播放

    作者:白狼 出处:http://www.manks.top/article/h5_audio本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律 ...

  3. [Android] 多重使用Fragment 中的onFragmentInteraction

    新建的一个Fragment,被一个Activity使用,那么这个Activity需要继承一个接口: public class MainActivity extends Activity impleme ...

  4. ADO.NET数据访问模板整理

    /// <summary> /// 数据访问类:hi_test /// </summary> public partial class TestDA { public Test ...

  5. System.Dynamic.ExpandoObject 类型的简单使用

    该类型可以实现的是动态添加属性和移除属性,有点类似 js 中对象的操作,非常灵活 static void Main(string[] args) { dynamic obj = new System. ...

  6. 使用epel源安装软件

    问题:centos提供的官方base源可能无法提供某些软件的安装,可以通过epel源 系统:centos6.5 x86_64 解决:安装epel源 #wget http://dl.fedoraproj ...

  7. mysql 命令行还原备份数据库

    通常数据库还原备份可以通过navicat等数据库管理工具进行,只需要简单的导出导入就行了,但遇到有索引外键的数据库,数据库管理工具运行.sql文件会报错,这时候可以尝试命令行导入,亲测可以成功 MyS ...

  8. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  9. Mybatis generator的使用

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...

  10. 一个基于jQuery的移动端条件选择查询插件(原创)

    下载插件 目前给出的下载是混淆了后的代码 愿意一起探讨的可以找我要源码 使用方式: var ConditionsChoose = $("#Screening").Condition ...