在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