以下程式碼跑完,查詢的時候,只會出現"查無資料,請輸入正確股號",想請問是哪裡出問題,還是要加什麼程式??
謝謝。
MainActivity.java
public class MainActivity extends AppCompatActivity {
private TextView text;
private EditText edit;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.textView);
edit = (EditText) findViewById(R.id.editText);
btn = (Button) findViewById(R.id.button);
}
public void search(View view) {
btn.setClickable(false);
String editext = edit.getText().toString();
if (editext.matches("[0-9]{1}[0-9]{3}"))
new stackpricedown().execute(editext);
else {
text.setText("請輸入正確股號格式");
btn.setClickable(true);
}
}
private class stackpricedown extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
text.setText("資料下載中");
}
@Override
protected String doInBackground(String... strings) {
String result="",htmlInf;
try {
URL url = new URL("http://www.tse.com.tw/zh/stockSearch/stockSearch");
ConnectWeb connectStock = new ConnectWeb(url);
htmlInf = connectStock.postData("stkNo",strings[0]);
if(htmlInf.contains("<!-- 終止上市 -->")){
return "終止上市";
}
else if (htmlInf.contains("各檔權證即時行情及基本資料")) {
result = getstockdata(htmlInf);
}else
result="查無資料\n請輸入正確股號";
}catch(MalformedURLException e) {
return e.getMessage();
}
return result;
}
@Override
protected void onPostExecute(String s) {
btn.setClickable(true);
super.onPostExecute(s);
text.setText(s);
}
}
private String getstockdata(String htmlInf) {
String result="";
Pattern ptn =Pattern.compile("table");
Matcher mch = ptn.matcher(htmlInf);
String subs="";
int start=0,end=0;
while(mch.find()){
start = mch.start();
subs=htmlInf.substring(end,start);
if(subs.contains("開盤競價基準")){
break;
}
end = mch.end();
}
result = subs.split("<td>")[2].replace("</td>","");
return result;
}
}
ConnectWeb.java
public class ConnectWeb {
private URL url;
public ConnectWeb(URL url){
this.url=url;
}
public String postData(String key,String value) {
String htmlInf="";
try{
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
urlConnection.setChunkedStreamingMode(0);//不知道資料長度時呼叫,避免緩存耗盡
urlConnection.setRequestMethod("POST");//預設是GET 用POST要改
urlConnection.setDoOutput(true);//default id false
urlConnection.setDoInput(true);//default is true
String outputData = keyAndValue(key,value);
writeHtmldata(urlConnection,outputData);
htmlInf = readHtmlStream(urlConnection);
} finally {
urlConnection.disconnect();
}
} catch (MalformedURLException e) {
return "Exception:" + e.getMessage();
} catch (IOException e) {
return "Exception:" + e.getMessage();
}
return htmlInf;
}
private String keyAndValue(String key,String value){
StringBuilder outputDataBuilder = new StringBuilder();
outputDataBuilder.append(key);
outputDataBuilder.append("=");
outputDataBuilder.append(value);
return outputDataBuilder.toString();
}
private void writeHtmldata(HttpURLConnection urlConnection,String outputData) throws IOException {
OutputStream os = urlConnection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));//bufferwriter 處理的資料是字串 自動在字元跟位元組之間作轉換
try {
writer.write(outputData);
writer.flush();
}finally {
writer.close();
os.close();
}
}
private String readHtmlStream(HttpURLConnection urlConnection) throws IOException {
InputStream is = new BufferedInputStream(urlConnection.getInputStream());//讀進來時不需做位元組與字元轉換 不需要用reader
OutputStream bo = new ByteArrayOutputStream();
try {
int i = is.read();
while (i != -1) {
bo.write(i);
i = is.read();
}
} finally {
bo.close();
is.close();
}
return bo.toString();
}
}
APP畫面:
教學來源:https://foolcodefun.github.io/blog/android/2017/09/22/Android-%E7%B6%B2%E9%A0%81%E8%B3%87%E6%96%99%E6%93%B7%E5%8F%96.html
網頁實測我實測過沒問題
post stkNo = 1101
也確定可以
且網站文字也有
各檔權證即時行情及基本資料
所以有問題的應該是你的 code
先把
htmlInf = connectStock.postData("stkNo",strings[0]);
的 strings[0] 想辦法印出來看長怎樣
在把 htmlInf 印出來看取到的資料是什麼
也要注意 log 是否有什麼錯誤
搞不好你可能因為權限的問題
根本沒發 post
執行程式出現錯誤訊息Exception:Cleartext HTTP traffic to www.tse.com.tw not permitted
只要在 AndroidManifest.xml 裡加上
<uses-permission android:name="android.permission.INTERNET" />
以及
<application ..
...
android:usesCleartextTraffic="true"
...
/>
即可解決此一錯誤訊息
然而接著出現結果為
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
我就不繼續 debug 了