Retrofit เป็น open source library จาก Square บริษัทที่ขายเครื่องรูดบัตร Credit/Debit ผ่านช่องเสียบหูฟัง Ipad ถ้าใครเคยไปอเมริกาก็จะเห็นว่าร้านค้าแทบทุกร้าน ที่มีขนาดไม่ใหญ่มากจะมีแค่ Ipad + Square + Printer แค่นั้นเอง

กลับมาที่ Retrofit ใครที่เคยต้องใช้ API จากผู้ให้บริการสื่อต่างๆไม่ว่าจะเป็น Facebook Instagram หรือที่อื่นๆ ที่ expose service ออกมาเป็น JSON หรือ XML API ก็ตาม ในหลายๆครั้งเราต้องสร้าง Function มารองรับการทำงานของ API แต่ละฟังก์ชั่นเลยทีเดียว เจ้า Retrofit ตัวนี้จะเปลี่ยน function ทั้งหลายของเรา มารวมกันอยู่ใน interface ลองมาดูตัวอย่างกันเลยดีกว่า

ในที่นี้ผมจะสร้าง service ของผมขึ้นมาเองด้วย Servlet ธรรมดาที่ return ข้อมูลเป็น JSON โดยจะใช้ GSON ในการแปลงจาก Class -> JSON String

Retrofit Client <-> Web Servlet (UserInfo/Echo)

เริ่มจาก Class User ธรรมดา

public class User {

    private String name;
    private String address;
}

ต่อด้วย Servlet UserInfo ในที่นี้เป็น Java7 ผมสามารถใช้ try ครอบ PrintWriter โดยที่ไม่ต้อง close writer เองเหมื่อนแต่ก่อน

@WebServlet(name = “UserInfo”, urlPatterns = {“/userinfo”})
public class UserInfo extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType(“application/json;charset=UTF-8”);
        try (PrintWriter out = response.getWriter()) {
            User a = new User();
            a.setName(“Mod”);
            a.setAddress(“Bangkok”);
            Gson gson = new Gson();
            out.println(gson.toJson(a));
        }
    }

อีก Servlet หนึ่งชื่อว่า Echo ไว้ลอง return User ที่รับ parameter name เข้ามา

@WebServlet(name = “Echo”, urlPatterns = {“/echo”})
public class Echo extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType(“application/json;charset=UTF-8”);
        try (PrintWriter out = response.getWriter()) {
            System.out.println(“Sent name : “+request.getParameter(“name”));
            User a =new User();
            a.setName(request.getParameter(“name”));
            a.setAddress(“Bangkok”);
            Gson gson = new Gson();
            out.println(gson.toJson(a));

        }
    }

ที่นี้มาดูในส่วนของ Client

ให้เราไปโหลด retrofit มาจากที่นี่ http://square.github.io/retrofit/ ใครจะโหลด lib มา หรือใครจะใคร่ใช้ maven ก็แล้วแต่สะดวก

ก่อนอื่นให้เรามาสร้าง interface สำหรับ service ที่เราเขียนขึ้นไว้เสียก่อน

public interface TestAPI {
    @GET(“/userinfo”)
    public User userinfo();
    @GET(“/echo”)
    public User echoUser(@Query(“name”) String name);
}

ดูง่ายมากๆ ก็คือเรามีสอง service คือ userinfo และ echo โดย userinfo จะ return class User (ที่สร้างไว้ข้างต้นใน Project java web) ส่วน echo ก็จะ return User เช่นกันแต่ให้ส่ง parameter ชื่อ name ไปด้วย

 

มาต่อที่ Class Main ของเรา

 RestAdapter restAdpt = new RestAdapter.Builder().setEndpoint(“http://localhost:8084/RetrofitSample&#8221;).build();

        TestAPI testAPI = restAdpt.create(TestAPI.class);

        System.out.println(“Test API : “+ testAPI.userinfo().getName());

        System.out.println(“Test API : “+ testAPI.echoUser(“KZ”).getName());

ให้เราทำการสร้าง RestAdapter ที่มี endpoint เป็น webservice ของเรา แล้วก็เอา restadapter ตัวนี้มาผูกกับ interface ที่เพิ่งสร้างเมื่อกี้ หลังจากนั้นเราก็สามารถ execute service ผ่าน interface ของเราได้ทันที ไม่ต้องมานั่งสร้าง HTTPClient abc อีกต่อไป แถมมันยังแปลง JSON กลับมาเป็น Object User ให้เราเองอีกต่างหาก

ผลลัพธ์

— exec-maven-plugin:1.2.1:exec (default-cli) @ RxJavaTest —
Test API : Mod
Test API : KZ

 

แต่ถ้าหากว่าอยากจะเอาไปใช้อ่าน format อื่นๆทาง Retrofit ก็มีสร้างไว้ให้แล้วบ้าง https://github.com/square/retrofit/tree/master/retrofit-converters ถ้าไม่มีก็ต้องเขียนเอง😛