close

Http 上傳資料分成很多種格式

下面會提到利用Form-data以及Raw來傳送資料


先舉利用Form-data來傳送資料的例子

 

Step 1:

到build.gradle裡面增加Library

useLibrary 'org.apache.http.legacy'

 

新增的地方為圖所示

擷取.PNG

 

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簡單一點

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小小工程師 的頭像
    小小工程師

    理工女孩

    小小工程師 發表在 痞客邦 留言(0) 人氣()