码迷,mamicode.com
首页 > 其他好文 > 详细

Retrofit的使用教程(三)

时间:2015-05-07 16:18:27      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

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);
    }
  }

  

 

 

 

 
 

Retrofit的使用教程(三)

标签:

原文地址:http://www.cnblogs.com/laiqurufeng/p/4484916.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!