ارسال اطلاعات به سرور (نحوه پست کردن اطلاعات به سرور)
در این آموزش ما یاد خواهیم گرفت که چگونه با استفاده از متد 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 دیدگاه