Retrofit 如何优雅的请求这样的后台接口?

2018-08-13 19:19:32 +08:00
 maninfog

请求方式:post ;

请求体为至少包含 token 和 uuid 的 json。eg:{token:"",uuid:"",param1:"",param2:""}. 目前方式,采用继承。

// 基类 request
public class BaseRequest {
  String token;
  String uuid;

  public String toJson(){
    return new Gson().toJson(this);
  }
}

// 子类 
public class TestRequest extends BaseRequest {
  String param1;
  String param2;
}

下面是 retrofit 接口。

    @POST
    fun getXX(@Body requestJson: String)
    
    //使用的伪代码
    TestRequest testRequest = new TestRequest();
    testRequest.param1="";
    testRequest.param2="";
    String json = testRequest.tojson();
    // 网络请求
    getXX(json);

这种方式缺点很明显,不同的请求接口需要定义不同的请求类去继承,我想要的效果是这样的。

    @POST
    fun getXX(String param1,String param2)
    
    接口只需要这样写,然后借助一些注解或者 convert 之类的,在真正请求时,会将其转化成上面的格式。

还请大佬解惑!!

9905 次点击
所在节点    Android
30 条回复
StephenDev
2018-08-13 19:24:52 +08:00
你可以试试请求的时候直接扔对象进去,然后将对象转为 map,key 是字段名,value 就是 param,retrofit 支持这样 map 格式
maninfog
2018-08-13 19:28:40 +08:00
@StephenDev #1 您应该说的是 @FieldMap 这个注解,但是这个 post 到服务器应该是 param1=""&param2=""这种结构,而不是 json 格式数据,所以应该是不适用的。
xiangyuecn
2018-08-13 19:38:18 +08:00
发现别人家定义的注解用多了,写代码飞快。。。自己用简单对象搭积木反而不会,哈哈哈哈哈哈。传说:一顿操作猛如虎::一看战绩 0-5 (逃
MoHen9
2018-08-13 19:41:07 +08:00
为什么不把 token 和 uuid 放在 header 中?
vjnjc
2018-08-13 19:44:40 +08:00
没看明白要求。
按照一楼的思路你用 @body,然后 body 是个 hashmap 不就好了么
maninfog
2018-08-13 19:56:21 +08:00
@MoHen9 后台是这样我也没办法…目前还不能客户端教后台写接口😄
maninfog
2018-08-13 19:59:24 +08:00
@vjnjc 需求是我用某个注解标记请求参数(比如 @Query @Field 这样的),真正请求时,这些被标记的请求参数会和 token 以及 uuid 一起被序列化成 json 数据作为 body post 到服务器。
kingme
2018-08-13 20:06:35 +08:00
通过拦截器阿,在拦截器里面重新组织
maninfog
2018-08-13 20:08:48 +08:00
@kingme 拦截器只能得到请求头的参数把,对于方法中的参数,拦截器应该取不到阿
MoHen9
2018-08-13 20:09:00 +08:00
@maninfog 楼上正解,可以通过 okhttp 的拦截器动态添加
pynix
2018-08-13 20:16:16 +08:00
认证信息放到 header 中。
twoyuan
2018-08-13 20:16:50 +08:00
用 OkHttp 拦截器。通过 chain.request() 取到 request 对象调用 newBuilder() 加上需要的参数后后丢给 chain.process()
pynix
2018-08-13 20:19:02 +08:00
这种调用方式好像也没什么问题,你搞一个构造函数就可以了。

getXX(new TestRequest(p1,p2));
maninfog
2018-08-13 20:22:45 +08:00
@pynix 这个只是一个方法,一个项目中应该有几十个方法,请求参数都不一样,这样的话就要写几十个这样的类,不够优雅😔
maninfog
2018-08-13 20:24:35 +08:00
@twoyuan 想过拦截器 但是后台是用的一个整的 json 而不是键值对的形式 所以用拦截器估计不行吧
twoyuan
2018-08-13 20:30:04 +08:00
@maninfog #15 可以,在拦截器里取出的 Request Body 就是 JSON,然后追加完参数再构造新的 request 对象就好了
pynix
2018-08-13 20:30:28 +08:00
@maninfog 拦截器应该可以的,不过你从拦截器拿到的 body 可能已经序列化了,你需要反序列化,加入字段再序列化,感觉更坑吧,也有可能不是这样的,我没看过拦截器。
xiangyuecn
2018-08-13 20:49:19 +08:00
@maninfog #6 这句话真难听,form 表单 application/x-www-form-urlencoded 请求的 body 格式是一个标准格式。。。后端已经吐了一口老血

顺带杠一句:楼上几位大佬真水( doge
xiangyuecn
2018-08-13 20:54:34 +08:00
我好像理解错了。。。杠的那句收回来,哈哈


主题到底是 A:

后端要求:post: {key1:value,key2:value}
你发送:post: key1=value&key2=value

还是 B:

后端要求:post: key1=value&key2=value
你发送:post: {key1:value,key2:value}
maninfog
2018-08-13 20:58:54 +08:00
@xiangyuecn 主题是: 后端要求 post json 所以我也得 post json

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/479447

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX