Retrofit的使用教程(三)
时间:2015-05-07 16:16:05
收藏:0
阅读:459
RequestInterceptor 请求拦截器
对于网络访问请求的重复操作部分都可以这么做.
RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("User-Agent", "Retrofit-Sample-App"); } };
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.setRequestInterceptor(requestInterceptor)
.build();
ERROR
如果需要自定义一个网络访问错误的处理方法,需要自定义一个ErrorHandler.下面的代码当返回码是401的时候抛出一个自定义异常.
class MyErrorHandler implements ErrorHandler { @Override public Throwable handleError(RetrofitError cause) { Response r = cause.getResponse(); if (r != null && r.getStatus() == 401) { return new UnauthorizedException(cause); } return cause; //返回值不能是null,否则运行是会出现异常. } }
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.setErrorHandler(new MyErrorHandler())
.build();
特别注意在网络访问时返回码为40x,50x,IOException时,都会转化为RetrofitError再次抛出.
因为RetrofitError是RuntimeException.不会提示用户进行捕捉.所以如果在Android平台上就会造成应用崩溃.
解决办法就是不要采用同步的方式,采用CallBack异步的方式. 异常在CallBack的failure()方法中就可以得到妥善的处理.不会再次抛出
LOGGING
可以通过添加logging level等级来详细观看请求和响应. logging level 分为 BASIC, FULL, HEADERS, and NONE.
Full等级将会打印request和response的headers.body,和metadata等
RestAdapter restAdapter = new RestAdapter.Builder()
.setLogLevel(RestAdapter.LogLevel.FULL)
.setEndpoint("https://api.github.com")
.build();
不同于拦截器或者ErrorHandler,可以在RestAdapter生命周期的任何时候通过setLogLevel()添加或者更改logging level.
JacksonConverter
如果想使用Jackson,而不使用Gson 可以自定义如下的Converter.
public class JacksonConverter implements Converter {
// Constructor
...
@Override
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);
}
}
@Override
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);
}
}
...
// JsonTypedOutput implementation
}
private static class JsonTypedOutput implements TypedOutput {
private final byte[] jsonBytes;
private final String mimeType;
JsonTypedOutput(byte[] jsonBytes, String encode) {
this.jsonBytes = jsonBytes;
this.mimeType = "application/json; charset=" + encode;
}
@Override public String fileName() {
return null;
}
@Override public String mimeType() {
return mimeType;
}
@Override public long length() {
return jsonBytes.length;
}
@Override public void writeTo(OutputStream out) throws IOException {
out.write(jsonBytes);
}
}
原文:http://www.cnblogs.com/laiqurufeng/p/4484916.html
评论(0)