# HTTP

# 导入

通过如下方式导入http api

import http from "svr-api/http";

# 方法

/**
 * http协议相关API
 */
/**
 * 发起一次http请求。
 *
 * 现在httpClient可以进行一些个性化的设置,在系统设置中进行配置。
 *
 * 1. HTTPClient连接池大小。系统通过http协议高并发访问第三方服务时需要连接池来提升性能。
 *    "thresholds.httpClient.maxPoolSize"?: number;
 *
 * 2. HTTPClient连接空闲时间。http连接池中连接多久不使用时会自动回收,单位毫秒。
 *    "thresholds.httpClient.maxIDLETime"?: number;
 *
 * 3. 与服务端建立连接的超时时间,超过该时间停止请求。 "thresholds.httpClient.connectionTimeout"?:
 *    number;
 *
 * 4. 多长时间检查一次连接是否可用。 "thresholds.httpClient.periodValidateAfterInactivity"?:number;
 *
 * 5. 与服务端建立连接时,等待服务端响应数据的超时时间,超过该时间停止请求。
 *    "thresholds.httpClient.socketTimeout"?: number;
 *
 * 6. 与服务器连接失败时最大重试次数。 "thresholds.httpClient.retryNum"?: number;
 *
 * 7. 发起服务的主机连接到每个路由的最大连接数,最大并发。
 *    "thresholds.httpClient.defaultMaxPerRoute"?: number;
 *
 *
 * @param args 请求的参数。
 * @return 
 */
export function request(args: HttpRequestArgs): HttpResponseResult;

/**
 * 发起一个http请求
 *
 * 返回{@link CloseableHttpResponse}对象,通过{@link CloseableHttpResponse.getInputStream()}方法
 * 获取数据流。
 *
 * 用于处理较大的响应体,避免内存占用过多。比如下载较大的文件,通过读取数据流,实现流式下载。处
 * 理完成后,必需调用{@link CloseableHttpResponse.close()}方法释放资源。
 * 
 * @param args 请求的参数。
 */
export function requestRaw(args: HttpRequestArgs): CloseableHttpResponse;

/**
 * 发起一次http请求。
 * 
 * @param url get请求的参数用户自行封装在url中。
 */
export function get(url: string): HttpResponseResult;

/**
 * 发起一次post请求。内部会调用request方法。
 * 
 * @param args 请求的参数。
 */
export function post(args: HttpRequestArgs): HttpResponseResult;

/**
 * 创建一个可以进行会话的http连接,用于连续的对同一个服务器发起多个请求。
 *
 * 如果hosts传递的是一组集群地址,那么创建一个对集群访问的http连接,支持故障转移和负载平衡。http连接
 * 将会随机访问一个集群节点发送请求,当节点故障(网络异常)会进行重试,若重试则会尝试下一个节点,直
 * 到访问到一个可用节点,完成请求服务。
 *
 * 关于连接池: 
 *
 * 返回的HttpConnection内部会使用连接池,pool以ip:port为基准创建连接,自动回收,系统共享,发请求时,
 * 从pool里面获取连接,如果没有就创建,身份在发送请求的时候验证,如果build的时候设置了就用,如果没
 * 有,那么通过header或者HttpContext传递。
 *
 * config可传递的参数,详见:详见:{@link HTTPConnectionConf}。
 *
 * 应用实例:
 * 1. Doris和StartRocks通过Steam Load导入数据,需要对BE集群服务发送put请求。
 *
 * @param config 如果类型为string或者string[] 表示传递的是{@link HTTPConnectionConf.hosts}。也可以传
 * 空,如果传空,那么调用{@link HttpConnection.request(args)}中的url参数必需是完整地址。
 */
export function openHttpConnection(hosts?: string | string[] | HTTPConnectionConf): HttpConnection;

/**
 * 构造一个具有指定名称和值的cookie,用于设置cookie到浏览器中。
 * 
 * @param name 名称。
 * @param val  值。
 * @return
 */
export function createCookie(name: string, val: string): Cookie;

/**
 * 返回当前线程所在web线程中的http会话对象。
 *
 * @param create true to create a new session for this request if necessary; false to return null
 *          if there's no current session, default is false.
 * @returns 返回当前线程所在web线程中的http会话对象。如果当前线程不是web线程,那么返回null。
 */
export function getHttpSession(create?: boolean): HttpSession;

/**
 * 返回当前线程所在web线程中的http请求对象。
 * 
 * @returns 返回当前线程所在web线程中的http请求对象。如果当前线程不是web线程,那么返回null。
 */
export function getHttpServletRequest(): HttpServletRequest;

/**
 * 返回contextpath。
 * 
 * @return 返回的字符串符合servlet的contextPath规范。没有context返回"",否则返回/开头(没有/结尾)的字符串,如/succezbi。
 */
export function getContextPath(): string;

/**
 * 设置url的参数,如果参数不存在,则添加。
 * 
 * @exmaple
 *  1. setParameter("http://www.xxxx.com:8080/path/a", "selectId", "123") = "http://www.xxxx.com:8080/path/a?selectId=123"
 *  2. setParameter("/path/a", "selectId", "123") = "/path/a?selectId=123"
 *  3. setParameter("path/a", "selectId", "123") = "path/a?selectId=123"
 *  4. setParameter("http://www.xxxx.com:8080/path/a?id=abc&path=def", "selectId", "123") = "http://www.xxxx.com:8080/path/a?id=abc&path=def&selectId=123"
 *  5. setParameter("/path/a?id=abc&path=def", "selectId", "123") = "/path/a?id=abc&path=def&selectId=123"
 * @param url 
 * @param parameterName 参数名称。
 * @param parameterValue 参数值,里面的特殊字符不用转义,本方法会对参数做转义。
 * @return 返回设置参数后的url。
 */
export function setParameter(url: string, parameterName: string, parameterValue: string): string;


/**
 * 将url中指定的参数删除,如果该参数不存在,则什么也不做。
 * 
 * @example
 *  1. removeParameter("http://www.xxxx.com:8080/path/a?param1=123","param1") = "http://www.xxxx.com:8080/path/a"
 *  2. removeParameter("http://www.xxxx.com:8080/path/a?param1=123&param2=345","param2") = "http://www.xxxx.com:8080/path/a?param1=123"
 *  3. removeParameter("/path/a?param1=123","param1") = "/path/a"
 * @param url 
 * @param parameterName 要删除的参数名称。
 * @return 返回删除参数后的url。
 */
export function removeParameter(url: string, parameterName: string): string;

/**
 * 获取系统的httpClientManager。
 */
export function getPoolingHttpClientConnectionManager(): any;

# 对象

/**
 * 此文件定义一些http客户端的相关的数据类型。
 * 
 */

/**
 * http请求所返回的结果。
 */
declare interface HttpResponseResult {
	/**
	 * 响应状态码,如200,404。
	 */
	httpCode: number;
	/**
	 * 响应头部信息。
	 */
	headers: {
		[header: string]: any;
	}
	/**
	 * 以UTF-8的默认编码返回响应体中实体内容。
	 * 
	 * 注意:当请求为下载文件时,返回的responseText为null。
	 */
	responseText: string;
	/**
	 * 返回响应体的内容。
	 * 
	 * 说明:
	 * 
	 * 1. 当请求为下载二进制文件时,返回的是byte[]。
	 * 2. 当请求类型为xml,返回Document对象。
	 * 3. 当请求类型为json,返回的是json对象。
	 */
	responseBody?: any;
}

/**
 * 一个Http响应对象。
 *
 * 用于处理较大的响应体,避免内存占用过多。比如下载较大的文件,通过此对象可以通过读取数据流,实现流
 * 式下载。处理完成后,必需调用close方法释放资源。
 */
declare interface CloseableHttpResponse extends Closeable {
	/**
	  * 响应状态码,如200,404。
	  */
	getHttpCode(): number;
	/**
	 * 响应头部信息。
	 */
	getAllHeaders(): {
		[header: string]: any;
	}

	/**
	 * 响应体的ContentType,不包含charset。
	 */
	getContentType(): string;

	/**
	 * 响应体的编码,可能为null
	 */
	getCharset(): string;

	/**
	 * 返回响应体的数据流。
	 */
	getInputStream(): InputStream;
}


/**
 * 一个Http链接对象,创建一次可多次复用,用于连续多次的向同一个服务器发送请求。
 */
declare interface HttpConnection {

	/**
	 * 发起一个`GET`请求。
	 * 
	 * @param url url中只需要传递相对地址,如: `/DJXX/main.do`。
	 * @return
	 */
	get(url: string): HttpResponseResult;

	/**
	 * 发起一个http请求。
	 * 
	 * 返回的{@link HttpResponseResult}会把内容读取到内存。
	 * 用于一些常用的返回较小数据量的请求。
	 * 
	 * @param args
	 * @return
	 */
	request(args: HttpRequestArgs): HttpResponseResult;

	/**
	 * 发起一个http请求
	 *
	 * 返回{@link CloseableHttpResponse}对象,通过{@link CloseableHttpResponse.getInputStream()}方法
	 * 获取数据流。
	 *
	 * 用于处理较大的响应体,避免内存占用过多。比如下载较大的文件,通过读取数据流,实现流式下载。处
	 * 理完成后,必需调用{@link CloseableHttpResponse.close()}方法释放资源。
	 *
	 * @param args 
	 */
	requestRaw(args: HttpRequestArgs): CloseableHttpResponse;
}

/**
 * 一个Http请求对象。
 */
declare interface HttpRequestArgs {
	/**请求的url,必须设置,只需传递相对地址,如: `/DJXX/main.do` */
	url: string;

	/**可选,默认为`GET`请求,还可以传递`POST` 、 `PUT` 、`DELETE` */
	method?: string;
	/**
	 * 请求参数,可为空。
	 *
	 * 若为`GET`请求,data需要传递json格式数据,发送请求时会将其拼接到url上;若为post请求,会将data作为
	 * 请求体进行传递。
	 *
	 * 若为`POST`请求,通常需要指定请求头中的`Content-Type`来告诉浏览器如何处理请求和解析数据,根据调用
	 * 者指定的`Content-Type`的不同,请求体编码规则如下:
	 *
	 * 1. `application/x-www-form-urlencoded`,如果data为json,那么自动将json编码为名值对格式发送,若
	 *    data不是json,那么将直接发送给服务器。
	 * 2. `application/json`或`text/json`,如果data为json,那么直接发送给服务器,否则抛出异常。
	 * 3. `multipart/form-data`,如果data为json,那么自动编码表单提交格式发送给服务器支持上传文件,若不
	 *    是json则抛出异常。
	 * 4. `application/xml`或`text/xml`,如果data为Document对象,那么将转换为xml字符串后发送给服务器,其
	 *    他格式将直接发送给服务器。
	 * 5. 其他`Content-Type`,此时直接将调用者传递的内容不加处理直接发送给服务器。
	 *
	 * 当调用者未指定`Content-Type`时,此函数会根据data类型自动设定请求的`Content-Type`:
	 * 
	 * 1. 若`data`为json,且只有一级,内容只含字符串、布尔、数值等基本类型,则`Content-Type`为
	 *    `application/x-www-form-urlencoded;charset=UTF-8`。如:data:{"a":123}。
	 * 2. 若`data`为json,且json里还嵌套有数组或json对象,则`Content-Type`为
	 *    `application/json;charset=UTF-8`。如:data:{"test1":"test","test2":{"test3":"34","test4":[12,432]}}。
	 * 3. 若`data`为json且第一级value中包含文件类型,则`Content-Type`为multipart/form-data;charset=UTF-8`。
	 *    如:data:{"test":file,"xml":xml},此时test默认为文件名,file为文件对象。
	 * 4. 若`data`为文件类型,则`Content-Type`为`application/octet-stream;charset=UTF-8`。
	 *    如:data:file,file为文件对象。
	 * 5. 若`data`为Document文件,则`Content-Type`为`application/xml;charset=UTF-8`。
	 * 6. 若以上均不满足,则默认`Content-Type`为`text/plain;charset=UTF-8`。
	 */
	data?: {
		[pname: string]: any;
	} | any

	/** 
	 * 可选,请求头信息。一般不用指定。
	 *
	 * 说明:
	 * 1. POST请求时,如果接收方想获取到json格式的请求参数,那么可以指定`Content-Type`头信息为
	 *    `application/json`。
	 */
	headers?: HttpRequestHeaders
}
是否有帮助?
0条评论
评论