2015-11-08 103 views
2

我想在请求主体之前在请求主体中添加字符串。 我的意思:在Retforit中添加字符串在请求主体之前

但Retofit仅允许请求这样的类型:

{"action":"users.login","data":{"email":"[email protected]", "password":"password"}} 

这里是我的方法的代码接口:

@POST("/api") 
Observable<RequestResult> loginAction(@Body Request<User> userRequest); 

下面是登录活动代码:

User user = new User(); 
user.setEmail("email"); 
user.setPassword("password"); 

    subscription.add(
      service.loginAction(
        new Request<>("users.login", user)) 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<RequestResult>() { 
       @Override 
       public void onCompleted() { 
       } 
       @Override 
       public void onError(Throwable e) { 
       } 
       @Override 
       public void onNext(RequestResult requestResult) { 
       } 
      }) 
    ); 

回答

1

首先,如果要在每个请求之前添加字符串,可以使用OkHttp interceptor指定它们。

就这样,

client.interceptors().add(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 

      String time = DateUtil.getDefaultDateTime(new Date()); 


      RequestBody body = request.body(); 

      String bodyData = "data="; 

      if (body != null) { 
       Buffer bufferedSink = new Buffer(); 
       request.body().writeTo(bufferedSink); 
       bodyData += bufferedSink.readUtf8(); 
      } 

      String tokenData = AppContext.get(ContextConstant.TOKEN, ""); 

      String keyData = request.url() + bodyData + time + tokenData; 

      String key = Encryption.genKey(keyData); 

      String userId = AppContext.get(ContextConstant.CURRENT_USER_ID, ""); 

      String authorization = Encryption.getHeaderValue(userId, AppContext.getInstance().getUUID()); 

      Request.Builder requestBuilder = request.newBuilder(); 

      requestBuilder.header("X-key", key); 
      requestBuilder.header("Authorization", authorization.replace("\n", "")); 
      requestBuilder.header("X-API-Version", AppConstant.API_VERSION); 
      requestBuilder.header("X-Data-version", AppConstant.DATA_VERSION); 
      requestBuilder.header("X-Request-Time", time); 

      Request okRequest = requestBuilder.build(); 

      Response response = chain.proceed(okRequest); 

      return response; 
     } 

    }); 

不过,我只用这样的方式指定标题,而不是指定的RequestBody。

其次,如果你使用GSON,(不幸的是,你没有)

 Gson gson = new GsonBuilder() 
      .setDateFormat(DateUtil.FORMAT) 
      .registerTypeAdapter(User.class, new UserDeserializer()) 
      .registerTypeAdapter(User.class, new UserSerializer()) 
      .create(); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(AppConstant.HOST) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .client(client) 
      .build(); 

在UserSerializer,

public class UserSerializer implements JsonSerializer<User> { 
@Override 
public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) { 
    return new JsonPrimitive("data=" + src.toString()); 
} 

}

我认为这可能由是圆{ } ....

{data={"action":"users.login","data":{"email":"[email protected]", "password":"password"}}} 

最后,我建议你在请求字符串中使用封装类UserData封装“data =”。

我使用Retrofit 2.0 beta 2.

祝你好运!

相关问题