做一個程式來查詢手機號碼的歸屬地(使用的是HttpURLConnection的post提交方式)
阿新 • • 發佈:2019-02-17
需求 : 使用post方式向伺服器提供手機號,來查詢手機號的歸屬地
思路 :
在網路上有一個web伺服器,專門用來提供手機號的歸屬地資訊,
我們要做的就是訪問該伺服器,提供手機號,然後獲取伺服器發來的響應碼,
從響應碼中解析出需要的歸屬地資訊.
步驟 :1,定義好佈局檔案以及許可權的新增。
2,在主執行緒中獲取需要的控制元件.
3,開啟一個子執行緒,在子執行緒中定義好一個URL,使用該URL物件得到一個HttpURLConnection連線物件.
4,給該連線物件設定好請求方式,請求超時時間,讀取超時時間。
5,給該連線設定一個向伺服器寫資料的允許,然後開始向伺服器寫資料,將手機號資訊傳送給伺服器
6,連線伺服器,得到伺服器的返回碼,判斷連線成功沒,如果返回碼為200,則開始獲取伺服器發來的資料
7,在主執行緒中定義一個Handler,並重寫handleMessage方法。
8,在子執行緒中,將服務端傳送來的資料使用sendMessage傳送到主執行緒中去
9,在主執行緒中的 handleMessage收到資訊後,將該資訊顯示在介面上.
即 :
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
out.write(data.getBytes());
必須放在
conn.connect();前面.
否則會報 java.lang.IllegalStateException: Already connected
程式碼 :
public class MainActivity extends Activity { private EditText editText; private TextView textView;
//7,在主執行緒中定義一個Handler,並重寫handleMessage方法。 private Handler handler = new Handler(){ public void handleMessage(Message msg) { //9,在主執行緒中的 handleMessage收到資訊後,將該資訊顯示在介面上. String text = (String) msg.obj; textView.setText(text); } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //2,在主執行緒中獲取需要的控制元件. editText = (EditText) findViewById(R.id.editText); textView = (TextView) findViewById(R.id.textView); } //點選事件 public void onClick(View v) { //獲取輸入框中的手機號碼 final String phone = editText.getText().toString(); final String data = "mobileCode="+phone+"&userID="; final String url = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo"; //3,開啟一個子執行緒,在子執行緒中定義好一個URL,使用該URL物件得到一個HttpURLConnection連線物件. new Thread(new Runnable() { public void run() { try { URL u = new URL(url); HttpURLConnection conn = (HttpURLConnection) u.openConnection(); //4,給該連線物件設定好請求方式,請求超時時間,讀取超時時間。 conn.setRequestMethod("POST");//依然要大寫 conn.setReadTimeout(5000); conn.setConnectTimeout(5000); //5,給該連線設定一個向伺服器寫資料的允許,然後開始向伺服器寫資料,將資料傳送給伺服器 conn.setDoOutput(true); OutputStream out = conn.getOutputStream(); out.write(data.getBytes()); //6,連線伺服器,得到伺服器的返回碼,判斷連線成功沒,如果返回碼為200,則開始獲取伺服器發來的資料 conn.connect(); int responseCode = conn.getResponseCode(); if(responseCode == 200) { InputStream is = conn.getInputStream(); //自定義個方法,用來提取出經輸入流傳送來的資料 String text = getStringFromInputStream(is); //8,在子執行緒中,將服務端傳送來的資料使用 handler 傳送到主執行緒中 Message msg = new Message(); msg.obj = text; handler.sendMessage(msg); } out.close(); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } //自定義個方法,用來將傳進來的輸入流中的需要的資訊提取出來,再返回去 protected String getStringFromInputStream(InputStream is) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuffer sb = new StringBuffer(); String text = null; while((text = br.readLine()) != null) { sb.append(text+"/r/n"); } text = sb.toString(); int start = text.indexOf("\">")+2; int end = text.indexOf("</"); text = text.substring(start, end); br.close(); return text; } }