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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input