ارسال اطلاعات متنی به سرور در اندروید به روش post

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

یکی دیگر از روش های متداول ارسال اطلاعات به سرور روش post  می باشد. در این روش اطلاعات به صفحه اینترنتی یا همان Url  ارسال می شود. url  همان آدرسی است که برنامه نویس در سمت سرور  برای دریافت اطلاعات و مدیریت آن در سرور به کار می بندد. در این روش ممکن است برنامه نویس ترجیح دهد فایل های یا پست های دریافتی در قالب پوشه ای آپلود شود یا ممکن است در دیتابیس ذخیره شود و یا حتی  دریافت پست های متنی و غیرمتنی  را در فایل مشخصی رایت کند. از این رو  بسته به نوع فایل ، می توان روش های متنوعی در دریافت اطلاعات از کاربران بکار بست. ما در این پست قصد داریم روشی را به شما آموزش دهیم که در آن برنامه نویس می تواند اطلاعات متنی ارسال شده توسط کاربران را در یک فایل متنی ذخیره کند.

اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را  ایجاد کنید

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

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

اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk  و نوع اکتیویتی (blank  یا Empty) ، نام اکتیویتی ابتدایی و اصلی خود  را همان MainActivity قرار دهید. بعد از لود کامل برنامه ، در مسیر res ⇒layout لایه متناظر اکتیوتی اصلی یعنی activity_main را پیدا نمود و کدهای مندرج و پیش فرض آن را پاک کرده و کدهای xml  زیر را به آن اضافه کنید:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


        <EditText
            android:layout_width="fill_parent"
            android:layout_height="120dp"
            android:id="@+id/textview"
            android:hint="yourtext"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginBottom="46dp" />
    <EditText
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:id="@+id/textview1"
        android:layout_below="@+id/textview"
        android:hint="email"
       />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/send"
            android:text="send"
            android:layout_below="@+id/textview1"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="62dp" />


</RelativeLayout>

حال مستقیم به سراغ کلاس MainActivity  رفته و کدهای زیر را به آن می افزاییم:

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.DialogPreference;
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.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;

public class MainActivity extends AppCompatActivity {
public static String text;
    public static String mail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     final   EditText yourtext = (EditText)findViewById(R.id.textview);
        final   EditText yourmail = (EditText)findViewById(R.id.textview1);
        Button sendtext = (Button)findViewById(R.id.send);
        sendtext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                text =  yourtext.getText().toString();
                mail= yourmail.getText().toString();
                new SendPostRequest().execute();
            }


        });


    }

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

        protected void onPreExecute(){}

        protected String doInBackground(String... arg0) {

            try {

                URL url = new URL("http://psrd.ir/fixurl/postvalue.php");  

                JSONObject postDataParams = new JSONObject();
                postDataParams.put("text", text);
                postDataParams.put("email", mail);
                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 new String("false : "+responseCode);
                }
            }
            catch(Exception e){
                return new String("Exception: " + e.getMessage());
            }

        }

        @Override
        protected void onPostExecute(String result) {
            AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity. this);
            alert.setMessage(result);
            alert.setPositiveButton("ok",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,
                                            int which) {
                            dialog.dismiss();
                        }
                    });
            alert.show();
        }
    }

    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();
    }
}

به دنبال تکمیل کدهای کلاس اصلی، فایل AndroidManifest.xml  که مربوط بهpremission یا همان مجوزهاست را باز نموده و مجوز زیر را بدین صورت به آن می افزاییم(دقت کنید که نام پکیج خود را در قسمت قرمز رنگ  که نام پکیج پروژه بنده است لحاظ فرمایید).

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.site.psrd.jsonparser">
<uses-permission android:name="android.permission.INTERNET">
</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  زیر را قرار می دهیم. در این کدها ابتدا سرور متغیرهای پست شده را گرفته ، و بعد از ایجاد یک فایل متنی  با newfile.txt ، آنها را در فایل مذکور رایت می کند.

<?php 
$email = $_POST['email'];
$name = $_POST['name'];
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
  $txt = $email ;
  fwrite($myfile, $txt);
  $txt = $name;
  fwrite($myfile, $txt);
  fclose($myfile);
 if (file_exists("newfile.txt")) {
   echo "Data Sent to server and write to newfile.txt Successfully";  
 }  
 
?>

حال پروژه را اجرا کرده و از آن در آموزش هر چه بیشتر خود استفاده کنید. اگر مشکلی در اجرای کدها وجود دارد یا سوال مشخصی از نویسنده سایت دارید سوالات خود را در قسمت دیدگاه ها بیان کنید. موفق و موید باشید

کپی برداری از محتوای سایت psrd بدون ذکر منبع ممنوع بوده و پیگرد قانونی دارد. (تنها استفاده شخصی کاربران ، مجاز است) (کپی برداری توسط سایر وب سایت ها  غیرقانونی بوده و در صورت رویت به ستاد سازماندهی اطلاع داده خواهد شد.


5 دیدگاه

طراحی سایت مشهد · دسامبر 17, 2017 در 10:16 ب.ظ

اقا دستتون درد نکنه خسته نباشید
عالیییی بود

فرزانه · سپتامبر 10, 2018 در 2:51 ب.ظ

سلام ببخشید این کد php رو کجا باید بنویسیم؟؟؟

سعید · سپتامبر 24, 2018 در 7:43 ق.ظ

سلام
این قسمت کد php که آخر کار نوشتین رو کجا باید بنویسیم؟
ما نیاز به ی کد سمت سرورمون داریم که متن رو که براش ارسال میکنیم دریافت کنه و جواب بده
این کد php که نوشتین همونه؟
کجا باید قرارش بدم؟
مرسی

محسن · دسامبر 20, 2018 در 4:03 ب.ظ

سلام،میشه آموزش رو کاملتر بفرستید برام چون قیسمت فایل php خطا میده برام،از طرفی من رو گوشی برنامه انروید استودیو رو run میکنم،این مشکلی ایجاد نمیکنه؟

امید · ژوئن 19, 2020 در 5:52 ب.ظ

با سلام خدمت شما در قسمت کدهای جاوا شما نامهای email , text رو post کرده بودید برای سرور ولی در کدهای php دریافتی name, email بود
میخواستم بپرسم باید بجای name, text رو قرار بدیم؟؟

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

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

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