HTTP 请求

请求生命周期

请安装 AJ HTTP,而不只是 AJ Util。Request 位于 com.ajaxjs.util.httpremoteResponseHttpMethodHttpConstantPayloadType 位于 com.ajaxjs.util.httpremote.model

  1. 创建 new Request(HttpMethod.GET, url)(或方法类的 (HttpMethod, String) 构造函数),此时不会发送请求。
  2. init() 前设置内容类型、正文与超时。默认连接超时 10,000 ms,读取超时 15,000 ms。
  3. init(Consumer<HttpURLConnection>) 创建并配置连接。回调仅用于设置请求头、超时、重定向等,不应开始 I/O。只接受 HTTP/HTTPS URL。
  4. 有正文时,在 init() 后、connect() 前调用 initData()
  5. connect() 读取状态和响应。自行管理生命周期时,处理响应后在 finally 中断开连接。

Get(String, Consumer)Delete(String, Consumer) 以及带数据的 Post/Put 构造函数会立即发送。Head(String) 则仅配置对象,需要调用 init()connect()。不要在自动发送的构造函数之后再次发送。请求对象可变,不要在并发操作间共享。

显式生命周期的 JSON POST

import com.ajaxjs.util.httpremote.Request;
import com.ajaxjs.util.httpremote.model.HttpConstant;
import com.ajaxjs.util.httpremote.model.HttpMethod;
import com.ajaxjs.util.httpremote.model.Response;
import java.net.HttpURLConnection;
import java.util.Collections;

Request request = new Request(HttpMethod.POST, "https://example.com/api");
request.setContentType(HttpConstant.CONTENT_TYPE_JSON);
request.setData(Collections.<String, Object>singletonMap("name", "Ada"));
HttpURLConnection connection = request.init();
try {
    request.initData();
    Response response = request.connect();
    if (!response.isOk()) {
        throw new IllegalStateException("HTTP request failed: " + response.getHttpCode(), response.getEx());
    }
    // 仅在接口约定返回 JSON 对象时解析。
    java.util.Map<String, Object> result = response.responseAsJson();
} finally {
    connection.disconnect();
}

正文转换

响应与失败

Response.isOk() 表示 200–299。其他状态读取错误流(如果有);禁止重定向时,3xx 可能没有文本。除非另行配置,否则采用 HttpURLConnection 的重定向行为。Response.isOk(Map) 是不同的 AJ-Spring 业务辅助方法,检查 status.toString() 是否为 "1"

依据:Request.javaBasePost.javamodel/Response.java 和 AJ Util io/DataReader.javaTestMultipartPost 的部分断言期望没有末尾换行,与本地 reader 不一致。HTTP POM 解析的是指定版本的 AJ Util 依赖,使用前应核对实际解析到的制品,不能假定文本行为完全相同。

继续阅读方法辅助类流式处理与安全