/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Project : LiteFetion
* Package : net.solosky.litefetion.http
* File : HttpRequest.java
* Author : solosky < solosky772@qq.com >
* Created : 2010-10-1
* License : Apache License 2.0
*/
package iqq.im.http;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
*
* HTTP请求
*
* @author solosky <solosky772@qq.com>
*/
public class QQHttpRequest
{
/**
* URL
*/
private String url;
/**
* Method
*/
private String method;
/**
* 超时时间
*/
private int timeout;
/**
* 请求的头部
*/
private Map<String, String> headerMap;
/**
* 请求的值集合
*/
private Map<String, String> postMap;
/***
* Post的文件列表
*/
private Map<String, File> fileMap;
/**
* Get方式的值集合
*/
private Map<String, String> getMap;
/**
* 请求的数据流
*/
private InputStream inputStream;
/**
* 保存的输出流
*/
private OutputStream outputStream;
/**
* 编码
*/
private String charset;
/**
* 连接超时
*/
private int connectTimeout;
/***
* 读取超时
*/
private int readTimeout;
/**
* 默认的构造函数
* @param url 地址
* @param method 方法
*/
public QQHttpRequest(String url, String method)
{
this.url = url;
this.method = method;
this.headerMap = new HashMap<String, String>();
this.postMap = new HashMap<String, String>();
this.getMap = new HashMap<String, String>();
this.fileMap = new HashMap<String, File>();
}
/**
* 设置URL
* @param url the url to set
*/
public void setUrl(String url)
{
this.url = url;
}
/**
* 设置请求的方法
* @param method the method to set
*/
public void setMethod(String method)
{
this.method = method;
}
/**
* 设置超时时间
* @param timeout the timeout to set
*/
public void setTimeout(int timeout)
{
this.timeout = timeout;
}
/**
* 添加请求头
* @param key
* @param value
*/
public void addHeader(String key, String value)
{
this.headerMap.put(key, value);
}
/**
* 以key=>value的方式设置请求体,仅在方法为POST的方式下有用,默认为utf8编码
* @param keymap
*/
public void setBody(Map<String, String> keymap)
{
this.postMap = keymap;
}
/**
* 添加POST的值
* @param key
* @param value
*/
public void addPostValue(String key, String value) {
this.postMap.put(key, value);
}
/**
* 添加POST文件
* @param key
* @param file
*/
public void addPostFile(String key, File file){
this.fileMap.put(key, file);
}
/**
* 添加POST的值
* @param key
* @param value
*/
public void addGetValue(String key, String value) {
this.getMap.put(key, value);
}
/**
* 设置请求的数据流
* @param outStream
*/
public void setBody(InputStream inputStream)
{
this.inputStream = inputStream;
}
/**
* @return the headerMap
*/
public Map<String, String> getHeaderMap()
{
return headerMap;
}
/**
* @param headerMap the headerMap to set
*/
public void setHeaderMap(Map<String, String> headerMap)
{
this.headerMap = headerMap;
}
/**
* @return the inputStream
*/
public InputStream getInputStream()
{
if(this.inputStream!=null) {
return this.inputStream;
}else if(this.postMap.size()>0) {
addHeader("Content-Type", "application/x-www-form-urlencoded");
StringBuffer buffer = new StringBuffer();
Iterator<String> it = this.postMap.keySet().iterator();
String charset = "utf8";
while(it.hasNext()) {
String key = it.next();
String value = this.postMap.get(key);
try {
key = URLEncoder.encode(key, charset);
value = URLEncoder.encode(value==null?"":value, charset);
buffer.append(key);
buffer.append("=");
buffer.append(value);
buffer.append("&");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
try {
return new ByteArrayInputStream(buffer.toString().getBytes(charset));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}else {
return null;
}
}
/**
* @param inputStream the inputStream to set
*/
public void setInputStream(InputStream inputStream)
{
this.inputStream = inputStream;
}
/**
* @return the url
*/
public String getUrl()
{
if(this.getMap.size()>0){
StringBuffer buffer = new StringBuffer(url);
buffer.append("?");
Iterator<String> it = this.getMap.keySet().iterator();
String charset = "utf8";
while(it.hasNext()) {
String key = it.next();
String value = this.getMap.get(key);
try {
key = URLEncoder.encode(key, charset);
value = URLEncoder.encode(value==null?"":value, charset);
buffer.append(key);
buffer.append("=");
buffer.append(value);
if(it.hasNext())
buffer.append("&");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return buffer.toString();
}else{
return url;
}
}
/**
* @return the method
*/
public String getMethod()
{
return method;
}
/**
* @return the timeout
*/
public int getTimeout()
{
return timeout;
}
public OutputStream getOutputStream() {
return outputStream;
}
public void setOutputStream(OutputStream outputStream) {
this.outputStream = outputStream;
}
public Map<String, String> getPostMap() {
return postMap;
}
public Map<String, File> getFileMap() {
return fileMap;
}
public String getCharset() {
return charset==null ? "utf-8" : charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
/**
* @return the connectTimeout
*/
public int getConnectTimeout() {
return connectTimeout;
}
/**
* @param connectTimeout the connectTimeout to set
*/
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
/**
* @return the readTimeout
*/
public int getReadTimeout() {
return readTimeout;
}
/**
* @param readTimeout the readTimeout to set
*/
public void setReadTimeout(int readTimeout) {
this.readTimeout = readTimeout;
}
}