3

我似乎无法弄清楚如何让 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();


    }
}

对不起,如果它有很多信息,我已经搜索了一段时间,无法弄清楚!

提前致谢

4

2 回答 2

1

我不知道您正在使用的库(注释,spring),但在我看来,您正在努力解析success = true,因为这不应该在JSON中。

JSON 最好在您的应用程序 1on1 中表示一个类,以便您可以轻松地将其映射到一个对象中。您的应用程序和 web 服务之间的通信,关于请求的状态应该进入标题。

像这样,您可以在解析 JSON 之前检查请求的标头。

于 2013-08-30T08:29:36.943 回答
0

This is mathod I am using to parse any JSON object recursively.

private void parseJson(JSONObject data) {

        if (data != null) {
            Iterator<String> it = data.keys();
            while (it.hasNext()) {
                String key = it.next();

                try {
                    if (data.get(key) instanceof JSONArray) {
                        JSONArray arry = data.getJSONArray(key);
                        int size = arry.length();
                        for (int i = 0; i < size; i++) {
                            parseJson(arry.getJSONObject(i));
                        }
                    } else if (data.get(key) instanceof JSONObject) {
                        parseJson(data.getJSONObject(key));
                    } else {
                        System.out.println("" + key + " : " + data.optString(key));
                    }
                } catch (Throwable e) {
                    System.out.println("" + key + " : " + data.optString(key));
                    e.printStackTrace();

                }
            }
        }
    }
于 2013-08-30T08:32:46.303 回答