Http学习之使用HttpURLConnection发送post和get请求
2010-02-23 16:08
Http学习之使用HttpURLConnection发送post和get请求
最常用的Http请求无非是get 和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
在Java中可以使用HttpURLConnection发起这两种请求,了解此类,对于了解 soap,和编写servlet的自动测试代码都有很大的帮助。
下面的代码简单描述了如何使用HttpURLConnection发起这两种请求,以及传递参数的方法:
public class HttpInvoker ...{
public static final String GET_URL = "http://localhost:8080/welcome1";
public static final String POST_URL = "http://localhost:8080/welcome1";
public static void readContentFromGet() throws IOException ...{
// 拼凑get请求的URL字串,使用URLEncoder.encode对特殊和不可见字符进行编码
String getURL = GET_URL + "?username="
+ URLEncoder.encode("fat man", "utf-8");
URL getUrl = new URL(getURL);
// 根据拼凑的URL,打开连接,URL.openConnection函数会根据 URL的类型,
// 返回不同的URLConnection子类的对象,这里URL是一个http,因此实际返回的是HttpURLConnection
HttpURLConnection connection = (HttpURLConnection) getUrl
.openConnection();
// 进行连接,但是实际上get request要在下一句的 connection.getInputStream()函数中才会真正发到
// 服务器
connection.connect();
// 取得输入流,并使用Reader读取
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
System.out.println("=============================");
System.out.println("Contents of get request");
System.out.println("=============================");
String lines;
while ((lines = reader.readLine()) != null) ...{
System.out.println(lines);
}
reader.close();
// 断开连接
connection.disconnect();
System.out.println("=============================");
System.out.println("Contents of get request ends");
System.out.println("=============================");
}
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正文内,因此需要设为true
connection.setDoOutput(true);
// Read from the connection. Default is true.
connection.setDoInput(true);
// Set the post method. Default is GET
connection.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 = "firstname=" + URLEncoder.encode("一个大肥人", "utf-8");
// DataOutputStream.writeBytes将字符串中的16位的 unicode字符以8位的字符形式写道流里面
out.writeBytes(content);
out.flush();
out.close(); // flush and close
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
System.out.println("=============================");
System.out.println("Contents of post request");
System.out.println("=============================");
while ((line = reader.readLine()) != null) ...{
System.out.println(line);
}
System.out.println("=============================");
System.out.println("Contents of post request ends");
System.out.println("=============================");
reader.close();
connection.disconnect();
}
/** *//**
* @param args
*/
public static void main(String[] args) ...{
// TODO Auto-generated method stub
try ...{
readContentFromGet();
readContentFromPost();
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面的readContentFromGet()函数产生了一个get请求,传给servlet一个username参数,值为"fat man"。
readContentFromPost()函数产生了一个post请求,传给servlet一个firstname参数,值为"一个大肥人"。
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(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。
转自:http://blog.csdn.net/pandazxx/archive/2007/06/18/1657109.aspx
分享到:
相关推荐
3. **设置请求体**:如果POST请求有数据需要提交,可以使用`HttpEntityEnclosingRequestBase.setEntity()`方法设置请求实体,例如,使用`StringEntity`或`UrlEncodedFormEntity`来封装数据。 4. **执行请求**:通过...
以下是使用HttpClient发送GET和POST请求的基本步骤: 1. 引入头文件:在代码中包含必要的头文件,如`#include <wininet.h>`。注意,为了使用这些API,需要链接到`Wininet.lib`库。 2. 初始化Internet会话:调用`...
接下来,我们讨论如何使用HttpClient进行GET请求。GET请求通常用于获取资源,不涉及请求体: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...
### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 ...通过上述示例和解释,你应该能够理解和掌握如何使用Java HttpClient库来发送GET和POST请求,这对于开发Web应用程序或与API接口交互至关重要。
在这个主题中,我们将深入理解HttpClient的使用方法,并探讨如何实现服务端和客户端的交互。 一、HttpClient的简单使用 1. 添加依赖 在Java项目中使用HttpClient,首先需要添加对应的依赖。对于Maven项目,可以在...
在这个实例中,我们将深入理解如何使用HttpClient进行GET和POST请求。 **一、HttpClient的GET请求** GET请求是最基础的HTTP请求方式,用于从服务器获取资源。在HttpClient中,可以通过`HttpGet`类来创建GET请求。...
一个简单的易学的 基于HttpClient 4.3发送psot及get请求,返回数据,适合初学者,适合初学者
其次,HttpClient是C#中处理HTTP请求的标准库,它提供了发送各种HTTP请求的方法,包括GET、POST、PUT等。对于POST请求,我们通常用来提交数据到服务器,例如创建新的资源或更新已有资源。 要使用HttpClient发送JSON...
httpclient的用法,发送get请求和post请求,设置header
总结,Android中`Http`和`HttpClient`的`GET`和`POST`方法用于实现网络通信,加载图片则需要考虑异步处理和性能优化。随着技术的发展,开发者应关注新的网络库和最佳实践,以适应不断变化的开发环境。
接下来,我们来看如何使用HttpClient进行GET和POST操作。GET请求通常用于获取资源,而POST请求常用于提交数据。 1. **GET请求**: GET请求的基本流程是创建HttpClient对象,构建HttpGet对象,然后通过HttpClient...
本文将深入探讨如何使用HttpClient进行GET和POST请求,并提供相关的代码示例。 首先,GET请求是最常见的HTTP请求类型,通常用于获取资源。在HttpClient中,发送GET请求可以通过`HttpGet`类实现。以下是一个简单的...
这个名为"Android-Httpclient_Get_Post"的资源可能是一个示例项目或教程,展示了如何在Android应用中使用`HttpClient`进行网络数据的获取与提交。 首先,`HttpClient`是Apache的一个组件,它提供了对HTTP协议的全面...
在本示例中,我们将关注“httpclient使用post方法上传多个图片和其他参数的demo源码”,这是一个涉及到文件上传和参数传递的重要场景。 在Web开发中,POST方法常用于向服务器提交数据,比如表单数据或文件。...
在IT行业中,网络通信是应用程序之间交互的基础,而HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)则是...理解并掌握HttpClientUtil的工作原理和使用方法,对于任何需要进行网络通信的Java项目都是至关重要的。
总结来说,本项目通过具体的代码示例,深入浅出地介绍了Android中HTTPClient的使用,包括GET和POST请求的实现,以及文件上传的详细步骤。这对于任何需要进行网络通信的Android开发者来说,都是不可或缺的知识点。
在本文中,我们将深入探讨HttpClient的使用,包括如何发送GET、POST和PUT请求,并理解其核心概念和源码解析。 首先,HttpClient的核心组件包括HttpClient实例、HttpRequest对象和HttpResponse对象。HttpClient实例...
HttpClient库中的类和方法通常不需要使用注解,因为它的配置主要通过对象构造和方法调用来完成。然而,如果你在使用日志框架(如Log4j),可能需要在项目中添加相应的日志配置,如`@Log4j`,以便在代码中记录...