在介紹OkHttp的Post請求的基本使用之前,我們需要了解什么是Post,以及什么是Get?對于android程式員來說,對這2個概念不像web工程師那樣熟悉,在這里我們先簡要說明Post和Get請求的區別:
Post或者Get只是Http協議中向后臺服務器發送資料的一種機制,是Http協議的一個組成部分,
Post請求是將要提交到后臺服務器的資料放在Http包的包體中,
Get請求是將資料放在URL之后,比如http://androidxx.cn/forum.php?mo ... d=11&extra=page%3D1,可以看到此URL由2部分組成,分別是http://androidxx.cn/forum.php和?后面的引數,這就是典型的Get請求方式,
因為Get請求時直接將引數放在URL后面,而URL的長度是有一定的限制,所以當傳遞的資料特別大的時候,Get請求就不能完成,
相比較,Post請求的引數是放在Http包的內部,不能輕易被看到;Get請求的引數直接是跟在URL之后,可以很容易被用戶獲取,所以,相對而言,Post的請求方式更安全,
在實際專案開發程序中,什么時候使用Get、什么時候使用Post呢?
Post(當涉及到引數的安全問題或者引數比較大的時候,應該使用Post請求方式),比如:
登陸
注冊
上傳
支付
下單
...
Get(Get就是獲取的意思,專案開發中,如果是相對簡單的查詢類介面可以使用Get請求方式),比如:
獲取圖片
獲取文章詳情
...
以上就是Get和Post的一個簡單的介紹,對剛入門的android程式員應該會有點幫助,然后,接下來我們開始OkHttp的Post異步請求方式的學習,
布局檔案就不貼代碼了,寫兩個EditText分別為用戶名和密碼的輸入,id定位username和password,寫一個button為提交按鈕,id為submit,
public class MainActivity extends AppCompatActivity {
private String jsondata;
private String usernames,passwords;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText username = findViewById(R.id.username);
final EditText password = findViewById(R.id.password);
Button submit = findViewById(R.id.submit);
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (TextUtils.isEmpty(username.getText())) {
Toast.makeText(MainActivity.this,"請輸入用戶名",Toast.LENGTH_SHORT).show();
} else if (TextUtils.isEmpty(password.getText())) {
Toast.makeText(MainActivity.this,"請輸入密碼",Toast.LENGTH_SHORT).show();
} else {
usernames = username.getText().toString();
passwords = password.getText().toString();
okhttpData();
}
}
});
}
//post異步請求
private void okhttpData(){
Log.i("TAG","--ok-");
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client=new OkHttpClient();
//Form表單格式的引數傳遞
FormBody formBody = new FormBody
.Builder()
.add("username",usernames)//設定引數名稱和引數值
.add("password",passwords)//設定引數名稱和引數值
.build();
Request request = new Request
.Builder()
.post(formBody)//Post請求的引數傳遞
.url("http://ip:8080/login")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {}
@Override
public void onResponse(Call call, Response response) throws IOException {
//此方法運行在子執行緒中,不能在此方法中進行UI操作,
jsondata = response.body().string();
//決議
jsonJXData(jsondata);
response.body().close();
}
});
}
}).start();
}
private void jsonJXData(String jsondata) {
if(jsondata!=null) {
try {
JSONObject jsonObject = new JSONObject(jsondata);
String data = jsonObject.getString("message");
if (data.equals("1")){
Looper.prepare();
Toast.makeText(MainActivity.this,"登錄成功",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,HomeActivity.class);
startActivity(intent);
Looper.loop();
}else if (data.equals("2")){
Looper.prepare();
Toast.makeText(MainActivity.this,"用戶名或密碼不正確",Toast.LENGTH_SHORT).show();
Looper.loop();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
Post同步請求只需要將同步請求中的方法enqueue換成execute方法,此處是針對表單格式資料的傳遞,如果是json資料格式:
//設定媒體型別,application/json表示傳遞的是一個json格式的物件
MediaType mediaType = MediaType.parse("application/json");
//使用JSONObject封裝引數
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("引數名","引數值");
} catch (JSONException e) {
e.printStackTrace();
}
//創建RequestBody物件,將引數按照指定的MediaType封裝
RequestBody requestBody = RequestBody.create(mediaType,jsonObject.toString());
Request request = new Request
.Builder()
.post(requestBody)//Post請求的引數傳遞
.url(Config.POST_URL)
.build();
try {
Response response = okHttpClient.newCall(request).execute();
String result = response.body().string();
Log.d("androixx.cn",result);
response.body().close();
} catch (IOException e) {
e.printStackTrace();
}
以上就是異步/同步post請求實作登錄功能的方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/87721.html
標籤:其他
