我似乎无法弄清楚如何让 android annotations rest client 工作我有两个主要问题。
A)如何解析通用的json响应并获取有意义的key
B)如何添加参数
对于第一个问题,所有响应都以 json 字符串形式返回,格式如下
{"成功":,"消息":"","数据":{}}
成功是布尔值,消息是字符串,数据将是我要解析的主要数据,可能是布尔值、数组、字符串或整数
我很确定我需要拦截响应并处理代码,但我不知道该怎么做
让我们使用一个看起来像这样的真实响应
{"success":true,"message":"随机消息","data":{"profile":{"id":"44","user_id":"44","name":"Matt", "用户名":"mitch","icon":"b1da7ae15027b7d6421c158d644f3220.png","med":"2a3df53fb39d1d8b5edbd0b93688fe4a.png","map":"b7bfed1f456ca4bc8ca748ba34ceeb47.png","background":null,"mobilebackground":null} }
首先在我的拦截器中,我想查看布尔键“成功”是否为真,然后返回数据值
@EBean 公共类 RestInterceptor 实现 ClientHttpRequestInterceptor { 最终字符串 TAG = "休息"; @豆 授权商店授权商店; @覆盖 public ClientHttpResponse 拦截(HttpRequest 请求,byte[] 数据,ClientHttpRequestExecution 执行) 抛出 IOException{ //这里需要设置api键但是什么也没发生代码退出 // Log.d("Rest",authStore.getApiKey()); HttpHeaders 标头 = request.getHeaders(); headers.set("api_key",""); ClientHttpResponse resp = execution.execute(request, data); HttpStatus 代码 = resp.getStatusCode(); if(code.value() == 200){ Log.d(TAG,"成功码200"); //有效的http请求,但它是有效的API请求吗? // 在根 json 对象中执行 if success == true 的一些逻辑 //如果为真,则返回数据键 } 别的{ Log.d(TAG,"失败代码" + code.toString()); } 返回响应; } }
第二个问题是发送带有 api 密钥和会话密钥的 http 请求的参数,我这样定义应用程序类
@EApplication 公共类 MyApp 扩展应用程序 { 最终字符串 TAG = "app"; @豆 授权商店授权商店; @RestService 休息客户端休息客户端; 公共无效 onCreate() { 超级.onCreate(); 在里面(); } @AfterInject 公共无效初始化(){ authStore.setApiKey("dummy_key"); Log.d(TAG, "api 密钥设置为" + authStore.getApiKey()); } }
使用这样的 AuthStore 类
@EBean(范围 = Scope.Singleton) 公共类 AuthStore { 公共字符串 apiKey,sessionKey; 公共字符串 getApiKey() { 返回 apiKey; } 公共无效 setApiKey(字符串 apiKey){ this.apiKey = apiKey; } 公共字符串 getSessionKey() { 返回会话密钥; } 公共无效 setSessionKey(字符串会话密钥){ this.sessionKey = sessionKey; } }
基本上我在单例中的应用程序级别设置了一个虚拟 api 密钥,我应该能够在其余拦截器界面中访问它,但代码只是退出而没有错误我基本上遵循本指南https://github.com /excilys/androidannotations/wiki/Authenticated-Rest-Client
最后,我有一个活动类,它注入了对其余 http 类和 authstore 类有引用的应用程序依赖项
@EActivity(R.layout.activity_login) 公共类 LoginActivity 扩展 Activity { @应用程序 我的应用程序; @ViewById 文本视图电子邮件; @ViewById 文本视图密码; @ViewById 按钮登录按钮; @AfterInject 公共无效初始化(){ Log.d(app.TAG, "登录密钥中的api设置为" + app.authStore.getApiKey()); } @点击 @痕迹 无效登录按钮(){ 登录(email.toString(),密码。toString()); } @背景 无效登录(字符串电子邮件,字符串密码){ app.restClient.forceLogin(); } }
对不起,如果它有很多信息,我已经搜索了一段时间,无法弄清楚!
提前致谢