ارسال اطلاعات متنی به سرور در اندروید به روش 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 بدون ذکر منبع ممنوع بوده و پیگرد قانونی دارد. (تنها استفاده شخصی کاربران ، مجاز است) (کپی برداری توسط سایر وب سایت ها غیرقانونی بوده و در صورت رویت به ستاد سازماندهی اطلاع داده خواهد شد.
4 دیدگاه
طراحی سایت مشهد · دسامبر 17, 2017 در 10:16 ب.ظ
اقا دستتون درد نکنه خسته نباشید
عالیییی بود
فرزانه · سپتامبر 10, 2018 در 2:51 ب.ظ
سلام ببخشید این کد php رو کجا باید بنویسیم؟؟؟
سعید · سپتامبر 24, 2018 در 7:43 ق.ظ
سلام
این قسمت کد php که آخر کار نوشتین رو کجا باید بنویسیم؟
ما نیاز به ی کد سمت سرورمون داریم که متن رو که براش ارسال میکنیم دریافت کنه و جواب بده
این کد php که نوشتین همونه؟
کجا باید قرارش بدم؟
مرسی
محسن · دسامبر 20, 2018 در 4:03 ب.ظ
سلام،میشه آموزش رو کاملتر بفرستید برام چون قیسمت فایل php خطا میده برام،از طرفی من رو گوشی برنامه انروید استودیو رو run میکنم،این مشکلی ایجاد نمیکنه؟