全部产品

发送 HTTP 请求(Java)

更新时间:2020-10-22 11:23:38

本文介绍 API 订阅方应用如何使用 Java 语言发送 HTTP 请求接入网关。

前置条件

在进行本地应用开发前,您需要确保已经完成以下操作:

  • 已在 API 网关控制台创建了一个应用,参见 创建应用
  • 已将该应用的 APPID 提供给了 API 发布者,并获得了授权,参见 授权 API
  • 已获取了如下服务配置信息。具体获取方法,参见 获取服务端信息
    • 应用的访问密钥(Access Key/Secret Key)
    • API 的域名地址(host)、请求路径(path)、方法(method)、请求体(body)

操作步骤

API 网关提供了一个 JAVA SDK,即 gateway-sdk。该 SDK 集成了加签、验签的逻辑,同时默认支持序列化和反序列化。使用该 SDK 接入调用 HTTP 服务的操作步骤如下:

  1. 引入 SDK
  2. 构建 request 对象
  3. 构建 response 对象
  4. 创建 apiClient
  5. 发起调用请求

引入 SDK

您需要在本地工程 pom.xml 中添加如下 SDK。

  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>gateway-sdk</artifactId>
  4. <version>2.0.3</version>
  5. </dependency>

构建 request 对象

您需要构建 request 对象,用于组装请求,代码示例如下:

  1. public class ParamPostRequest implements ApiRequest<ParamResponse> {
  2. // 请求参数
  3. Map<String, Object> params = new HashMap<>();
  4. // 请求header
  5. Map<String, String> headers = new HashMap<>();
  6. private String apiVersion = "1.0";
  7. // downstream 的 uri
  8. private String path;
  9. // 网关强制开启验签加签
  10. private boolean clientCheckSign = true;
  11. @Override
  12. public String getPath() {
  13. return path;
  14. }
  15. public void setPath(String path) {
  16. this.path = path;
  17. }
  18. @Override
  19. public String getApiMethodName() {
  20. return "test";
  21. }
  22. @Override
  23. public Map<String, Object> getBizParams() {
  24. return params;
  25. }
  26. @Override
  27. public String getApiVersion() {
  28. return apiVersion;
  29. }
  30. @Override
  31. public void setApiVersion(String apiVersion) {
  32. this.apiVersion = apiVersion;
  33. }
  34. @Override
  35. public String getRequestType() {
  36. return "POST";
  37. }
  38. @Override
  39. public Class<ParamResponse> getResponseClass() {
  40. return ParamResponse.class;
  41. }
  42. @Override
  43. public Map<String, String> getHeaderParams() {
  44. return headers;
  45. }
  46. @Override
  47. public boolean checkSign() {
  48. return clientCheckSign;
  49. }
  50. public void setClientCheckSign(boolean clientCheckSign) {
  51. this.clientCheckSign = clientCheckSign;
  52. }
  53. }

构建 response 对象

您需要构建 response 对象,用于接收响应,代码示例如下:

  1. public class ParamResponse extends ApiResponse {
  2. private String path;
  3. public String getPath() {
  4. return path;
  5. }
  6. public void setPath(String path) {
  7. this.path = path;
  8. }
  9. }

创建 apiClient

使用获取的 AK、SK、host 创建一个 apiClient,代码示例如下:

  1. private String subAppAccessKey = "m9hoHiqtjylGjqXC";
  2. private String subAppSecretKey = "sxCg1uk6UjGARr1hPswE0W2KHe86YvhX";
  3. private String gatewayUrl = "5jzkcn0idt3w4czs.apigateway.inc.alipay.net";
  4. //开启数据加密后,在调用请阅的 API 时必须传入应用的 AK 和 SK 完成加签。
  5. private ApiClient apiClient;
  6. @Before
  7. public void initClient() {
  8. // 初始化请求客户端
  9. ApiSecretKey apiSecretKey = new ApiSecretKey(subAppAccessKey, subAppSecretKey);
  10. List<ApiSecretKey> secretKeys = new ArrayList<>();
  11. secretKeys.add(apiSecretKey);
  12. apiClient = new DefaultApiClient(gatewayUrl, secretKeys);
  13. }

发起调用请求

apiClient 配置完成之后,即可对 API 发起调用。响应会自动序列化到 response 对象里,直接使用即可,代码示例如下:

  1. @Test
  2. public void testNoSignHttp() {
  3. ParamPostRequest request = new ParamPostRequest();
  4. request.setPath("simple/demo");
  5. // 是否对响应进行签名校验
  6. request.setClientCheckSign(false);
  7. ApiResponse response = apiClient.execute(request);
  8. System.out.println(JSON.toJSONString(response));
  9. }