آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

مشکل در استخراج جیسون از سرور

122982  4 سال پیش  4 سال پیش
0 0

سلام دوستان

من با فایل php یک مقداری رو از داخل سرور بیرون میکشم و بعد echo میکنم . در مرورگر و در حالت تست هم هیچ مشکلی نیست ولی وقتی از اندروید این کار رو میکنم به جای اطلاعات جیسون یک متن html رو برمیگردونه و چون جیسون نیست نمیتونه بخونه .

چند روزه هر کاری کردم درست نشد که نشد .ممنون میشم کمک کنید.

تقریبا این متن . به جای ستاره ها هم آدرس لینک هست :

<html><body><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("7f9ac0a7e21e0e4524c26ea38ceaf8e1");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="http://***********************************";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>

0 0
سلام.. حتما اشتباه پرینت میکنی! یا خروجی جیسون رو چک کن در آدرس بار! (4 سال پیش)
0 0
ممنون . نه ، در آدرس بار و مرورگر کاملا درست اجرا میشه و خروجی میگیره و پرینت میشه ولی داخل برنامه این مشکل بوجود میاد .اونجوری که مطالعه کردم به نظر میاد مشکل از هاست باشه چون من از هاست رایگان واسه تست استفاده میکردم به همین دلیل شاید از هاست باشه امکانش هست بنظرتون ؟ یه جایی خوندم که گفته بود یک اسکریپتی واسه مقابله با ویروس روی هاست نصبه که اون مشکل رو ایجاد میکنه ولی نفهمیدم چیه و چطور باید حذفش کرد ... (4 سال پیش)
0 0
کلاس وب سرویس رو چک کن شاید اشتباه وارد کردی! و اینکه هاست تستی رو امتحان کن با ومپ (4 سال پیش)
0 0
سلام مجدد . من هر کاری کردم درست نشد متاسفانه . البته مشکل از کدهام نیست این رو مطمئن هستم . (4 سال پیش)
0 0
سلام .. شما از چه مرورگری استفاده می کنید؟ مرورگری که استفاده میکنید جاوا اسکریپت در آن فعال نیست! (4 سال پیش)
0 0
اگه منظورتون مرورگر کامپوتر هست ؟ موزیلا فایرفاکس آخرین نسخه . ولی من داخل مرورگر مشکلی ندارم . و میگم خروجی کامل و درست نشون داده میشه پس مطمئنم که کد php من درست کار میکنه . اطلاعات رو از دیتابیس میگیره و به شکل جیسون نشون میده . ولی مشکل اصلی داخل برنامه اندرویدی ام هست . اونجا این اخطار رو میاره داخل logcat . مرورگر گوشی هم فک نکنم موثر باشه ؟ ضمنا اصلا من داخل کد هام از جاوا اسکریپت استفاده نکردم . حالا به نظرتون ایا راه حلی میشه براش یافت ؟ (4 سال پیش)
0 0
والا چیزی که میدونستم از روی خروجی که گرفتی رو گفتم.. کد اندروید رو نگاه بنداز.. مخصوصا ارتباط با سرور یعنی کلاس وب سرویس. (4 سال پیش)
 برای این سوال 2 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
Reyhane  4 سال پیش
+1 0

من دوهفته پیش با این مشکل روبرو شدم. درنهایت فهمیدم که علت اینه که برنامه سمت سرور روی هاست رایگان اجرا میشه، و هاست های رایگان، آنتی بوت امنیتی بنام testcookie-nginx-module رو روی خودشون اجرا میکنند. اتفاقی که میفته اینه:

  1. زمانی که درخواست Http شما ارسال میشه، این ماژول بجای خروجی جیسون مورد انتظار یک کد جاوا اسکریپت (همون اسکریپتی که شما گذاشتید) رو به کلاینت (معمولا مرورگر) برای اجرا برمیگردونه تا کلاینت با اجرای این اسکریپت یک کوکی (حاوی کلید AES) برای اعتبارسنجی تولید کنه.
  2. وقتی این کوکی تولید شد اسکریپت این کوکی رو به داکیومنت (همون درخواست شما) اضافه میکنه و درخواست رو ریدارکت میکنه به url ای که واقعا مدنظر ماست (یعنی همون اسکریپت phpتون که قراره خروجی جیسون بده).

حالا اینکه چرا این مشکل تو اندروید به وجود میاد، ولی تو مرورگر نه، دلیلش اینه که مرورگر، مشکلی با اجرای جاوا اسکریپت نداره، اما تو اندروید کدهای جاوا اسکریپت نمیتونه اجرا بشه و هم اینکه شما انتظار دریافت جیسون دارید و نه یک کد جاوا اسکریپت!

البته این مشکل فقط تو درخواست های post اتفاق میفته، چون تو این درخواست هاست که شما دارید مقادیری رو به سرور میفرستید و امنیت اون میره زیر سوال. یکی از راه حل هایی که پیدا کردم بطور خلاصه این بود که درخواست رو یک بار روی مرورگر اجرا کنید (برای دیدن کوکی روی مرورگرتون F12 رو بزنید) تا این کوکی تولید شه و بعد مقدار اون کوکی رو (که اسمش test__) هست مستقیما به درخواست HTTP اندروید اضافه کنید. کدی که باید اضافه کنید به این صورت هست:

try 
{
 if(post == "POST")
 {
     HttpClient httpClient = new DefaultHttpClient();
     HttpPost httpPost = new HttpPost(loginUrl);
     httpPost.setEntity(new UrlEncodedFormEntity(para));
     httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 ");
     httpPost.addHeader("Cookie", "__test=THE_CONTENT_OF_YOUR_COOKIE_HERE; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/");
     HttpResponse httpResponse = httpClient.execute(httpPost);
     HttpEntity httpEntity = httpResponse.getEntity();
     is = httpEntity.getContent();
}
else if(post == "GET")
{
    HttpClient httpClient = new DefaultHttpClient();
    String paramString = URLEncodedUtils.format(para, "utf-8");
    loginUrl += "?" + paramString;
    HttpGet httpGet = new HttpGet(loginUrl);
    httpGet.addHeader("Cookie", "__test=THE_CONTENT_OF_YOUR_COOKIE_HERE; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/");
    HttpResponse httpResponse = httpClient.execute(httpGet);
    HttpEntity httpEntity = httpResponse.getEntity();
    is = httpEntity.getContent();
}
}

راستش از اونجایی که خودم از رتروفیت استفاده میکردم، این راه حل رو تست نکردم، چون در okhttp که رتروفیت از اون استفاده میکنه کوکی ها بطور پیش فرض disable هست و برای ذخیره کوکی ها باید خودتون کد بنویسید که البته این کار هم میتونه با کد زیر انجام بشه:

OkHttpClient client = new OkHttpClient();
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
client.setCookieHandler(cookieManager);

و بعد اون کوکی بالا رو ست کنید و....

راه حل دیگه ای که گفته شده بود و من امتحان نکردم البته، این بود که تو اسکریپت php تون دقیقا بعد از اینکه دستور json_encode رو استفاده میکنید با نوشتن دستور ;()exit میتونید از ضمیمه شدن اسکریپت به درخواستتون جلوگیری کنید. در واقع به شکل زیر:

...
print(json_encode($response)); exit(); ?>

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

+1 0
ممنون دوست عزیز. عالی بود. (4 سال پیش)
0 0
خواهش میکنم (4 سال پیش)
پاسخ به سوال 
122982  4 سال پیش
+1 0

 پاسخ صحیح

فقط یک مورد رو هم اضافه کنم اونم اینکه ضمن تایید تمام مطالب بالا :

در صورتی که دوستان از URLConnection برای اتصال به سرور استفاده می کنند نه از okhttpClinet  و ... به روش زیر می تونند اقدام کنند: برای من کامل جواب داد . فقط اینم بگم که بعد از باز کزدن فایل php مورد نظر داخل مرورگر و زدن دکمه ی f12 در لیست باز شده ی پایین داخل تب strong دنبال cookie می گردیم . و سپس به ترتیب نام ها و ولیو ها رو به شکل زیر وارد می کنیم . و تمام...

URLConnection urlConn = null;

URL url = new URL(str);
urlConn = url.openConnection();

String myCookie = "name1 =value1 ; name2 = value2 ; . . . name n = value n";

urlConn.setRequestProperty("Cookie",myCookie)
urlConn.connect();

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