Android Retrofit 使用教程(一)

   2016-09-20 0
核心提示:入门篇保证基本使用 能看懂 且没封装前期准备app的gradle文件里compile ‘com.squareup.retrofit:retrofit:2.0.0-beta2’compile ‘com.squareup.okhttp:okhttp:2.5.0’// 网络请求 同时依赖compile ‘com.squareup.okio:okio:1.6.0’compile ‘com.google.co

入门篇

保证基本使用 能看懂 且没封装

前期准备

app的gradle文件里

compile ‘com.squareup.retrofit:retrofit:2.0.0-beta2’

compile ‘com.squareup.okhttp:okhttp:2.5.0’// 网络请求 同时依赖

compile ‘com.squareup.okio:okio:1.6.0’

compile ‘com.google.code.gson:gson:2.4’

compile ‘com.squareup.retrofit:converter-gson:2.0.0-beta2’//json解析为DAO模型

不解析测试:

public interface Login {
    //    @GET("/user/{username}")
//    Call getUser(@Path("username") String username);
//http://172.16.2.81/api/applogin.php?username=xxx&password=xxx(这是完整的url供格式上的参考)
    @GET("username={username}&password={password}")
//    Call login(@Path("username") String username, @Path("password") String password);
    Call login(@Path("username") String username, @Path("password") String password);

    @GET("api/applogin.php")
    Call login2(@Query("username") String username, @Query("password") String password);

}

Activity中:

public class RetrofitActivity extends BaseActivity {
    private Button retrofitReq;
    private String ctmLogin = "http://172.16.3.8:8092/";// 请换成自己能请求下来的url
    private String param_user = "username";
    private String param_pass = "password";
    private String userename;
    private String password;
    Login loginservice;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retrofit);
        retrofitReq = fView(R.id.retrofitReq);
        showSnack(retrofitReq, "Retrofit体验区");
        //        (1)创建Retrofit实例
        Retrofit req = new Retrofit.Builder().baseUrl(ctmLogin).
//                addConverterFactory(GsonConverterFactory.create()).
        build();
//        (2)定义Endpoints,实现了转换HTTP API为Java接口
//        @GET("user/list")
//                (3)Accessing the API
        loginservice = req.create(Login.class);
        userename = "yihaibin";
        password = "oacrmtest";
    }

    public void send(View v) {
        final Call call = loginservice.login2(userename, password);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Response responseBodyResponse = call.execute();
                    ResponseBody body = responseBodyResponse.body();
                    DebugLogUtil.getInstance().Info("" + body.string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();


    }
}

添加GSon解析

将 addConverterFactory(GsonConverterFactory.create()). 注释放开

然后再send()函数中替换为以下内容

final Call callLogin = loginservice.login(userename, password);
        callLogin.enqueue(new Callback() {
            @Override
            public void onResponse(Response response, Retrofit retrofit) {
                User user = response.body();

                DebugLogUtil.getInstance().Info("code=" + response.code());
                DebugLogUtil.getInstance().Info("response.message()=" + response.message());
                DebugLogUtil.getInstance().Info("response.toString()=" + response.toString());


            }

            @Override
            public void onFailure(Throwable t) {
                DebugLogUtil.getInstance().Info("onFailure" + t);
            }
        });

但是,如上部分代码,在请求成功的回调中,得到的返回值跟预期不一样 只有字母 没有汉字“登陆成功”(是后台写的);

反省了,属于我粗心,model类写错了 ,好长时间没加接口到项目中,都忘了怎么弄了 才想起来;

final Call callLogin = loginservice.login(userename, password);
        callLogin.enqueue(new Callback() {
            @Override
            public void onResponse(Response response, Retrofit retrofit) {
                User user = response.body();
                DebugLogUtil.getInstance().Info("code=" + user.getCode());
                DebugLogUtil.getInstance().Info("response.message()=" + user.getDatas().getMessage());
            }

            @Override
            public void onFailure(Throwable t) {
                DebugLogUtil.getInstance().Info("onFailure=" + t);
            }
        });

javabean

package com.czh.khjingying.model;

/**
 * 登录返回信息
 * Created by LiJianfei on 2016/8/2.
 */
public class User {

    /**
     * code : 200
     * datas : {"key":"e????9a","message":"登陆成功"}
     */

    private String code;
    /**
     * key : ea7?????9a66f678f9a
     * message : 登陆成功
     */

    private DatasBean datas;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public DatasBean getDatas() {
        return datas;
    }

    public void setDatas(DatasBean datas) {
        this.datas = datas;
    }

    public static class DatasBean {
        private String key;
        private String message;

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }
    }
}

出错记录

1 public final static String ctmLogin = “ http://172.16.3.8:8092/api “;

在interface中:

@GET(“/applogin.php”)// 不用问号

Call login(@Query(“username”) String username, @Query(“password”) String password);

会出错:

 Android Retrofit 使用教程(一)

user空指针;如果按照我前面教程里拼接方式 不会出错(方式不限于引用还是直接赋值,关键在于,拼在interface中的部分)。如果之前的interface内容不能正常请求的话

就改成这样


@GET("/api/applogin.php")// 不用问号
Call login(@Query("username") String username, @Query("password") String password);
tip:开始我以为是二级页面不能作为baseurl呢 ,最后我用了一个完整的多级页面进行测试(” http://op.juhe.cn/onebox/weather/query

“;) ,正常请求;我遇到的错误可能是自家后台数据的问题了 ;

 
标签: Retrofit
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • [Java] Retrofit2.0 如何进行GBK编码
    对Retrofit + OkHttp还不熟悉的人可以点传送门,先看下这两个东西的使用。Retrofit:https://github.com/square/retrofitOkHttp:https://github.com/square/okhttp分析接口文档要求Post请求,字段使用GBK编码我们先按照Retrofit的规范和接口文档来写接口: @PO
    12-23 RetrofitJava
  • Android常用的开源项目及其比较系列-Retrofit进
    上一篇我们谈了谈Androiod开源项目的网络框架, 比较了它们之间的优缺点,原文在这里。今天我们着重谈谈Retrofit框架如何更友好的使用,本着提出问题解决问题的原则,也为大家以后解决问题提供基本思路。目前都有哪些问题?根据官方Demo, 简单使用是这么样的
  • Android MVP架构实践
    Android MVP架构实践
    首先声明一下,没有完美的架构,只要适合自己的项目,那就是最好的架构。本例子是MVP + Retrofit + RxJava结合的例子,但本文的重点在于讲解MVP架构,所以涉及Retrofit和RxJava的部分将直接略过,默认读者已了解这两部分内容,如有需要,请自行查阅相关资料,
  • 从 Retrofit 源码学习 Java 的动态代理的使用
    Retrofit 是当前 Android 最流行的 HTTP 网络库之一了,其使用方式比较特殊,是通过定义一个接口类,通过给接口中方法和方法参数添加注解的方式来定义网络请求接口。这种风格下定义一个网络接口变得很简单。不过 Retrofit 是如何使用一个接口的 Class 创建出
    11-13 RetrofitJava
  • 打造企业级网络请求框架集合 retrofit+gson+mvp
    打造企业级网络请求框架集合 retrofit+gson+m
    本文是企业级网络框架第二篇主要讲MVP模式和Gson在Retrofit网络请求框架下的使用方式。(已更新为一篇) 对MVP不了解的请看梦之鬼索MVP模式在Android中的设计和实现 http://blog.csdn.net/androidmsky/article/details/52248797 对Retrofit还不了解的情看 打
    10-31 RetrofitGson
  • Retrofit分析之框架设计艺术
    Retrofit分析之框架设计艺术
    Retrofit使用者会觉得接口+注解方式去写网络请求很吊。但当你真正的去看它的源码,会被它独特,漂亮的解耦方式所吸引,整个结构运用了动态代理,策略模式,Builder模式,工厂等设计模式。Retrofit v2.1基于Okhttp3,可以说是对okhttp进行二次封装。先感受一下
    10-07 Retrofit
  • Android Retrofit框架解析
    随着Google对HttpClient的摒弃,和Volley的逐渐没落,OkHttp开始异军突起,而Retrofit则对okHttp进行了强制依赖。Retrofit也是Square公司开发的一款针对Android网络请求的框架,其实质就是对okHttp的封装,使用面向接口的方式进行网络请求,利用动态生成的代理类
    10-04 Retrofit
  • Android网络开源库-Retrofit(五)简易封装
    1.前言Rrtrofit的扩展性很强,如果对retrofit不熟悉的话,是很难应对各种各样的需求的。因此,在这里,做一下简单的封装。主要为了下面三点需求:使用简单加密处理错误处理2.怎样才能简单使用为了简单粗暴,我做了以下工作。使用单例Retrofit引入RxJava在这里
  • Android网络开源库-Retrofit(四)文件相关
    以前写过一些retrofit的相关文章,当时只是自己学习研究的,最近项目,加入了retrofit,因此遇到了一些问题,需要记录一下。1.前言在以前,写过retrofit上传文件相关,但是,需求总是变化的。前面的,介绍了上传进度的监听,但是,那时候是监听单文件进度。虽
  • 急速开发系列——Retrofit 响应数据及异常处理
    今天我们来谈谈客户端对通讯协议的处理,主要分为三部分:约定响应数据格式,响应数据的自动映射以及错误处理三部分。由于数据协议采用json的居多,因此我们在此基础上进行说明。约定响应数据格式协议格式通常来说,你拿到的设计文档中会存在通信协议的说明,
    09-29 RetrofitGson
点击排行