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;
    }

}
时间: 2024-08-12 03:03:31

Http请求数据 与 发送数据的相关文章

jQuery框架中$.ajax()的常用参数有哪些?写一个post请求并带有发送数据和返回数据的样例

sync是否异步 url请求地址 contentType发送信息至服务器时内容编码类型 data发送到服务器的数据 dataType预期服务器返回的数据类型 type请求类型 success请求成功回调函数 error请求失败回调函数 $.ajax({ url: "/jquery/test1.txt", type: 'post', data: { id: 1 }, success: function(data) { alert(data); } }

串口调试助手-发送数据,按字符或16进制显示接收数据的C#程序

一. 新手上路,一般几种方法来学习VS2010的C#编程: 1.查阅各种书籍和技术文档,传统而耗时: 2.借助视频教程快速上手,省事有效却无法掌握一些小细节,写起程序来,各种调试不通过,还是浪费时间: 3.直接采用网络大神的程序,在运行成功的前提下,再仔细消化各种精髓,方法虽然高效,但也是建立在作者编写文档友好的情况下. 对于以上的第一种适合那种不着急项目进度,只管自己开心满足自己兴趣的新手,第二种适合那种需要赶进度.不需要太注意小细节的项目,第三种属于技术渣,为了像我这种技术渣的新手们上路更轻

QTcpSocket 发送数据的几种方法

1.QTcpSocket 继承于QAbstractSocket继承于QIODevice 2.QTcpSocket 提供的几种接收和发送数据方法 write ( const char *, qint64 ) : qint64 write ( const char * ) : qint64 write ( const QByteArray & ) : qint64 writeData ( const char *, qint64 ) : qint64 read ( char * data, qint

向后端请求数据 以及像后端发送数据要求(删除数据和添加数据)

删除数据和添加数据只能后端操作 删除数据和添加数据都要用到的html(一)部分 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="../css/bootstrap.min.css"

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

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4006009.html 联系方式:[email protected] [系列]Android系列之网络:(持续更新) Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) Android系列之网络(二)----HTTP请求头与响应头 Android

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

什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request-response protocol(请求-回复协议)工作. GET - 从指定的服务器中获取数据 POST - 提交数据给指定的服务器处理 GET方法: 使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器: /test/demo_form.jsp?name1=value1

Android开发使用GET方式向服务器请求和发送数据

#1.首先先用新建个servlet处理登陆请求 代码如下.只实现了doGet方法 package com.wzw.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSe

Android开发使用POST方式向服务器请求和发送数据

前面说了GET方式.现在尝试一下POST #1.首先先用新建个servlet处理登陆请求 package com.wzw.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Ht

为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片?

能够完成整个 HTTP 请求+响应(尽管不需要响应内容) 触发 GET 请求之后不需要获取和处理数据.服务器也不需要发送数据 跨域友好 执行过程无阻塞 相比 XMLHttpRequest 对象发送 GET 请求,性能上更好 GIF的最低合法体积最小(最小的BMP文件需要74个字节,PNG需要67个字节,而合法的GIF,只需要43个字节) 参考资料:SegmentFault 上的回答Web beaconUsing a Beacon Image for GitHub, Website and Ema