پست یا login شدن در اندروید از طریق کتابخانه volley

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

پیشتر برنامه نویسان برای ارسال داده ها با استفاده از روش پست از کلاس استاندارد جاوا با نام java.net.HttpURLConnection و کلاس استاندارد آپاچی با نام org.apache.http.client استفاده می کردند. محدودیت های روش های مذکور از جمله غیرموازی بودن عملیات های ارتباط با سرور موجب شد شرکت توسعه دهنده اندروید روش جدیدی را تحت عنوان کتابخانه volley  به برنامه نویسان ارائه کند که  در این روش عملیات های موازی امکانپذیر شده است.

برای استفاده از این روش ابتدا کد مربوط به این کتابخانه را در قسمت وابستگی ها یا dependencies (که در builde gradle یا ماژول های اپلیکیشن قرار دارد) که در ذیل به رنگ قرمز مشخص شده است اضافه کرده و از قسمت بالای پنجره ادیتور  آن را sync می کنیم

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:design:23.0.1'
    compile 'com.mcxiaoke.volley:library:1.0.19'
 }

سپس با  استفاده از کدهای زیر

1- ابتدا کلاس volley  را فراخوانی می کنیم

2- url  یا آدرس مربوط به فایل php  خود در سرور را مشخص می کنیم.

3- کلاسrequest  را به منظور پست دادها با متد post  فرخوانی کرده و همزمان متدهای مربوط به آن را به منظور دریافت response  و خطاهای ناشی از آن را فراخوانی یا ایمپلمنت می کنیم. در نهایت با قرار دادن  پارامتر مورد نظر در hashmap  ، رکوئیست خود را اجرا می کنیم

   RequestQueue queue = Volley.newRequestQueue(this);
    url = "http://example.ir/post.php";
    StringRequest postRequest = new StringRequest(Request.Method.POST, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // response
                    Toast.makeText(this, response.toString(), Toast.LENGTH_LONG).show();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    Toast.makeText(myContext, error.toString(), Toast.LENGTH_LONG).show();
                }
            }
    ) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("username", user);
            params.put("password", pass);


            return params;
        }
    };
    queue.add(postRequest);
}


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

اکلیپس :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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.psrd.test.MainActivity"
    tools:showIn="@layout/activity_main">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_alignParentTop="true"
        android:layout_marginTop="113dp"
        android:hint="username"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText2"
        android:layout_below="@+id/editText"
        android:layout_marginTop="32dp"
        android:hint="password"
        android:layout_alignRight="@+id/editText"
        android:layout_alignEnd="@+id/editText" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="login"
        android:id="@+id/button"
        android:layout_below="@+id/editText2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="121dp" />
</RelativeLayout>

همانطور که در بالا می بینیم در لایوت مربوط به اکتیویتی اصلی باتنی را با ایدی button تعریف کرده ایم. که قرار است که با کلیک بر روی دکمه عملیات postانجام شود. همینطور دو EditText  تعریف کرده ایم که قرار است یوزر و پسورد کاربر در داخل آنها نوشته شود. از این رو باتن و دو edittext  را برای کلاس اصلی خود تعریف می کنیم. و سپس بر اساس توضیحات بالا متدی ساختیم که قرار است با سه آرگومان خود عملیات پست را انجام دهد . اولی آدرس فایل php  در سرور-  دومی  یوزر و سومی پسورد است.  به این ترتیب نوعی عملیاتی که با کلیک بر روی باتن انجام خواهد شد ابتدا گرفتن ورودی ها و تبدیل آن به String  و سپس پست آن به آدرس تعیین شده در آرگومان خواهد بود.

 

package com.example.psrd.test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private EditText textuser,Textpass;
    private Button btnsend;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textuser = (EditText)findViewById(R.id.editText);
        Textpass = (EditText)findViewById(R.id.editText2);
        btnsend = (Button)findViewById(R.id.button);
        
        btnsend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                
             String    username  = textuser.getText().toString();
                String password = Textpass.getText().toString();
                String url = "http://psrd.ir/mypost.php";
                postvolley( url, username, password);
                
            }
        });
        

    }

    public  void postvolley(String url, final String username, final String password) {


        RequestQueue queue = Volley.newRequestQueue(this);

        StringRequest postRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        // response
                        Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // error
                        Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_LONG).show();
                    }
                }
        ) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("username", username);
                params.put("password", password);


                return params;
            }
        };
        queue.add(postRequest);
    }

}

در نهایت در قسمت AndroidManifest.xml یا همان مانیفیست برنامه مجوز دسترسی به اینترنت و شبکه را تعریف می کنیم.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.psrd.test">
<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
        if (isset($_POST["username"]) && !empty($_POST["password"])) {
        echo "Yes, your account is set";
        }else{
        echo "N0,your account is not set";
        }
        ?>

در نهایت برنامه را اجرا کرده و در آموزش هرچه بیشتر  خود بهره بگیرید. کپی برداری  برای سایت ها و وبلاگ ها هم من راضی نیستم.

 


1 دیدگاه

صلاح · سپتامبر 27, 2018 در 7:12 ق.ظ

سلام وقت بخیر این کد شما رو من پیاده کردم الان پیغام میده connection Exeption : connection refused
دلیلش چیه؟

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

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

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