文档章节

【java程序员理解HTTP】【6】实践--java 中几种模拟 http 请求的方式

k
 karma123
发布于 2018/08/15 19:46
字数 1084
阅读 74
收藏 2

「深度学习福利」大神带你进阶工程师,立即查看>>>

几种方式或说方案

Jdk本身提供 java.net 包的 HttpURLConnection

Apache提供HttpClient

Spring Web提供RestTemplate

以上都可以在java代码中模拟实现http请求,是随着技术的进步出来的,总体上越来越方便了,以后也可能会出现更高级、更方便的发起http请求的工具类。

Jdk本身提供 java.net 包的 HttpURLConnection

因为是jdk自带的,所以maven中不需要引入任何东西可以直接使用。

Apache提供HttpClient

Maven中需要引入apache相关包

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpclient</artifactId>

<version>4.3.5</version>

</dependency>

Spring Web提供RestTemplate

org.springframework.web.client.RestTemplate

项目中只需要加入spring-web的依赖就可以了。

★自己实践

背景及要求:get方式实现登录获取用户信息

启动本机的某项目。访问登录链接,从其返回信息中获取用户真实姓名realName信息。链接如下:

http://localhost:1008/LoginService/login?userName=admin&password=123

返回结果信息

{

  "resultCode" : 0,

  "result" : {

    "userId" : 1,

    "userName" : "admin",

    "realName" : "admin",

    "password" : "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3",

    "isEnabled" : "1",

    "mobilePhone" : null,

    "createUser" : "sys",

    "createDate" : "1970-01-01 00:00:00.0",

    "updateUser" : "sys",

    "updateDate" : "1970-01-01 00:00:00.0",

    "expireDate" : "2050-01-01 00:00:00.0"

  },

  "msgId" : "6388f2f2-1fa8-42dc-b7dc-f650a5589ae1",

  "errorMsg" : null

}

HttpURLConnection实现get请求

package com.ding.thirdService.httpURLConnection;


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.URL;

import java.net.URLConnection;

import java.util.Map;


import org.json.JSONException;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;


import com.alibaba.fastjson.JSON;


/**

 *

 * Description:使用 java.net 包的 HttpURLConnection 模拟 http 请求

 *

 */

@RestController

@RequestMapping(value = "/javanet")

public class HttpURLConnectionController {


    @RequestMapping(value = "/call")

    public String call(@RequestParam(value = "userName") String userName,@RequestParam(value = "password") String password) throws JSONException, IOException {

    

     URL url = new URL("http://localhost:1008/LoginService/login?userName="+ userName + "&password=" + password);//如果有参数,在网址中携带参数

        URLConnection conn = url.openConnection();

        InputStream is = conn.getInputStream();

        InputStreamReader isr = new InputStreamReader(is);

        BufferedReader br = new BufferedReader(isr);

        

        String line;

        StringBuilder builder = new StringBuilder();

        while((line=br.readLine())!=null){

              builder.append(line);

        }

        br.close();

        isr.close();

        is.close();

        

        String data = builder.toString();

        

        System.out.println(data);

        

        if(data == null || data.length() == 0){

         return "未获取数据";

        }



/**

 * 数据的接收的处理

 */


//判断请求是否成功JSONObject

        Map<?, ?> maps = (Map<?, ?>)JSON.parse(data);

String resultCode = String.valueOf(maps.get("resultCode"));

//失败了

if(!(null != resultCode && resultCode.contains("0"))){

return "获取失败";

}


/**

 * 成功的话则返回自定义的数据格式

 */

String detail = String.valueOf(maps.get("result"));

Map<?, ?> d = (Map<?, ?>)JSON.parse(detail);

return JSON.toJSONString(d.get("realName"));


    }

}

HttpClient方式实现get请求

package com.ding.thirdService.httpClient;


import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.Map;


import org.json.JSONException;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;


import com.alibaba.fastjson.JSON;


/**

 *

 * Description:使用 Apache 包的 HttpClient 模拟 http 请求

 *

 */

@RestController

@RequestMapping(value = "/client")

public class HttpClientController {


@RequestMapping(value = "/call")

public String call(@RequestParam(value = "userName") String userName,@RequestParam(value = "password") String password)

throws JSONException, IOException {


// 如果有参数,在网址中携带参数

URL url = new URL("http://localhost:1008/LoginService/login?userName="+ userName + "&password=" + password);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.addRequestProperty("encoding", "UTF-8");

conn.setDoInput(true);

conn.setDoOutput(true);

conn.setRequestMethod("POST");


OutputStream os = conn.getOutputStream();

OutputStreamWriter osw = new OutputStreamWriter(os);

BufferedWriter bw = new BufferedWriter(osw);


bw.write("向服务器传递的参数");

bw.flush();


InputStream is = conn.getInputStream();

InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);

String line;

StringBuilder builder = new StringBuilder();

while ((line = br.readLine()) != null) {

builder.append(line);

}


String data = builder.toString();

// 关闭资源

System.out.println(data);


if(data == null || data.length() == 0){

return "未获取数据";

}


/**

 * 数据的接收的处理

 */


// 判断请求是否成功JSONObject

Map<?, ?> maps = (Map<?, ?>)JSON.parse(data);

String resultCode = String.valueOf(maps.get("resultCode"));

//失败了

if(!(null != resultCode && resultCode.contains("0"))){

return "获取失败";

}


/**

 * 成功的话则返回自定义的数据格式

 */

String detail = String.valueOf(maps.get("result"));

Map<?, ?> d = (Map<?, ?>)JSON.parse(detail);

return JSON.toJSONString(d.get("realName"));


}

}

RestTemplate方式实现get请求

package com.ding.thirdService.restTemplate;


import java.util.Map;


import org.json.JSONException;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;


import com.alibaba.fastjson.JSON;


/**

 *

 * Description:RestTemplate 使用

 *

 */

@RestController

@RequestMapping(value = "/restTemplate")

public class RestTemplateController {


@Autowired

private RestTemplate restTemplate;


/**

 *

 * Description:RestTemplate 使用

 * @param userName

 * @param password

 * @return

 * @throws JSONException

 */

    @RequestMapping(value = "/call")

    public String call(@RequestParam(value = "userName") String userName,@RequestParam(value = "password") String password) throws JSONException {

    

     String u = "http://localhost:1008/LoginService/login?userName="+ userName + "&password=" + password;


/**

 * String格式接收数据

 */

String data = null;

try{

data = restTemplate.getForObject(u,String.class);

}catch(Exception e){

return e.toString();

}


System.out.println(data);



/**

 * 数据的接收的处理

 */


//判断请求是否成功JSONObject

Map<?, ?> maps = (Map<?, ?>)JSON.parse(data);

String resultCode = String.valueOf(maps.get("resultCode"));

//失败了

if(!(null != resultCode && resultCode.contains("0"))){

return "获取失败";

}


/**

 * 成功的话则返回自定义的数据格式

 */

String detail = String.valueOf(maps.get("result"));

Map<?, ?> d = (Map<?, ?>)JSON.parse(detail);

return JSON.toJSONString(d.get("realName"));


    }

    

    @RequestMapping(value = "/call2")

    public Integer call2(@RequestParam(value = "jsonString") String jsonString) throws JSONException {

     return 2;

    }

}

RestTemplate配置类

package com.ding.thirdService.restTemplate.config;


import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.http.client.ClientHttpRequestFactory;

import org.springframework.http.client.SimpleClientHttpRequestFactory;

import org.springframework.web.client.RestTemplate;


@Configuration

public class RestTemplateConfig{

    @Bean

    public RestTemplate restTemplate(ClientHttpRequestFactory factory){

        return new RestTemplate(factory);

    }

    

    @Bean

    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){

        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();

        factory.setReadTimeout(5000);//ms

        factory.setConnectTimeout(15000);//ms

        return factory;

    }

}

三者请求结果一样

k
粉丝 7
博文 96
码字总数 70452
作品 0
丰台
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.7K
7
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
6
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.2K
3
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6K
18

没有更多内容

加载失败,请刷新页面

加载更多

这是对我最大的认可和鼓励

这是程序员cxuan的第18篇原创分享 可能一些小伙伴们不太清楚是怎么回事,是这样的。 我最近肝了三本 PDF,分别是 《Java核心技术总结》、《HTTP核心总结》、《程序员必知的硬核知识》、目录如...

osc_nc5ghpm9
5分钟前
0
0
折叠屏丨华为专家深度解读折叠屏连续性和拖拽适配介绍

折叠屏手机的出现,满足了用户对大屏幕的追求,但卓越的用户体验更离不开应用的适配与功能创新。距离Mate X面世已经一年的时间,应用适配情况如何?在适配过程中有哪些经验可以参考?有没有常...

软件绿色联盟
今天
0
0
一个 static 还能难得住我?

这是程序员cxuan的第15期原创分享 static 是我们日常生活中经常用到的关键字,也是 Java 中非常重要的一个关键字,static 可以修饰变量、方法、做静态代码块、静态导包等,下面我们就来具体聊...

osc_p23q7y3z
7分钟前
0
0
高中生写LOL外挂1年狂赚500万,落网前刚买下120万保时捷...

点击“开发者技术前线”,选择“星标🔝” 在看|星标|留言, 真爱 来源:交汇点| 编辑:可可 2020年3月,泰州姜堰警方接到一起特殊的报警:一名游戏玩家向民警反映,自己在玩英雄联盟对战时输...

开发者技术前线
今天
0
0
一次简单的服务器 cpu 占用率高的快速排查实战

前两天,朋友遇到一个线上 cpu 占用率很高的问题,我们俩一起快速定位并解决了这个问题。在征求朋友同意后,特发此文分享整个过程。本文以对话的形式展开,加上我的内心独白。文中对话与实际...

osc_emo7t12i
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部