Http 上傳資料分成很多種格式
下面會提到利用Form-data以及Raw來傳送資料
先舉利用Form-data來傳送資料的例子
Step 1:
到build.gradle裡面增加Library
useLibrary 'org.apache.http.legacy'
新增的地方為圖所示
Step 2:
新增Http的function
private void Get(){ ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); try{ HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); nameValuePairs.add(new BasicNameValuePair("Key", upload_data)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, org.apache.http.protocol.HTTP.UTF_8)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity); }catch (Exception e){ e.printStackTrace(); } }
上面是只有上船一筆資料
若是有多筆資料,則將 nameValuePairs 多加入要新增的資料即可
也就是說如果有兩種資料需要上傳,則將黃色的那一行變為兩行,並將Key以及uload_data變為你想要上傳的資料即可
Key的定義需要從後台那邊定義好,跟App沒有關係喔!
API回傳的東西會在result裡面
如果需要可以再把他轉成JSONObject或是你所需要的格式
Step 3:
在哪裡執行Get這個function
請記得要執行http這一類的function時要新增一個Thread
否則系統會跟你報錯
System.err: android.os.NetworkOnMainThreadException
好像是為了不讓網路連線這一類的去影顯原本的主線程吧
記得要像下面這樣才會去執行Get這個funcction
Thread thread = new Thread(new Runnable() { @Override public void run() { Get(); } }); thread.start();
Form-data這個方法其實比較簡單,利用一個function就可以完成了!!
接下來是利用Raw的方式來上傳
Strp 1:
跟上面的一樣需要到Build.gradle裡面新增Library
Step 2:
新增Http的function
private void send(final JSONObject data) { new AsyncTask<String, Void, String>() { @Override protected String doInBackground(String... urls) { JSONObject senddata = new JSONObject(); try { senddata = data; Log.d(TAG,"senddata:"+senddata); } catch (Exception e) { e.printStackTrace(); } return getserverresponse(senddata); } @Override protected void onPostExecute(String result) { Log.d(TAG, "result:" + result); } }.execute(); } private String getserverresponse(JSONObject senddata) { try { StringEntity se = new StringEntity(senddata.toString()); HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); httppost.setEntity(se); HttpResponse response = httpclient.execute(httppost); DefaultHttpClient client = new DefaultHttpClient(); Log.d(TAG, "response:" + response.getStatusLine().toString()); if (response!=null) { HttpEntity resEntity = response.getEntity(); InputStream content = resEntity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(content)); StringBuilder builder = new StringBuilder(); for (String line = null; (line = reader.readLine()) != null; ) { builder.append(line).append("\n"); } Log.d(TAG, "token:" + builder.toString()); } return response.getStatusLine().toString(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } return null; }
這裡舉的例子是傳送一個JSONObject
所以要將你要傳送的JSONObject透過send這個function傳送
API回傳的東西會在builder裡面
Step 3:
跟上面的Step 3一樣也是需要開一個Thread來執行send這個function
Thread thread = new Thread(new Runnable() { @Override public void run() { send(upload_data); } }); thread.start();
Raw這個方法其實比form-data看起來複雜一點
但是如果要一次丟很多筆資料,處理起來還是會比form-data簡單一點
留言列表