android web service clientahnelson/csce4623/lectures/lecture16.pdfandroid web service client...

21
Android Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science and Computer Engineering

Upload: others

Post on 22-May-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Android Web Service Client

Alexander Nelson

November 15, 2019

University of Arkansas - Department of Computer Science and Computer Engineering

Page 2: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Java Interfaces

Page 3: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Java Interface

A Java Interface is a collection of related methods with empty

bodies

Typically, a class will implement an interface

This forces the programmer to implement certain methods so that

the class will be type safe

Page 4: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Example

Example Interface and implementing class

Page 5: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Retrofit

Page 6: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Retrofit – HTTP API for Java

Type-safe HTTP Client for Java

Builds API from a Java Interface

Each method is specified with an HTTP annotation and URL

Example:

public interface GitHubService {@GET(“users/user/repos”)

Call<List<Repo>>listRepos(@Path(“user”) String user);

}

Page 7: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Retrofit Instance

Retrofit class generates an implementation of the API from the

defined interface

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(“https://api.github.com/”)

.build();

GitHubService service = retrofit.create(GitHubService.class)

Page 8: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Call Interface

Retrofit implements a generic type Call interface that:

• Performs HTTP requests

• Handles HTTP responses

• Deserializes responses into the Typed class

Example:

Call<List<Repo>> repos =

service.listRepos(“alexanderhnelson”);

Page 9: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Annotations

Interface annotations enable flexible behavior

Describes the HTTP Requests by:

• URL Parameter replacement

• Query parameter support

• Object conversion to request body

• Multipart request body and file upload

Page 10: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

API Declaration

Every method must have an HTTP annotation that provides

1. Request method

2. Relative URL of the resource

Built-in request annotations:

• HEAD

• GET

• POST

• PUT

• DELETE

Page 11: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Specifying Parameters

Parameters may be specified in the URL

Example:

@GET(“users/list?sort=desc”)

Page 12: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

URL Manipulation

URL can be updated dynamically using replacements and

parameters

A replacement block can be included in the URL

Replacement block defined by a string surrounded by curly braces

“{}”

Example:

@GET(”group/{id}/users”)

Call<List<User>> groupList(@Path(“id”) int groupId);

When this method is called, creates a GET request with the

specified ID

Page 13: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Query Parameters

Query Parameters can be added

(i.e. what shows up after the ? on a REST URL)

Example:

@GET(”group/id/users”)

Call<List<User>> groupList(@Path(“id”) int groupId,

@Query(“sort”) String sort);

Creates a GET at BASE URL/group/id/users?sort=(sort)

Page 14: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Creating Complex Queries

Complex queries can be created using a Map object

@GET(”group/id/users”)

Call<List<User>> groupList(@Path(“id”) int groupId,

@QueryMap Map<String, String> options);

Page 15: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Passing Objects

The HTTP Body can be specified using a Java Object with the

@Body tag

@POST(“users/new”)

Call<User> createUser(@Body User user);

Page 16: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Sending Form Encoded data

Methods can be declared to encode data in form-fields

Use @FormUrlEncoded tag with the HTTP Request

@FormUrlEncoded

@POST(“user/edit”)

Call<User> updateUser(@Field(“first name”) String first,

@Field(“last name”) String last);

Page 17: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Multipart Requests

Create Multipart requests using the @Multipart annotation

Add parts using the @Part annotation in the method definition

Example:

@Multipart

@PUT(”user/photo”)

Call<User> updateUser(@Part(“photo”) RequestBody photo,

@Part(“description”) RequestBody description);

Page 18: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Manipulating Headers

Set static headers for a method with the @Headers annotation

Example:

@Headers({”Accept: application/vnd.github.v3.full+json”,

”User-Agent: Retrofit-Sample-App”

})@GET(”users/{username}”)

Call<User> getUser(@Path(“username”) String username);

Page 19: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Dynamic Headers

Headers can be manipulated dynamically in the method definition

using the @Header tag

Example:

@GET(“user”)

Call<User> getUser(@Header(“Authorization”) String

authorization);

Page 20: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Common Headers

If all requests need the same headers

Use an OkHttp interceptor

https://github.com/square/okhttp/wiki/Interceptors

Page 21: Android Web Service Clientahnelson/CSCE4623/lectures/lecture16.pdfAndroid Web Service Client Alexander Nelson November 15, 2019 University of Arkansas - Department of Computer Science

Retrofit Configuration

Conversion and deserialization

By default, Retrofil will only deseralize to a particular type

(OkHttp ResponseBody)

Allows for conversion to other types using a converter

For JSON, the GSON library is available

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(”my.api.url.com”)

.addConverterFactory(GsonConverterFactory.create())

.build();