(23-12-1401، 09:39 ب.ظ)hosien نوشته: [ -> ]سلام مهندس شهرکی. شما خوب متوجه شدین و میدونید که من چی میخوام ولی نمیدونم چرا این قسمت از صحبت شما رو متوجه نمیشم " اگه ارتباطتون اینترنتی هست، باید دامنه و هاست داشته باشین و اطلاعات اونجا قرار بگیره و به روشی که گفتم ازطریق دامنهی موردنظر بهش وصل بشین"
یبار دیگه سناریو رو خلاصه بگم شاید نکته ای رو من متوجه نشدم و از قلم افتاده.
من یک صفحه وب دارم که میخوام از اطلاعات دیتابیس شبکه لوکال در صفحه وبم نمایش بدم. حال یکسری کدهای من در هاست اشتراکی قرار دارد که باید متدهای api من که در سرور لوکال هستند و وظیفه اجرای query های دیتابیس محلی رو دارند را فراخوانی کنند. کدهای مربوط به کتابخانه curl در هاست اشتراکی قرار دارد که پارامتر url ان را ip خارجی (my ip سرچ در گوگل) قرار دادم و بعد طبق route ای که نوشتم اسم کلاس کنترلر و بعد اسم متد و در صورت نیاز پارامترهای متد قرار میگیرد.
با تشکر
ببینید چیزی که من از توضیحات شما متوجه شدم اینه:
- شما یک دیتابیس لوکال در شبکهی محلی (شرکت یا منزل) دارین
- شما یک هاست اشتراکی دارین که API شما اونجاست
- شما قصد دارین از هاست اشتراکی برای اتصال به دیتابیس لوکال استفاده کنین
به هر روشی بخواین به سیستم لوکال وصل بشین، یک نکته خیلی اهمیت داره اونم اینه که IP سراسری این کامپیوتر در اینترنت عوض نشه. برای این موضوع میتونین با خرید Valid IP یا Static IP، یک IP اختصاصی بخرین و روی کامپیوتر خودتون طبق راهنماییهایی که از مرکز خریداری IP دریافت میکنین، ست کنین. قیمت زیادی نداره و دردسر خاصی هم نداره. اگه این کار رو انجام ندین، هر دفعه کامپیوتر محلی شما به اینترنت وصل میشه ممکنه IPش عوض بشه و شما مجبورین توی کدتون (API که در هاست اشتراکی قرار داره) آدرس IP اتصال به کامپیوتر محلی رو تغییر بدین.
حالا برای دریافت اطلاعات از دیتابیس محلی روی API خودتون در هاست اشتراکی دو روش دارین:
روش اول - اتصال مستقیم به دیتابیس محلی
در این روش باید دیتابیس محلی رو جوری تنظیم کنید که Remote Connection قبول کنه. برای این موضوع باید براساس اینکه دیتابیس شما چیه (MySQL یا SQLServer و...) طبق مستنداتش عمل کنید و اتصال راهدور رو فعال کنید. بعد توی API خودتون که در هاست اشتراکی قرار داره، در قسمت تنظیمات اتصال دیتابیس، آدرس IP و Port و نام کاربری و رمز عبور کامپیوتر محلی رو میدین و API شما به این دیتابیس وصل میشه.
روش دوم - طراحی یک API برای دیتابیس محلی
در این روش بجای اینکه اتصال راهدور برای دیتابیس محلی تنظیم کنید (که نگران لورفتن و اتصال دیگران - بجز خودتون - به این دیتابیس باشین)، یک API روی کامپیوتر محلی پیادهسازی میکنید که API هاست اشتراکی شما اطلاعاتی که میخواد رو با کمک این API (که داخلش از توکن یا سایر روشهای امنیتی برای احراز هویت و مجازکردن دسترسی فقط برای API هاست اشتراکی خودتون استفاده کردین) به اطلاعات دسترسی پیدا کنید. یکیاز بهترین گزینهها برای چنین API واسطی که بخواین به دیتابیس وصل بشین، GraphQL هست که شما توی API هاست اشتراکی خودتون میتونین موقع درخواست اطلاعات، خودتون کوئری بدین و پارامترهای موردنیاز توی جواب رو هم مشخص کنید و لازم نباشه برای هر مدل دیتایی که نیاز دارین، یک Route Endpoint جداگانه توی API طراحی کنید.
باز هم تأکید میکنم نکتهی کلیدی در هر دو روش برای ارتباط پایدار اینه که IP اینترنتی کامپیوتر محلی شما مدام تغییر نکنه وگرنه از همون اول بهتره دنبال تهیهی IP ثابت برای کامپیوتر محلی باشین.
سلام مجدد استاد شهرکی.
بله دقیقا درست گفتین , سناریو به همین شکلی هست که فرمودین.
متشکر.
طبق توضیحات و ۲ روشی که گفتین یکی از روشها رو میرم جلو تا نتیجه بگیرم و به شما اعلام کنم.
مرسی
سلام استاد شهرکی. وقت بخیر.
روش اول رو که فرمودین حقیقتش منصرف شدم بدلیل امنیت دیتابیس و کار اصولی نیست(البته که خودتون ذکر کرده بودین)
برای روش دوم که فرمودین از معماری restful میخوام استفاده کنم بجای GraphQl . منتها این موضوع برای من غیر قابل درک هست که چرا باید در هاست اشتراکی من API داشته باشم؟؟
API من فقط باید در کامپیوتر(سرور) لوکال که دیتابیس من وجود داره باشه و در هاست اشتراکی درخواست (Request) بدم به API که در کامپیوتر لوکال هست.
لزوماً نیاز نیست توی هاست اشتراکی خودتون API داشته باشین. علت اینکه گفتم API داشته باشین برای این بود که فکر کردم شما میخواین بعداً با اپلیکیشن یا یک سایت دیگه (که مثلاً بطور کامل با React یا هر تکنولوژي دیگه سمت فرانت ساخته شده)، به هاست اشتراکی خودتون وصل بشین و با این واسطه، به سرور اصلی متصل بشین. اگه سایتی که میخواین تولید کنین، روی همون هاست اشتراکی وجود داره، نیاز نیست دیگه دوباره API طراحی کنید. البته در این حالت هم پیشنهاد من اینه که FullStack کار نکنید و همونطور که گفتم، API بسازین و در دامنهای مثل api.mysite.com قرار بدین و بعد توی یک سایت مستقل (که میتونه روی همون هاست اشتراکی باشه)، به API خودتون متصل بشین. اینطوری اگه بعداً هم تصمیم گرفتین اپلیکیشن بسازین یا هر کار دیگری، یکقدم جلو هستین و API رو تولید کردین و هم سایت و هم اپلیکیشن هر دو دارن از یک API مشترک استفاده میکنن و اگه قرار باشه تغییری در مکانیزم BackEnd اتفاق بیفته، یکجا انجام میدین و هم اپلیکیشن و هم سایت، از تغییرات جدید استفاده میکنن و یکپارچهسازی در عملکرد سیستم شما اتفاق میفته.
بدون API شما مستقیماً باید توی سایت با API شبکهی داخلی کار کنید و بعداً هم در آینده دست شما رو برای تغییرات تاحدودی میبنده و اگه بخواین تغییری بدین، چند جا باید این کار رو تکرار کنین.
مرسی از توضیحات کاملتون استاد.کلا برنامه به صورتی نیست که بخواد بیش تر از این توسعه داده بشه برای ساخت اپلیکیشن یا یک سایت دیگه , تا همین حد که فقط در سمت کامپیوتر لوکال یک API داشته باشم که اطلاعات دیتابیس من رو برگردنه تو صفحه وب کفایت میکنه. فقط الان مشکل اینجاست که با استفاده از کتابخانه cURL میخوام ریکویست بفرستم به کامپیوتر لوکالم. بنظرتون اگه کتابخونه curl این قابلیت رو نداره از nusoap استفاده کنم؟
کدهایی که مربوط به این قسمت از پروژه هستند:
<?php
function curl_request($url,$return=true){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, $return);
curl_setopt($ch, CURLOPT_INTERFACE, "87.107.209.143"); // search to google myip : 87.107.209.143
$data = curl_exec($ch);
curl_close($ch);
if(!$data){
echo 'Curl error: ' . curl_error($ch);
}
if($return){
return $data;
}
}
<?php
class wstesterController{
public function test1(){
echo 'hi';
$data = curl_request("http://87.107.209.143/webservice/list_of_users/");
echo $data;
}
}
<?php
class webserviceController{
public function list_of_users(){
$db = Db::getInstance();
$result = $db->query("SELECT * FROM `x_users`");
echo json_encode($result);
}
}
با نوشتن این ادرس در نوار ادرس مرورگر :
http://pakhsheahan.com/api/wstester/test1
خطای زیر رو به من میده :
hiCurl error: bind failed with errno 99: Cannot assign requested address
الان این خطا رو میده:
hiCurl error: Failed to connect to 192.168.1.55 port 80 after 909 ms: No route to host
چیزی که واضحه اینه که هاست شما نمیتونه سرور رو ببینه. این آدرسی که دادین، آدرس داخلی شبکه است. باید آدرس IP اون کامپیوتر رو در شبکهی اینترنت بدین.
(26-01-1402، 09:28 ق.ظ)ADMIN نوشته: [ -> ]الان این خطا رو میده:
hiCurl error: Failed to connect to 192.168.1.55 port 80 after 909 ms: No route to host
چیزی که واضحه اینه که هاست شما نمیتونه سرور رو ببینه. این آدرسی که دادین، آدرس داخلی شبکه است. باید آدرس IP اون کامپیوتر رو در شبکهی اینترنت بدین.
مهندس تو این مدت داشتم سعی و خطا میکردم و ip رو عوض میکردم به این خاطر نوع خطا عوض شد. در هر صورت چه با ip اینترنت و چه با ip داخلی شبکه خطا هست و مشکل رفع نشد.
سلام مهندس شهرکی . وقت بخیر. راهکاری برای مسآله ما دارید؟
الان که IP عوض شده، پیغام خطای جدید چیه؟