java httpURL连接远程服务器并返回数据(httpurlconnection)

本文主要是介绍java httpURL连接远程服务器并返回数据(httpurlconnection),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java发送http请求 (get 与 post方法请求),以下代码经本人亲自调试可用!可以直接使用之。

注意:通过BufferedReader 读取远程返回的数据时,必须设置读取编码,否则中文会乱码!

package com.jiucool.www.struts.action;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;public class post_request {public static final String GET_URL = "http://www.cngolon.com/request.action?key=j0r56u2";public static final String POST_URL = "http://www.cngolon.com/request.action";
//get()请求public static void readContentFromGet() throws IOException{// 拼凑get请求的URL字串,使用URLEncoder.encode对特殊和不可见字符进行编码String getURL = GET_URL + "&activatecode=" + URLEncoder.encode("中国聚龙", "utf-8");URL getUrl = new URL(getURL);// 根据拼凑的URL,打开连接,URL.openConnection函数会根据URL的类型,// 返回不同的URLConnection子类的对象,这里URL是一个http,因此实际返回的是HttpURLConnectionHttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();// 进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到// 服务器connection.connect();// 取得输入流,并使用Reader读取BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));//设置编码,否则中文乱码System.out.println("=============================");System.out.println("Contents of get request");System.out.println("=============================");String lines;while ((lines = reader.readLine()) != null){//lines = new String(lines.getBytes(), "utf-8");System.out.println(lines);}reader.close();// 断开连接connection.disconnect();System.out.println("=============================");System.out.println("Contents of get request ends");System.out.println("=============================");}
//post()请求public static void readContentFromPost() throws IOException{// Post请求的url,与get不同的是不需要带参数URL postUrl = new URL(POST_URL);// 打开连接HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();// Output to the connection. Default is// false, set to true because post// method must write something to the// connection// 设置是否向connection输出,因为这个是post请求,参数要放在// http正文内,因此需要设为trueconnection.setDoOutput(true);// Read from the connection. Default is true.connection.setDoInput(true);// Set the post method. Default is GETconnection.setRequestMethod("POST");// Post cannot use caches// Post 请求不能使用缓存connection.setUseCaches(false);// This method takes effects to// every instances of this class.// URLConnection.setFollowRedirects是static函数,作用于所有的URLConnection对象。// connection.setFollowRedirects(true);// This methods only// takes effacts to this// instance.// URLConnection.setInstanceFollowRedirects是成员函数,仅作用于当前函数connection.setInstanceFollowRedirects(true);// Set the content type to urlencoded,// because we will write// some URL-encoded content to the// connection. Settings above must be set before connect!// 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的// 意思是正文是urlencoded编码过的form参数,下面我们可以看到我们对正文内容使用URLEncoder.encode// 进行编码connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");// 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,// 要注意的是connection.getOutputStream会隐含的进行connect。connection.connect();DataOutputStream out = new DataOutputStream(connection.getOutputStream());// The URL-encoded contend// 正文,正文内容其实跟get的URL中'?'后的参数字符串一致String content = "key=j0r53nmbbd78x7m1pqml06u2&type=1&toemail=cngolon@gmail.com" + "&activatecode=" + URLEncoder.encode("中国聚龙", "utf-8");// DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面out.writeBytes(content); out.flush();out.close(); // flush and closeBufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));//设置编码,否则中文乱码String line="";System.out.println("=============================");System.out.println("Contents of post request");System.out.println("=============================");while ((line = reader.readLine()) != null){//line = new String(line.getBytes(), "utf-8");System.out.println(line);}System.out.println("=============================");System.out.println("Contents of post request ends");System.out.println("=============================");reader.close();connection.disconnect();}
}

HttpURLConnection.connect函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。无论是 post还是get,http请求实际上直到HttpURLConnection.getInputStream()这个函数里面才正式发送出去。

在readContentFromPost() 中,顺序是重中之重,对connection对象的一切配置(那一堆set函数)都必须要在connect()函数执行之前完成。而对 outputStream的写操作,又必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。

http 请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文content,在connect()函 数里面,会根据HttpURLConnection对象的配置值生成http头,因此在调用connect函数之前,就必须把所有的配置准备好。

紧接着http头的是http请求的正文,正文的内容通过outputStream写入,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是在流关闭后,根据输入的内容生成http正文。

至此,http请求的东西已经准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,然后 返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头 和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入 outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。

这篇关于java httpURL连接远程服务器并返回数据(httpurlconnection)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/979694

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain