# 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: {
	/**请求的url,必须设置 */
	url: string;

	/**可选,默认为`GET`请求,还可以传递`POST` 、 `PUT` 、`DELETE` */
	method?: string;

	/**
	 * 可选,请求参数。
	 *
	 * 说明:
	 *
	 * 1. 对于`GET`请求,则将参数以json形式放入`data`,此时会自动将参数追加到url上。
	 * 2. 对于`POST`请求:
	 *     1. 若指定Content-Type,则会对传入的`data`参数进行核验是否一致,若不一致则抛异常,具体如下:
	 *         1. 若`Content-Type`为`application/json`,则`data`应该为json格式,且json内不包含文件类
	 *            型。
	 *         2. 若`Content-Type`为`multipart/form-data`,则`data`应该为json格式,且json内可以包含文件类
	 *            型。
	 *         3. 若`Content-Type`为`application/xml`,则`data`应该为xml字符串或Document文件。
	 *         4. 若`Content-Type`为`application/octet-stream`,则`data`应该为文件类型。
	 *         5. 若`Content-Type`为`application/x-www-form-urlencoded`,则`data`可以为字符串或json,且
	 *            为json格式时,json内不包含文件类型。
	 *     2. 若未指定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?: HttpHeaders
}): HttpResponseResult;

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

/**
 * 发起一次post请求。内部会调用request方法。
 * 
 * @param args 请求的参数。
 */
export function post(args: {
	/**请求的url,必须设置 */
	url: string,
	/**
	 * 可选,请求参数。
	 *
	 * 说明:
	 *
	 * 1. 若指定Content-Type,则会对传入的`data`参数进行核验是否一致,若不一致则抛异常,具体如下:
	 *     1. 若`Content-Type`为`application/json`,则`data`应该为json格式,且json内不包含文件类型。
	 *     2. 若`Content-Type`为`multipart/form-data`,则`data`应该为json格式,且json内可以包含文件类型。
	 *     3. 若`Content-Type`为`application/xml`,则`data`应该为xml字符串或Document文件。
	 *     4. 若`Content-Type`为`application/octet-stream`,则`data`应该为文件类型。
	 *     5. 若`Content-Type`为`application/x-www-form-urlencoded`,则`data`可以为字符串或json,且为
	 *            json格式时,json内不包含文件类型。
	 * 2. 若未指定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?: HttpHeaders
}): HttpResponseResult;

/**
 * 创建一个可以进行会话的http连接,用于连续的对同一个服务器发起多个请求。
 * 
 * @param host 服务器地址,如`http://192.168.7.128:8080`。
 * @return
 */
export function openHttpConnection(host: string): 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链接对象,创建一次可多次复用,用于连续多次的向同一个服务器发送请求。
 */
declare interface HttpConnection {

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

	/**
	 * 发起一个http请求。
	 * 
	 * @param args
	 * @return
	 */
	request(args: {
		/**请求的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?: HttpHeaders
	}): HttpResponseResult;

	/**
	 * 获取httpClientBuilder对象,通过这个对象可以设置connectionTimeout等参数。
	 * 
	 * @return
	 */
	getHttpClientBuilder(): any;

	/**
	 * 设置最大保持连接时间。
	 * 
	 * @param time 单位:毫秒。
	 */
	setKeepAliveStrategyTime(time: number): void;
}

declare interface HttpHeaders {
	/**
	 * 请求的与实体对应的MIME信息。
	 * 
	 * @example
	 * "Content-Type":"application/json;charset=UTF-8"
	 * "Content-Type":"multipart/form-data"
	 */
	"Content-Type"?: string,
	/**请求的内容长度 */
	"Content-Length"?: number,
	/**包含发出请求的用户信息 */
	"User-Agent"?: string,
	/**浏览器能够接受的内容消息*/
	"Accept"?: string,
	/**指定浏览器可以支持的web服务器返回内容压缩编码类型*/
	"Accept-Encoding"?: string,
	/**浏览器保存服务器返回数据的方法,通常保存用户身份信息*/
	"Cookie"?: string,
	/**
	 * 压缩媒体类型。
	 * 
	 * @example
	 * "Content-Encoding":"gzip,deflate,compress"
	 * "Content-Encoding":"gzip"
	 */
	"Content-Encoding"?: string,
	/**
	 * 浏览器可以接受的字符编码集。
	 * 
	 * @example
	 * "Accept-Charset":"iso-8859-1"
	 * "Accept-Charset":"utf-8"
	 */
	"Accept-Charset"?: string,
	[p: string]: any;
}
是否有帮助?
0条评论
评论