Search code examples
androidgoogle-app-enginebackendgoogle-cloud-endpoints

How to use patch method in google app engine endpoints


I have a model called Bike, i am able to insert,get,list the object. But now i want to update only the price of the Bike Object on the google app engine keeping all the remaining fields as it is. So i have gone through the patch method. I am not getting how to use the patch method in google app engine endpoint to update only the price.

This is my Bike model

@Entity

public class Bike {

@Id
protected Long id;

@Index
protected String imageUrl;

@Index
protected String title;

@Index
protected String price;

@Index
protected String kmpl;

@Index
protected String cc;

@Index
protected String make;


public Bike(){}


public Bike(String s, String s1, String s2, 
String s3, String     s4,String s5) {

    this.title = s;
    this.cc = s1;
    this.kmpl = s2;
    this.price = s3;
    this.imageUrl=s4;
    this.make=s5;

}

public String getPrice() {
    return price;
}

public void setPrice(String price) {
    this.price = price;
}

public String getKmpl() {
    return kmpl;
}

public void setKmpl(String kmpl) {
    this.kmpl = kmpl;
}

public String getCc() {
    return cc;
}

public void setCc(String cc) {
    this.cc = cc;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getImageUrl() {
    return imageUrl;
}

public void setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getMake() {
    return make;
}

public void setMake(String make) {
    this.make = make;
}
}

this is my insert api

/**
 * Inserts a new {@code Bike}.
 */
@ApiMethod(
        name = "insert",
        path = "bike",
        httpMethod = ApiMethod.HttpMethod.POST)
public Bike insert(Bike bike) {
    // Typically in a RESTful API a POST does not have a known ID (assuming the ID is used in the resource path).
    // You should validate that bike.id has not been set. If the ID type is not supported by the
    // Objectify ID generator, e.g. long or String, then you should generate the unique ID yourself prior to saving.
    //
    // If your client provides the ID then you should probably use PUT instead.
    ofy().save().entity(bike).now();
    logger.info("Created Bike with ID: " + bike.getId());

    return ofy().load().entity(bike).now();
}

in the similar way i want to use patch method to update only the price of Bike.


Solution

  • I don't think you can use the PATCH HTTP method with Google Cloud Endpoints, see the doc for @ApiMethod Annotation which says "Methods that take an entity as a parameter should use HttpMethod.POST (for insert operations) or HttpMethod.PUT (for update operations)" (https://cloud.google.com/endpoints/docs/frameworks/java/annotations).

    See also https://cloud.google.com/appengine/docs/java/endpoints/javadoc/com/google/api/server/spi/config/ApiMethod.HttpMethod

    What you can do if you want to avoid sending a complete "Bike" resource representation (for e.g. use less bandwidth) is to create a specific class (annotated as an @Entity) which only has the two necessary fields. Let's call it BikePrice for example

    @Entity
    public class BikePrice {
    
        @Id
        protected Long id;
    
        protected String price;
    

    You then create a dedicated endpoints method (with a BikePrice entity as parameter) in which you load your Bike original entity through Objectify and update it

    ....
        httpMethod = ApiMethod.HttpMethod.PUT)
        public void updateBike(BikePrice bikePrice) {
    
        Bike b = ofy().load().type(Bike.class).id(bikePrice.getId()).now();
        b.setPrice(bikePrice.getPrice());
    ....
    

    Note that you never save any BikePrice entity in the Datastore. It is just used as a kind of "container" or "conveyor of data" between your front end and App Engine.