Search code examples
javarestcdnakamaipurge

Purging cached urls in akamai through java code?


In my project, whenever an API is called it gets cached in Akamai. But when a client changes something in the database through UI. We need to invalidate cached API's response in AKAMAI and fill it with the new fresh json data. I found some link on the internet : akamai-purging but I am not able to understand what is cp-code in this link they are talking about?

Here is my sample code which is giving: 405 Not Allowed

Code:

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);
}

Solution

  • So finally I was able to do that. This approach I have used is fast purging approach provided by Akamai.

    Code example:

    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);
        }
    }
    

    Dependencies I have used for it:

     <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>