您的位置:首页 > 理论基础 > 计算机网络

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

2017-02-14 15:03 2831 查看
在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php json okhttp okio
相关文章推荐