使用Square's Retrofit添加参数签名的智能方法

时间:2014-12-16 20:13:31

标签: retrofit

`我需要联系一个API,要求每个请求都包含所有参数的签名和url + nonce。

示例:

@GET("/users/{type}")
public void getUsers(
    @Path("type") String type,
    @Query("sort") boolean sort)

我应添加包含X-Signature的{​​{1}}标头。 我认为我可以使用signature(nonce+"/users/"+type+"sort="+sort) RequestInterceptor执行此操作,但我不能签名因每个请求而异。

使用Retrofit是否有一种聪明的方法可以做到这一点,或者我只需要手动签署每个请求?

1 个答案:

答案 0 :(得分:3)

我认为您的签名是从[nonce] + [path] + [query params]生成的

您可以查看实现自定义客户端并将其传递到RestAdapter.Builder().setClient(new CustomClient)方法。

类似于CustomClient extends OkClient,然后覆盖execute(Request)方法。您需要创建一个新的Request对象并将其传递给super.execute(updatedRequest)

@Override
public Response execute(Request request) throws IOException {
    List<Header> headers = new ArrayList<>();

    // do work here to parse the request.getUrl() and extract path/params and generate the signature

    headers.addAll(request.getHeaders());
    headers.add(new Header("X-Signature", "signature"));
    Request updated = new Request(request.getMethod(), request.getUrl(), headers, request.getBody());
    return super.execute(updated);
}

如果签名的生成没有一致性,那么您需要手动创建签名并在您的客户呼叫中添加@Header值。