發(fā)送Http請求
1.HttpURLConnection
2.HttpCilent(API數(shù)量過多,擴(kuò)展困難孝鹊,不建議使用,6.0中已被移除)
3.OkHttp
- HttpURLConnection
private void sendRequestWithHttpURLConnection(){
//開啟子線程來發(fā)起網(wǎng)絡(luò)請求
new Thread(new Runnable(){
@Override
public void run(){
HttpURLConnection connection=null;
BufferedReader reader=null;
try{
//獲取HttpURLConnection實例
URL url=new URL("https://www.baidu.com");
connection=(HttpURLConnection)url.openConnection();
//設(shè)置HTTP請求使用的方法
connection.setRequestMethod("GET");
//其他設(shè)置
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
//獲取服務(wù)器返回的輸入流
InputStream in=connection.getInputStream();
//讀取獲取到的輸入流
reader=new BufferedReader(new InputStreamReader(in));
StringBuilder response=new StringBuilder();
String line;
while((line=reader.readLine())!=null){
response.append(line);
}
showResponse(response.toString());
}catch(Exception e){
e.printStackTrace();
}finally {
if(reader!=null){
try{
reader.close();
}catch(IOException e){
e.printStackTrace();
}
}
if(connection!=null){
//關(guān)閉HTTP連接
connection.disconnect();
}
}
}
}).start();
}
網(wǎng)絡(luò)請求是很耗時的操作,所以要開啟子線程
首先要獲取HttpURLConnection實例,采用URL.openConnection()方法
設(shè)置Http請求所使用的方法吵聪,GET(從服務(wù)器獲取數(shù)據(jù)),POST(向服務(wù)器提交數(shù)據(jù))
還可設(shè)置鏈接超時兼雄,讀取超時毫秒數(shù)以及服務(wù)器希望得到的一下消息頭等
HttpURLConnection.getInputStream()方法獲取服務(wù)器返回的InputStream輸入流
對輸入流進(jìn)行讀取吟逝,最后關(guān)閉HTTP連接使用HttpURLConnection.disconnect()方法
//Android不允許在子線程中進(jìn)行UI操作,要用runOnUiThread方法切換到主線程
private void showResponse(final String response){
runOnUiThread(new Runnable() {
@Override
public void run() {
//在這里進(jìn)行UI操作
mTextViewResponseText.setText(response);
}
});
}
發(fā)送信息給服務(wù)器
把請求方法改成POST并在獲取輸入流之前把要提交的數(shù)據(jù)寫出
connection.setRequestMethod("POST");
DataOutputStream out=new DataOutputStream(connection.getOutputStream());
out.writeBytes("username=admin&password=123456");
注意每條數(shù)據(jù)都以鍵值對的形式存在赦肋,數(shù)據(jù)與數(shù)據(jù)之間用&隔開
- OkHttp
private void sendRequestWithOkHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try{
//創(chuàng)建OkHttpClient實例
OkHttpClient client=new OkHttpClient();
//Requst是OkHttp庫里的
//builder之前可連綴的方法還有很多
//10.0.2.2對于模擬器來說就是電腦本機(jī)的IP地址
Request request=new Request.Builder()
.url("http://10.0.2.2/get_data.json")
.build();
//創(chuàng)建call對象块攒,并調(diào)用它的execute方法來發(fā)送請求并獲取服務(wù)器返回的數(shù)據(jù)
Response response=client.newCall(request).execute();
String responseData=response.body().string();
//parseXMLWithPull(responseData);
//parserXMLWithSAX(responseData);
//parseJSONWithJSONObject(responseData);
parserJSONWithGSON(responseData);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
創(chuàng)建OkHttpClient實例
創(chuàng)建Request實例,并在此時傳入url
利用OkHttpClient.newCall()方法傳入Request對象來創(chuàng)建call對象
調(diào)用call對象的execute()方法來發(fā)送請求并獲取服務(wù)器返回的數(shù)據(jù)Response對象
調(diào)用Response.body().string可將返回的數(shù)據(jù)轉(zhuǎn)換成string佃乘,在把它送去解析
發(fā)送信息給服務(wù)器
構(gòu)建RequestBody對象用來存放待提交的參數(shù)
RequestBody requestBody=new FormBody.Builder()
.add("username","admin")
.add("password","123456")
.build();
調(diào)用Request.Builder中的post()方法傳入RequestBody對象
Request request=new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.builder();