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

相关文章

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映