Android的okhttp的post请求,php返回json数据。以及遇到的okhttp dispatcher问题,和json解析遇到的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_22256565/article/details/55099021

在build.gradle文件引入:
compile ‘com.squareup.okhttp3:okhttp:3.6.0’
compile ‘com.squareup.okio:okio:1.11.0’
注意:如果没有引入okio的jar包是会报okhttp dispacther错误的,而且还要注意在回调的onResponse()方法中,只能调用一次:response.body().string(),具体原因请看:https://github.com/square/okhttp/issues/1240#issuecomment-233655904

post请求:

String json = "{\n" +
                "\"operation\" : \"register\"  , \"mobile_phone\" : \"" + input_account + "\""
                + "}";
        OkHttpClient okHttpClient = new OkHttpClient();
        //申明给服务端传递一个json串
        //创建一个RequestBody(参数1:数据类型 参数2传递的json串)
        RequestBody requestBody = RequestBody.create(JSON, json);
        //创建一个请求对象
        Request request = new Request.Builder()
                .url("http://45.78.12.140/art/login/login.php")
                .post(requestBody)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {

            //请求失败时调用
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e(TAG , "onFailure: " + e);
            }

            //请求成功时调用
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {

                    String jsonData = response.body().string();
parseJSONWithGSON(jsonData );

                }
            }
        });

    }
 //使用GSON解析json数据
 private void parseJSONWithGSON(String jsonData) {

        //由于我从php服务器返回的数据书字符串,不是数组:[{"name":"hehe" , "age":"10"}],所以使用以下解析json数据的方法。
        Gson gson = new Gson();
        Test t = gson.fromJson(jsonData, Test.class);

      }
//如果使用以下方法,就会报错。返回的数据是数组则使用以下代码解析
Gson gson = new Gson();
usersList = gson.fromJson(jsonData, new TypeToken<List<Test>>() {}.getType());

报错:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2

附上php服务器主要代码:

<?php
    require_once('mysql_connect.php');   //引入数据库连接文件,这个文件是自己写的,主要用来连接数据库。

    $json = file_get_contents("php://input");//解析获取的二进制流 获取的数据格式是json的
    $data = json_decode($json, true);//解析json数据,加第二个参数true 是数组 不然是对象

    $sql = "select * from ecs_users where mobile_phone=?";
    $stmt = $pdo->prepare($sql);        //返回PDOStatement对象。
    $res = $stmt->execute(array("15277907709"));
    if($res == false)         //如果PDOStatement对象为false。
    {
        echo $pdo->errorCode();   //获取错误的错误码,SQLSTATE的值
        echo '<br />';
        //获取错误信息数组,数组中包含3个单元
        //0=>SQLSTAE,1=>CODE错误编号,2=>INFO 错误信息
        $errInfo = $pdo->errorInfo();      //
        print_r($errInfo);
    }
    else
    {
        while($row = $stmt->fetch(PDO::FETCH_ASSOC))
        {
            $user_name = $row["user_name"];
            $password = $row["password_new"];
            break;   //获取一条数据后跳出循环。
        }

        //注意在这里,$json是字符串变量,并不是数组。
        $json = array(
            'name' => $user_name , 
            'age' => $password
        );

        //这样才是以数组的形式返回json数据到客户端。
        $json_send = array();
        $json_send[] =  array(
            'name' => $user_name , 
            'age' => $password
        );
        echo json_encode($json , 128);

    }

    //echo "被影响的行数 = " . $stmt->rowCount();

?>

参考:
okhttp学习参考:
http://www.cnblogs.com/awkflf11/p/5750008.html

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html

http://blog.csdn.net/song_shui_lin/article/details/52936942

php返回json数据参考:
http://blog.csdn.net/qq_14995933/article/details/51674037

展开阅读全文

没有更多推荐了,返回首页