# http-request
**Repository Path**: changshaligongdaxue/http-request
## Basic Information
- **Project Name**: http-request
- **Description**: Java HTTP 请求库,基于HttpURLConnection创建请求并接收响应结果,个人觉得一款非常简单快捷的工具,你可以使用像Apache HttpComponents这样的组件也是非常好用的,但是有些时候为了更加简单,或者可能因为你部署的环境的问题(比如Android),你只想使用例如HttpURLConnection一些过时但是又好用的库,这个库寻找一种更加方便和一种更加通用的模式来模拟HTTP请求
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 2
- **Created**: 2017-01-17
- **Last Updated**: 2023-12-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Http 请求 [](https://travis-ci.org/kevinsawicki/http-request)
一个基于[HttpURLConnection](http://download.oracle.com/javase/6/docs/api/java/net/HttpURLConnection.html)简单方便的创建HTTP请求并接收响应数据的工具库.
在[MIT License](http://www.opensource.org/licenses/mit-license.php)可以获取到该库
## 使用
http-request这个库可以从[Maven Central](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.kevinsawicki%22%20AND%20a%3A%22http-request%22)获取.
```xml
  com.github.kevinsawicki
  http-request
  6.0
```
不使用[Maven](http://maven.apache.org/)? 只要复制 [HttpRequest](https://raw.githubusercontent.com/kevinsawicki/http-request/master/lib/src/main/java/com/github/kevinsawicki/http/HttpRequest.java)
类到你的工种当中, 更新包的报名,然后你就可以使用它了.
你可以从 [这里](http://kevinsawicki.github.com/http-request/apidocs/index.html).获取到javadoc文档
## FAQ
### 谁使用它?
[这里](https://github.com/kevinsawicki/http-request/wiki/Used-By)是已知的项目使用该库
### 为什么写这个?
写这个库是为了在使用`HttpURLConnection`来发送HTTP请求的时候更加方便快捷
像[Apache HttpComponents](http://hc.apache.org)这样的组件也是非常好用的,但是有些时候为了更加简单,或者可能因为你部署的环境的问题(比如Android),你只想使用例如`HttpURLConnection`一些过时但是又好用的库。
这个库寻找一种更加方便和一种更加通用的模式来模拟HTTP请求,并支持多种特性的请求,例如多个请求的任务.
### 该库的依赖?
**没有**. 整个库只有单一的一个类和一些静态的内部类,测试工程需要[Jetty](http://eclipse.org/jetty/)的支持,用来实现一个真实的HTTP服务器请求来测试请求.
### 如何管理异常?
`HttpRequest`类不抛出任何检查异常,相反的,所有低等级的异常被包装在继承了`RuntimeException`类的`HttpRequestException`中,你可以通过catching`HttpRequestException`以及调用`getCause`方法来获取潜在的异常信息,它总会返回最原始的`IOException`
### 请求是异步的吗?
**不是**.  每个`HttpRequest`对象都包装了`HttpUrlConnection`这个最根本的对象的一个同步API,因此,所有在`HttpRequest`对象中的方法都是同步的。
因此,不要在你的应用程序的主线程中使用`HttpRequest`对象是非常关键的.
这有一个在Android上使用的小例子
[AsyncTask](http://developer.android.com/reference/android/os/AsyncTask.html):
```java
private class DownloadTask extends AsyncTask {
  protected File doInBackground(String... urls) {
    try {
      HttpRequest request =  HttpRequest.get(urls[0]);
      File file = null;
      if (request.ok()) {
        file = File.createTempFile("download", ".tmp");
        request.receive(file);
        publishProgress(file.length());
      }
      return file;
    } catch (HttpRequestException exception) {
      return null;
    }
  }
  protected void onProgressUpdate(Long... progress) {
    Log.d("MyApp", "Downloaded bytes: " + progress[0]);
  }
  protected void onPostExecute(File file) {
    if (file != null)
      Log.d("MyApp", "Downloaded file to: " + file.getAbsolutePath());
    else
      Log.d("MyApp", "Download failed");
  }
}
new DownloadTask().execute("http://google.com");
```
## 示例
### 执行一个GET请求并返回响应的状态信息
```java
int response = HttpRequest.get("http://google.com").code();
```
### 执行一个GET请求并返回响应的body信息
```java
String response = HttpRequest.get("http://google.com").body();
System.out.println("Response was: " + response);
```
### 标准打印一个GET请求的响应数据
```java
HttpRequest.get("http://google.com").receive(System.out);
```
### 添加请求参数
```java
HttpRequest request = HttpRequest.get("http://google.com", true, 'q', "baseball gloves", "size", 100);
System.out.println(request.toString()); // GET http://google.com?q=baseball%20gloves&size=100
```
### 使用数组作为请求参数
```java
int[] ids = new int[] { 22, 23 };
HttpRequest request = HttpRequest.get("http://google.com", true, "id", ids);
System.out.println(request.toString()); // GET http://google.com?id[]=22&id[]=23
```
### 和请求/响应的请求头一起使用
```java
String contentType = HttpRequest.get("http://google.com")
                                .accept("application/json") //Sets request header
                                .contentType(); //Gets response header
System.out.println("Response content type was " + contentType);
```
### 执行一个带数据的POST请求并返回响应的状态
```java
int response = HttpRequest.post("http://google.com").send("name=kevin").code();
```
### 使用最基本的认证请求
```java
int response = HttpRequest.get("http://google.com").basic("username", "p4ssw0rd").code();
```
### 执行有文件的请求
```java
HttpRequest request = HttpRequest.post("http://google.com");
request.part("status[body]", "Making a multipart request");
request.part("status[image]", new File("/home/kevin/Pictures/ide.png"));
if (request.ok())
  System.out.println("Status was updated");
```
### 执行一个具有表单数据的POST请求
```java
Map data = new HashMap();
data.put("user", "A User");
data.put("state", "CA");
if (HttpRequest.post("http://google.com").form(data).created())
  System.out.println("User was created");
```
### 把响应的body信息存放在文件中
```java
File output = new File("/output/request.out");
HttpRequest.get("http://google.com").receive(output);
```
### POST请求包含文件
```java
File input = new File("/input/data.txt");
int response = HttpRequest.post("http://google.com").send(input).code();
```
### POST请求字符串二进制文件
```java
String base64 = base64(t[i].getAbsolutePath());
String body = HttpRequest.post(url)
	.part("base64Strs", new ByteArrayInputStream(base64.getBytes())).body();
```
### 使用实体标签进行缓存
```java
File latest = new File("/data/cache.json");
HttpRequest request = HttpRequest.get("http://google.com");
//Copy response to file
request.receive(latest);
//Store eTag of response
String eTag = request.eTag();
//Later on check if changes exist
boolean unchanged = HttpRequest.get("http://google.com")
                               .ifNoneMatch(eTag)
                               .notModified();
```
### 使用gzip压缩方式
```java
HttpRequest request = HttpRequest.get("http://google.com");
//Tell server to gzip response and automatically uncompress
request.acceptGzipEncoding().uncompress(true);
String uncompressed = request.body();
System.out.println("Uncompressed response is: " + uncompressed);
```
### 当使用HTTPS协议是忽略安全
```java
HttpRequest request = HttpRequest.get("https://google.com");
//Accept all certificates
request.trustAllCerts();
//Accept all hostnames
request.trustAllHosts();
```
### 配置一个HTTP请求代理
```java
HttpRequest request = HttpRequest.get("https://google.com");
//Configure proxy
request.useProxy("localhost", 8080);
//Optional proxy basic authentication
request.proxyBasic("username", "p4ssw0rd");
```
### 重定向
```java
int code = HttpRequest.get("http://google.com").followRedirects(true).code();
```
### 自定义连接工场
查看 [OkHttp](https://github.com/square/okhttp)来使用该库?
查看 [here](https://gist.github.com/JakeWharton/5797571).
```java
HttpRequest.setConnectionFactory(new ConnectionFactory() {
  public HttpURLConnection create(URL url) throws IOException {
    if (!"https".equals(url.getProtocol()))
      throw new IOException("Only secure requests are allowed");
    return (HttpURLConnection) url.openConnection();
  }
  public HttpURLConnection create(URL url, Proxy proxy) throws IOException {
    if (!"https".equals(url.getProtocol()))
      throw new IOException("Only secure requests are allowed");
    return (HttpURLConnection) url.openConnection(proxy);
  }
});
```
## 贡献
* [Kevin Sawicki](https://github.com/kevinsawicki) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=kevinsawicki)
* [Eddie Ringle](https://github.com/eddieringle) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=eddieringle)
* [Sean Jensen-Grey](https://github.com/seanjensengrey) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=seanjensengrey)
* [Levi Notik](https://github.com/levinotik) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=levinotik)
* [Michael Wang](https://github.com/michael-wang) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=michael-wang)
* [Julien HENRY](https://github.com/henryju) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=henryju)
* [Benoit Lubek](https://github.com/BoD) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=BoD)
* [Jake Wharton](https://github.com/JakeWharton) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=JakeWharton)
* [Oskar Hagberg](https://github.com/oskarhagberg) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=oskarhagberg)
* [David Pate](https://github.com/DavidTPate) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=DavidTPate)
* [Anton Rieder](https://github.com/aried3r) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=aried3r)
* [Jean-Baptiste Lièvremont](https://github.com/jblievremont) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=jblievremont)
* [Roman Petrenko](https://github.com/romanzes) :: [contributions](https://github.com/kevinsawicki/http-request/commits?author=romanzes)