ارسال اطلاعات به سرور (نحوه پست کردن اطلاعات به سرور)

منتشرشده توسط حامد قنبری در تاریخ

در این آموزش ما یاد خواهیم گرفت که چگونه با استفاده از متد post  ،درخواست یا همان request به سرور ارسال کنیم و اطلاعات مورد نیاز(response )را از آن دریافت کنیم.

 

برای اجرای عملیات ارسال داده ها از  کلاس AsyncTask استفاده کرده ایم. اگر دانش کافی در خصوص نحوه استفاده از این کلاس را ندارید اینجا را کلیک کنید.

در متد doInBackground این کلاس ابتدا آدرس سرور خودمان را تعریف می کنیم . در واقع آدرس  URL همان آدرسی است که اطلاعات کاربران به آن آدرس ارسال خواهد شد و فایل php در آدرس زیر که در  سمت سرور قرار دارد قرار است  اطلاعات را از کاربران دریافت کند.

URL url = new URL(“http://psrd.ir/app/post_toserver.php”);

دومین گام فراخوانی کلاس JSONObject  برای تعریف نام ها و ارزش گذاری های آنهاست  . این کلاس مجموعه ای قابل تغییر از نام / ارزش گذاری. نامها منحصر به فرد هستند و رشته های غیر صفر دارند. مقادیر و ارزش گذاری ها ممکن است ترکیبی از JSONObjects، JSONArrays، رشته ها، Booleans، Integers، Longs، Doubles یا NULL باشد. مقادیر ممکن است null، NaNs، infinities، یا هر نوعی که در اینجا ذکر نشده اند باشد.

 

 

  JSONObject postDataParams = new JSONObject();

postDataParams.put(“name”, name);

postDataParams.put(“family”, family);

سومین گام اتصال به URl  یا سرور با استفاده از HttpURLConnection  است :

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

چهارمین گام :

تعریف تایم و زمان اتصال و خواندن کانکشن، تعریف متد ارسالی که به روش post  می باشد و Set  یا آماده کردن عملیات های Input  و Output در کانکشن تعریف شده.

conn.setReadTimeout(15000 /* milliseconds */);

conn.setConnectTimeout(15000 /* milliseconds */);

conn.setRequestMethod(“POST”);

conn.setDoInput(true);

conn.setDoOutput(true);

پنچمین گام :

فراخوانی OutputStream کانکشن به منظور رایت کردن محتویات ارسالی بوسیله BufferedWriter

 

OutputStream os = conn.getOutputStream();

BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, “UTF-8”)); writer.write(getPostDataString(postDataParams));

ششمین گام :

گرفتن پاسخ response  از کانکشن و خواندن استریم ها با استفاده  BufferedReader  و نهایتا الحاق آن به استرینگ بافر

int responseCode=conn.getResponseCode();

if (responseCode == HttpsURLConnection.HTTP_OK) {

BufferedReader in=new BufferedReader(new InputStreamReader( conn.getInputStream()));

StringBuffer sb = new StringBuffer(“”); String line=””;

while((line = in.readLine()) != null) {

sb.append(line);

break;

}

in.close();

return sb.toString();

}

بطور کلی آشنایی با ساختار کلی برنامه نویسی سوکت می تواند از جنبه های متعددی بر

ارزشمندی و کارایی پروژه ها بیفزاید لزوم بروزرسانی نرم افزارها ، مدیریت اطلاعات داخلی برنامه ، تعامل مستقیم  کلاینت و سرور و …  از جمله مواردی است که ضرورت آشنایی با چنین مباحثی را بیش از بیش روشن می سازد.

ابتدا پروژه جدیدی را با اندروید استودیو یا اکلیپس ایجاد کنید.

اکلیپس :File ⇒ New Android ⇒ Application Project

اندروید استودیو :File ⇒ New  ⇒ New Project

 نام اکتیویتی ابتدایی و اصلی خود  را MainActivity بگذارید.

به دنبال لود کامل پروژه، از مسیر res ⇒ layout لایوت متناظر MainActivity  یعنی activity_main را پیدا کرده و کدهای xml آن را بدین صورت می نویسیم:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.site.psrd.httppost.MainActivity">


   <EditText
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:id="@+id/name"
       android:hint="yourname"
       android:layout_alignParentTop="true"
       android:layout_alignParentLeft="true"
       android:layout_alignParentStart="true"
       android:layout_marginTop="37dp" />
    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/family"
        android:hint="your family name"
        android:layout_below="@+id/name"/>
    <Button
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/send"
        android:text="send to server"
        android:gravity="center" />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="80dp"
        android:id="@+id/display"
        android:layout_below="@+id/send"/>

</RelativeLayout>


لایوت ما شامل دو edittext یک button و textview است . و قرار است برنامه، نام و فامیلی شما را گرفته و به سرور ارسال کند و سپس پاسخ متقابل خود را دریافت کرده و در textview نمایش دهد.

در کلاس MainActivity  برنامه کدهای زیر می نویسیم .

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;

import javax.net.ssl.HttpsURLConnection;

/**
 * Created by h.ghanbari on 12/06/2017.
 */

public class MainActivity extends AppCompatActivity {


    public EditText etfamily, etname;
    private Button btn;
    public String name;
    public String family;
public String res;
    public TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        etname = (EditText)findViewById(R.id.name) ;
        etfamily = (EditText)findViewById(R.id.family);
        btn = (Button)findViewById(R.id.send);
        tv = (TextView)findViewById(R.id.display);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                name = etname.getText().toString();
                family = etfamily.getText().toString();
                if (name != null && family!= null) {
                    new SendPostRequest().execute();
                }else {
                    Toast.makeText(getApplicationContext(), "لطفاً فیلدهای ضروری را پر کنید",Toast.LENGTH_LONG).show();
                }
            }
        });



    }

    public class SendPostRequest extends AsyncTask<String, Void, String> {

        protected void onPreExecute(){}

        protected String doInBackground(String... arg0) {

            try {

                URL url = new URL("http://psrd.ir/app/post_toserver.php"); // here is your URL path

                JSONObject postDataParams = new JSONObject();
                postDataParams.put("name", name);
                postDataParams.put("family", family);
                Log.e("params",postDataParams.toString());

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(15000 /* milliseconds */);
                conn.setConnectTimeout(15000 /* milliseconds */);
                conn.setRequestMethod("POST");
                conn.setDoInput(true);
                conn.setDoOutput(true);

                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(getPostDataString(postDataParams));

                writer.flush();
                writer.close();
                os.close();

                int responseCode=conn.getResponseCode();

                if (responseCode == HttpsURLConnection.HTTP_OK) {

                    BufferedReader in=new BufferedReader(new
                            InputStreamReader(
                            conn.getInputStream()));

                    StringBuffer sb = new StringBuffer("");
                    String line="";

                    while((line = in.readLine()) != null) {

                        sb.append(line);
                        break;
                    }

                    in.close();
                    return sb.toString();

                }
                else {
                    return "false : " + responseCode;
                }
            }
            catch(Exception e){
                return "Exception: " + e.getMessage();

            }

        }

        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getApplicationContext(), result,
                    Toast.LENGTH_LONG).show();
            tv.setText(result);
        }
    }

    public String getPostDataString(JSONObject params) throws Exception {

        StringBuilder result = new StringBuilder();
        boolean first = true;

        Iterator<String> itr = params.keys();

        while(itr.hasNext()){

            String key= itr.next();
            Object value = params.get(key);

            if (first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(key, "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(value.toString(), "UTF-8"));

        }
        return result.toString();
    }
}

در نهایت مجوزهای مشخص شده به رنگ قرمز را به فایل AndroidManfest.xml اضافه کنید.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.psrd.myapplication">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

در سمت سرور نیز در فایل php  کدهای زیر را قرار دهید . در واقع این کدها قرار است اطلاعات ارسالی کاربران را دریافت کند. در این فایل همچنین می توانید اطلاعات ارسالی را در سرور خود ذخیره کنید. که به منظور یادگیری این مبحث می توانید اینجا کلیک کنید .

<?php 
$email = $_POST['email'];
$name = $_POST['name'];
print_r(json_encode($_POST));

?

 

حال می توانید پروژه خود را اجرا کنید و از آن لذت ببرید.


0 دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

-- بارگیری کد امنیتی --