Android的okhttp的post请求,php返回json数据。以及遇到的okhttp dispatcher问题,和json解析遇到的问题
在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 = "{
" +
""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格式返回数据
- 下一篇: php 正确的输出json格式
