سپهر بهروزی

استفاده از WordPress JSON API با Java

json_and_android_friendship

یکی از کارهایی که این روزها اکثر دارندگان سایت برای سایتشان انجام می دهند درست کردن اپلیکیشن موبایل است. اپلیکیشنی که محتوای سایت را سریع و متناسب با اندازه ی دستگاه های موبایل به کاربر نشان دهد و کاربر بتواند محتوای سایت را بدون کم و کاست و بدون استفاده از یک لپ تاپ یا کامپیوتر بخواند. اگر سایت شما با وردپرس نوشته شده باشد و بخواهید برای سایتتان یک اپ اندروید بسازید، مهم ترین و پایه‏‏‎ای ترین کاری که این اپ باید بکند نشان دادن پست های منتشر شده روی سایت، کامنت گذاشتن زیر هر پست و اگر پست ها، قابلیت لایک شدن هم داشته باشد، لایک کردن پست ها است. پس برای وصل شدن به وردپرس به یک کتابخانه در جاوا نیاز دارید.

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

 

بعد از چندین جستجو در گوگل و سایت رسمی وردپرس کتابخانه ی Jwordpress را برای کار انتخاب کردم. قابلیت Writability بالای این کتابخانه و منظم شدن کدهای من، خیلی مرا به استفاده از این کتابخانه ترغیب کرد. انگار در حال کد زدن داشتم با یک انسان صحبت می کردم! تصور کنید تنها کاری که باید می کردم این بود:

 

	String username = args[0];
	String password = args[1];
	String xmlRpcUrl = args[2];
	wordpress wp = new wordpress(username, password, xmlRpcUrl);
	List <page> recentposts = wp.getRecentPosts(10);

 

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

 

محدودیت دیگری که این کتابخانه دارد این است که شما با داشتن شناسه ی یک پست قادر نیستید آن پست را از سایت بگیرید. به زبان خودمان متد getPost(ID) وجود ندارد! البته طبیعی است چون این کتابخانه هنوز عمر زیادی ندارد و مسلما خیلی از قابلیت ها هنوز به این کتابخانه اضافه نشده است. در سایت وردپرس اسم JSON را دیده بودم و بعد کمی جستجو فهمیدم این پلاگین وردپرس بسیار قدرتمند است و امکانات زیادی در اختیار برنامه نویسان قرار می دهد.

 

اساس کار این پلاگین، رشته است. یعنی تمام اطلاعات را در قالب یک رشته به برنامه ی شما می دهد و شما باید آن رشته را تفسیر کنید. خوشبختانه تمام زبان های برنامه نویسی معروف امروز، یک کتابخانه برای کار با JSON را دارند و کار شما بسیار راحت است. از طرفی خود پلاگین JSON API با زبان php نوشته شده و می توان به راحتی آن را تغییر داد و بنا به نیازتان، قابلیت هایی به این پلاگین اضافه کنید.

از دیگر مزیت هایی که JSON API  دارد این است که شما برای وصل شدن به این پلاگین نیاز به اکانتی در وردپرس سایتتان ندارید و منطقی هم هست، زیرا کسی که سایت شما را باز می کند بدون داشتن حساب کاربری می تواند سایت را ببیند‍! همچنین درخواست ها می توانند هم به صورت GET باشند و هم POST.

 

به راحتی با داشتن کمی اطلاعات راجع به php می توانید متدهای مورد نیازتان را به این پلاگین اضافه کنید و از آنها استفاده کنید.

 

جاوا ، یک کتابخانه برای کار با JSON  دارد. کار با این کتابخانه بسیار ساده است.

 

در پنل وردپرس سایتتان و در قسمت تنظیمات JSON API می توانید urlهای مربوط به این پلاگین را پیدا کنید. تنها کاری که باید بکنید این است که به url مورد نظرتان یک request بفرستید.

 

JSON API Setting

 

با کمک کتابخانه ای که JSON  برای استفاده در جاوا آماده کرده است، می توانید رشته ی دریافت شده را به سادگی تفسیر کنید و اطلاعات را از آن استخراج کنید. رشته ای که دریافت می کنید به صورت جفت هایی از کلید و مقدار است و همیشه یکی از اینها کلید status است. اولین بار که با JSON کار می کنید ممکن است تفاوت بین JSON Object و JSON Array کمی شما را گیج کند اما کمی دقت که به خرج دهید می بینید همه چیز به صورت منظم در اختیار شما قرار گرفته است.هر JSON Object آرایه ای از کلید و مقدار ها است و هر JSON  Array آرایه ای از JSON Objectها است! شاید شکل زیر بتواند تا حدودی تفاوت این دو را نشان دهد.

 

JsonArrayAndObject

 

رشته ی دریافت شده از یک JSON url را می توانید با سازنده ی کلاس JSON Object به یک شیء JSON تبدیل کنید.

 

JSONObject obj = new JSONObject(myJsonString);

 

و بعد از آن تمام اطلاعاتی که از Request گرفتید داخل این شیء موجود است، تنها باید بدانید که چه مقداری با چه کلیدی ذخیره شده است. برای مشاهده ی جزئیات یک رشته ی JSON در مرورگر خودتان پیشنهاد من استفاده از یک JSON Viewer است که هم به صورت آنلاین می توانید بسیاری از این Viewerها را پیدا کنید هم افزونه های زیادی برای کروم و فایرفاکس برای این کار موجود است. فرض کنید می خواهیم یک رشته ی JSON از متد getPosts دریافت کنیم و این رشته را در جاوا تفسیر کنیم و در دستگاه اندرویدی به کاربر نمایش دهیم. ابتدا از یک Viewer در مرورگر کامپیوترتان کمک بگیرید تا کلیدهای هر بخش را ببینید و متوجه شوید که اجزاء مختلف یک پست (موضوع، خلاصه، تگ، نویسنده و …) دقیقا با چه نظمی درون این رشته ذخیره شده اند.

 

JSON_Viewer

 

اکنون باید یک Request به آدرس متد getPosts بفرستیم. (فرض کنید آدرس این متد برای کارمان mysite.com/api/getposts است) قطعه کد زیر رشته ی JSON را درون متغیر JsonString ذخیره می کند.

 

پس از گرفتن رشته ی JSON می توانیم اجزاء مختلف آن را مانند کد زیر از آن استخراج کنیم:

 

	HttpGet httpGet = new HttpGet(jsonURL);
	HttpClient client = new DefaultHttpClient();
	HttpResponse response = client.execute(jttpHet);
	HttpEntity entity = response.getEntity();
	String JsonString = new String(EntityUtils.toString(entity));

 

با یک تحلیل ساده و فهمیدن اینکه برنامه تان چه کلاس هایی نیاز دارد، می توانید هر رشته ی JSON را توسط متد کلاس مربوط به آن Parse کنید و به کدتان نظم دهید.

 

	JSONObject obj = new JSONObject(JsonString);

	String postTitle = obj.getString(KEY_POST_TITLE);
	String postContent = obj.getString(KEY_POST_CONTENT);
	String postImageUrl = obj.getString(KEY_POST_IMAGE_URL);

	JSONArray commentArray = obj.getJSONArray(KEY_POST_CONTENT);

	// Set TextView's text with extracted elements from JSONObject
	txtPostTitle.setText(postTitle);
	txtPostContent.setText(postContent);
سپهر بهروزی

برنامه نویس اندروید سارینا، عاشق گجت های اندرویدی و گیتار

  1. دوشنبه، ۳۰ تیر ۱۳۹۳ محمد
    این پلاگین وردپرس از نظر امنیتی مشکل داره اگه درست تنظیم نشه؛ مثلن update_post رو اگه بشه با یه GET ساده اجرا کرد، باید با سایتمون خداحافظی کنیم :)

    ضمنن راجع‌به کتاب‌خونه اولی هم با decompile شدن برناممون ممکنه رمز ادمین سایت از دست بره؛ مگه این‌که کد رو obfuscate کرده باشیم.
    • سپهر بهروزی
      دوشنبه، ۳۰ تیر ۱۳۹۳ سپهر بهروزی
      ممنون محمد جان از اینکه من رو راهنمایی کردی
      من خودم هم به این موضوع شک داشتم اما برای این متدی که شما گفتی لازمه که ابتدا یک nonce دریافت کنیم. راجع به این موضوع با بچه های php مشورت کردم و اونا گفتن نگران امنیتش نباشم :)
  2. سه شنبه، ۳۱ تیر ۱۳۹۳ سروش ناظمی
    آفرین سپهر. کلی حال کردم.
  3. یکشنبه، ۵ مرداد ۱۳۹۳ مصطفی حاجی‌زاده
    برای این طور کارها تو جاوا با کتابخانهٔ retrofit آشنا هستین؟ نشونی‌اش اینه: http://square.github.io/retrofit

    به نظرم کارهای این طوری رو خیلی راحت‌تر می‌کنه.
  4. پنج شنبه، ۶ آذر ۱۳۹۳ vahid.dialame
    سلام. لینک این پلاگین را بزارید.
    • سپهر بهروزی
      جمعه، ۷ آذر ۱۳۹۳ سپهر بهروزی
      سلام
      برای استفاده در وردپرس :
      https://wordpress.org/plugins/json-api/

      و کتابخانه ای که در جاوا مورد نیاز است:
      http://sourceforge.net/projects/json-lib/files/

      یک رفرنس خوب و قابل اعتماد هم خود گوگل برای این کتابخانه آماده کرده:
      http://developer.android.com/reference/org/json/package-summary.html
  5. پنج شنبه، ۲۰ آذر ۱۳۹۳ دانشجو
    با سلام واحترام
    سایتم را با وردپرس ساخته شده
    ایا میتونم یک برنامه اندروید بسازم مانند دیوار یا بازار
    چه چیزی را باید در اختیار سازنده اپ بزارم
    • سپهر بهروزی
      یکشنبه، ۱۰ اسفند ۱۳۹۳ سپهر بهروزی
      سلام
      این موارد کاملا به نیاز شما بستگی داره، اینکه انتظار دارید برنامه ی اندرویدی سایتتون چه امکاناتی داشته باشه، برنامه نویس اندرویدتون رو مجبور میکنه که از سایت شما اطلاعات مختلفی استخراج کنه.
      در پروسه ی طراحی اپ مطمئن باشیوباشید که نیازها به تدریج خودشون رو نشون میدن
      موفق باشید
  6. یکشنبه، ۱۰ اسفند ۱۳۹۳ saber
    با سلام وتشکر بابت پست بسیار مفید
    آقا داکیومنت فارسی وجود نداره برای کار با json?
    • سپهر بهروزی
      یکشنبه، ۱۰ اسفند ۱۳۹۳ سپهر بهروزی
      سلام
      ممنون که مطلبم رو خوندید، راستش من خیلی دنبال داکیومنت فارسی نبودم برای جیسون. پیشنهادم به شما اینه که از داکیومنت ها و رفرنسهای انگلیسی استفاده کنید. ممکنه اولش یکم براتون سخت باشه خوندن متن های انگلیسی ولی مطمئن باشید نتیجه ی بهتری میگیرید.
  7. یکشنبه، ۱ آذر ۱۳۹۴ Hossein kh
    با سلام
    دوستان بنده تازگي اندرود رو شروع کردم و به شدت ميخام جيسون رو ياد بگيرم
    بنده هم طبق راهي که بالا گفته شده برنامه نوشتم اما الان ميخام با جيسون کار کنم اما هرچي ميگردم نميتونم اموزشي پيدا کنم(يوتوب و گوگل)
    از طرفي نميتونم با جيسون کار کنم و php بلد نيستم
    اگه امکانش هست درمورد json در وردپرس توضيح بديد و اگه ميشه اموزشي قرار بديد و همينطور کدوم پلاگين وردپرس براي استفاده از جيسون نيازه
    ممنون از همگي
  8. جمعه، ۴ دی ۱۳۹۴ هادی شهرانی
    سلام
    سورس کدش رو می تونی برام بفرستی؟
    با تشکر از مطالب خوبتون
  9. دوشنبه، ۳ اسفند ۱۳۹۴ بهروز
    سلام من دقیقا نفهمیدم چجوری لینک خروجی جیسون سایت رو بدست بیاریم !!!
    • چهارشنبه، ۱ اردیبهشت ۱۳۹۵ دانیال
      منم اصلا نفهمیدم
  10. پنج شنبه، ۲۶ فروردین ۱۳۹۵ حامد
    سلام
    ممنون از شما ، استفاده کردیم.
    ما این کار رو برای وب سایت http://arganian.ir بدون کتابخانه انجام دادیم. فقط به کمک کوئری خود وردپس خروجی جیسون هایی که مورد نیاز بود رو ساختیم. و البته امکان ارسال کامنت رو هم با همین قضیه اوکی کردیم.
    https://cafebazaar.ir/app/ir.arganian.arganian
  11. شنبه، ۲۲ خرداد ۱۳۹۵ سعید
    با سلام کد requestنیفتاده؟
  12. دوشنبه، ۷ تیر ۱۳۹۵ میلاد امینی
    سلام
    وقت بخیر
    عذر میخوام میخوام با متد گت پست بیام و اطلاعات یه پست بخصوص رو نمایش بدم
    چجوری میشه دقیقا؟ممنون میشم راهنمایی بفرمایید
  13. شنبه، ۳۰ مرداد ۱۳۹۵ علی
    سلام ببخشید من این افزونه وردپرس رو دارم استفاده میکنم و مطالب دسته بندی های مختلف رو میخوام اما فقط 5 تا مطلب اخر هر دسته رو نشون میده
    من همه مطالب رو نیاز دارم... باید چیکار کنم؟
  14. چهارشنبه، ۱۰ شهریور ۱۳۹۵ امیر الفت
    وقتتون بخیر
    با تشکر از مطلب مفیدتون
    ما قصد داریم تا از داخل اپلیکیشنی که داریم روش کار می کنیم لوگین کنیم به وردپرس و برای این کار نمیدونیم باید از چه کتابخونه و ای پی آیی استفاده کنیم و به چه صورت

    ممنون میشیم راهنماییمون کنید
  15. جمعه، ۲۸ آبان ۱۳۹۵ وحيد ارجمند
    سلام
    ممنون از مطلب مفيدتون، اما من براي يه پروژه كه لازمه ارتباط بين اندرويد و وردرس ايجاد بشه از افزونه wordpress rest apiاستفاده كردم ميخواستم ببينم نحوه پياده سازي ارتباط براي درخواستهاي post رو ميتونين اموزش بدين؟
    خيلي ممنون ميشم
  16. جمعه، ۲۸ آبان ۱۳۹۵ وحيد ارجمند
    وقتتون بخیر
    با تشکر از مطلب مفیدتون
    ما قصد داریم تا از داخل اپلیکیشنی که داریم روش کار می کنیم لوگین کنیم به وردپرس و برای این کار نمیدونیم باید از چه کتابخونه و ای پی آیی استفاده کنیم و به چه صورت

    ممنون میشیم راهنماییمون کنید
    • سپهر بهروزی
      دوشنبه، ۱ آذر ۱۳۹۵ سپهر بهروزی
      سلام
      ممنون که این مطلب رو خوندید.
      کتابخانه‌های زیادی برای ارسال درخواست و دریافت پاسخ ‌http برای جاوا وجود دارند. ساده‌ترین و البته کم امکانات‌ترین این کتابخانه‌ها، volley نام دارد که توسط گوگل توسعه داده شده. در صورتی که آپلود فایل نداشته باشید این کتابخانه برای کارتان کافی است.
      اگر نیاز دارید درخواست‌های پیچیده‌تر داشته باشید و دسترسی به header و دیگر اجزای یک درخواست برایتان مهم است کتابخانه Retrofit رو بهتون پیشنهاد میکنم. قطعا یک مقدار کار با این کتابخانه پیچیده‌تر است اما امکانات بسیار بسیار زیادی در اختیارتان می‌گذارد.
      در نهایت اگر نمی‌خواهید از کتابخانه‌ای استفاده کنید باید با کلاس HttpUrlConnection آشنا شوید تا بتوانید روی پروتکل http درخواست‌هایتان را بفرستید.

      volley -> https://android.googlesource.com/platform/frameworks/volley
      Retrofit -> https://square.github.io/retrofit
      HttpUrlConnection -> https://developer.android.com/reference/java/net/HttpURLConnection.html
      • یکشنبه، ۲۰ فروردین ۱۳۹۶ وحيد
        سلام دوباره ايا براي درخواستهاي post هم ميشهراهنمايي كنيد كه چجوري ميشه مطالب رو از طريق rest api با لاگين يا auth آموزش بدين؟
        من با jwt كار كردم اما نميدونم چجوري ميشه token رو فرستاد كه تاييد بشه توسط وردپرس
  17. دوشنبه، ۶ دی ۱۳۹۵ کاوه
    ممنون از مطلبتون. Json api تو سایت من فعال نیس همچنین افزونه wp reset api هم ک بهش نیاز دارم نصب میشه ولی فعال نمیشه . لطفا راهنمایی کنید
  18. دوشنبه، ۲۵ بهمن ۱۳۹۵ امیرحسین آقاجانی
    سلام..
    من میخوام نسخه موبایل بسازم!
    یه ایندکس دیگه دارم میخوام با اون استایل ها، پست ها نمایش داده بشه!
    چطوری با فایل جیسون این کارو میتونم بکنم؟
    ممنون میشم کمکم کنین...
  19. سه شنبه، ۱۹ اردیبهشت ۱۳۹۶ مجید
    سلام ممنون از مطالب زیباتون
    یه سوال هم داشتم اگه سمت سرور با وردپرس کار کنی_ سرویس بدی مثلا جیسون به اندروید بفرستی_ لاگین و ….
    یا همین مطلبی که گذاشتین لازمه که کد بنویسم و با php کار کنیم
    چه چیزهایی لازمه که بدونیم
    میدونم اینجا بخش سوال نیست اگه امکان باشه راهنمایی کنین و جواب رو به ایمیلم بفرستید
    پیشاپیش ممنون
  20. پنج شنبه، ۱۸ خرداد ۱۳۹۶ محمد
    سلام
    من به تازگی یه برنامه برای اندروید ساختم. ولی مشکلی که دارم برای فرم ورود وردپرس هست که رمز ها رو کد می کنه در تیبل. از طرفی این افزونه وردپرس دسترسی ورود و خروج کاربر نداره (ظاهرا)
    چجوری برای فرم ورود رمز عبور رو مطابقت بدم؟ آیا روش یا آموزشی می شناسید خیلی هم گشتم
    لطفا راهنماییم کنید ...

    خیلی خیلی خیلی ممنونم
    موفق باشید