通过 java 代码清除 akamai 中的缓存 url?

Purging cached urls in akamai through java code?

在我的项目中,每当调用 API 时,它都会缓存在 Akamai 中。但是当客户端通过 UI 更改数据库中的某些内容时。我们需要在 AKAMAI 中使缓存的 API 的响应无效,并用新的 json 数据填充它。我在互联网上找到了一些 link:akamai-purging 但我无法理解他们在谈论的 link 中的 cp 代码是什么?

这是我的示例代码,它给出了:405 Not Allowed

代码:

public static void main(String[] args) throws IOException, RequestSigningException {

    URL url = new URL("https://xxx-host-name-/scripts.4535eaf743502b25ba3a.js");

    HttpTransport HTTP_TRANSPORT = new ApacheHttpTransport();
    HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory();
    AkamaiPostData postData = new AkamaiPostData();
    postData.setHostname(AkamaiConstants.SITE_HOST_NAME);

    Gson gson = new Gson();
    String postDataJSON = gson.toJson(postData);
    byte[] contentBytes = postDataJSON.getBytes();
    HttpContent content = new ByteArrayContent("application/json", contentBytes);
    HttpRequest request = requestFactory.buildDeleteRequest(new GenericUrl(url));
    HttpHeaders headers = request.getHeaders();
    headers.set("Host", "xxx-host-name-");

    ClientCredential credential = new DefaultCredential(AkamaiConstants.CLIENT_TOKEN, AkamaiConstants.ACCESS_TOKEN, AkamaiConstants.CLIENT_SECRET);
    RequestSigner signer = new EdgeGridV1Signer(Collections.EMPTY_LIST, 1024 * 2);
    HttpRequest signedRequest = signer.sign(request, credential);
    HttpResponse response = signedRequest.execute();
    String result = response.parseAsString();
    System.out.println("result::" + result);
}

在 Akamai 中清除内容需要 API 凭据。您可以了解有关 Akamai Fast Purge API on the Akamai Developer site. You'll need to either contact your Akamai account team or configure the API access you need in the Luna Control Center 的更多信息。 API 的文档将为您提供了解 API 以及如何配置适当凭据的链接。

作为一小部分跟进,CP 代码是 Akamai 的唯一标识符,将特定域或服务与您的合同绑定以用于计费目的。除了访问 API 所需的凭据之外,您肯定需要知道 Akamai 支持的域正在使用的 CP 代码,以便成功调用快速清除 API。

所以我终于能够做到这一点。我使用的这种方法是Akamai提供的快速清除方法。

代码示例:

public class AkamaiFastPurge {

    private static final String HTTPS = "https";

    public static void main(String... s) throws URISyntaxException, IOException, RequestSigningException {


        ClientCredential credential = ClientCredential.builder()
                .accessToken("Your-access-token")
                .clientToken("Your-client-token")
                .clientSecret("Your-client-secret")
                .host("Your-host")
                .build();


        ArrayList arrayList = new ArrayList<String>();

        // You can add multiple urls.
        arrayList.add("*****-Actual-url-you-want-to-purge*****");

        HttpResponse response = invalidateUrls(credential, arrayList, "production");

        System.out.println(response.getStatusCode());
        System.out.println(response.getStatusMessage());
    }

    public static HttpResponse invalidateUrls(ClientCredential clientCredential, List<String> urls, String network) {

        HttpTransport httpTransport = new ApacheHttpTransport();
        HttpRequestFactory requestFactory = httpTransport.createRequestFactory();

        HttpRequest request = null;

        try {

            // This is fast purge approach
            URI uri = new URI(HTTPS, "api.ccu.akamai.com", "/ccu/v3/invalidate/url/" + network, null, null);

            String requestBody = getStringRequestBody(urls);

            request = requestFactory.buildPostRequest(new GenericUrl(uri), ByteArrayContent.fromString("application/json", requestBody));
            GoogleHttpClientEdgeGridRequestSigner requestSigner = new GoogleHttpClientEdgeGridRequestSigner(clientCredential);
            requestSigner.sign(request);

            return request.execute();

        } catch (IOException e) {
//            log.error("IOException in Akamai Utility", e);
        } catch (RequestSigningException e) {
//            log.error("RequestSigningException in Akamai Utility", e);
        } catch (URISyntaxException e) {
//            log.error("UriSyntaxException in Akamai Utility", e);
        }

        return null;
    }

    public static String getStringRequestBody(List<String> urls) {

        Map<String, List<String>> akamaiRequestMap = Maps.newHashMap();
        akamaiRequestMap.put("objects", urls);

        return new Gson().toJson(akamaiRequestMap);
    }
}

我用过的依赖:

 <dependency>
        <groupId>com.akamai.edgegrid</groupId>
        <artifactId>edgegrid-signer-google-http-client</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>
</dependencies>