引入Retrofit
引入Retrofitt需要引入以下lib:
<repositories> <repository> <id>maven-restlet</id> <name>Public online Restlet repository</name> <url>http://maven.restlet.org</url> </repository> </repositories>
<dependency> <groupId>com.squareup.retrofit</groupId> <artifactId>retrofit</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.1</version> </dependency> <dependency> <groupId>org.restlet.jee</groupId> <artifactId>org.restlet</artifactId> <version>${restlet.version}</version> </dependency> <!-- Jackson JSON Mapper --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency>
如果不是maven工程请下载以上的jar。
Retrofit转换器(JSON<->OBJECT)
通过转换器实现JSON和对象转换,无须手动编写大量业务源代码。REST的server的输入Object可以直接转换到Client的对象。
import java.io.IOException;public class JacksonConverter implements Converter { private final ObjectMapper objectMapper; public JacksonConverter(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } public Object fromBody(TypedInput body, Type type) throws ConversionException { JavaType javaType = objectMapper.getTypeFactory().constructType(type); try { return objectMapper.readValue(body.in(), javaType); } catch (IOException e) { throw new ConversionException(e); } } public TypedOutput toBody(Object object) { try { String charset = "UTF-8"; return new JsonTypedOutput(objectMapper.writeValueAsString(object) .getBytes(charset), charset); } catch (IOException e) { throw new AssertionError(e); } } private static class JsonTypedOutput implements TypedOutput { private final byte[] jsonBytes; private final String mimeType; public JsonTypedOutput(byte[] jsonBytes, String charset) { this.jsonBytes = jsonBytes; this.mimeType = "application/json; charset=" + charset; } public String fileName() { return null; } public String mimeType() { return mimeType; } public long length() { return jsonBytes.length; } public void writeTo(OutputStream out) throws IOException { out.write(jsonBytes); } }}
实例Rest适配器
Rest适配器用于生成Rest interface service的源代码
RestAdapter restAdapter = new RestAdapter.Builder().setServer("http://127.0.0.1:8080/rest").setConverter(converter).build();
建立Rest interface
public interface TaskService{ @GET("/runtime/tasks") DataResponse getTasks(); }
@GET:用的是Rest的get方法
DataRespone:是Rest的返回值
实例化interface并执行
TaskService service=restAdapter.create(TaskService.class); DataResponse dataResponse= service.getTasks();
完整的例子
public class Simple { public static void main(String[] args) throws Exception { // Create our Converter JacksonConverter converter = new JacksonConverter(new ObjectMapper()); RestAdapter restAdapter = new RestAdapter.Builder() .setServer("http://localhost:8080/").setConverter(converter) .build(); TaskService service=restAdapter.create(TaskService.class); DataResponse dataResponse= service.getTasks(); } }
登陆(Activiti)
String header="Basic " + Base64.encodeToString("kermit:kermit")
@GET("/runtime/tasks") DataResponse getTasks(@Header("Authorization") String header);