بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

مشکل در دریافت اطلاعات از سرور (جیسون)   حل شده

مدیریت گفتگو
goorgool 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام

دوستان من توی دو تا هاست رایگان دیتابیس و فایل php یکسانی قرار دادم (دیتابیس و فایل php در هر دو هاست کاملاً یکسانند)

دیتابیسم هم دارای مقادیر فارسی هست و utf-8 تعریف شده

حالا وقتی از طریق جیسون اطلاعات رو از سرور اول دریافت میکنم در گوشی به درستی اطلاعات دریافت میشه و هیچ مشکلی نیست، شکل زیر : ( سرور اول gigfa هستش )

ولی وقتی اطلاعات رو از سرور دوم میگیرم یک سری کاراکترهای عجیب و غریب دریافت میکنه و میگه که این اطلاعات جیسون نیست

شکل زیر: ( سرور دوم parspack هستش که سرور ابری هست )

این هم فایل php :

 <?php
$connection=mysqli_connect("localhost", "my-user", "my_pass", "db");
if (mysqli_connect_errno())
{
echo "khata b dalile: " . mysqli_connect_error();
}
mysqli_set_charset($connection, 'utf8');
$result = mysqli_query($connection, "SELECT * FROM brands_info");
$output = array();
while($row = mysqli_fetch_array($result))
{
$record = array();
$record['brand_id'] = $row['brand_id'];
$record['brand_name_fa'] = $row['brand_name_fa'];
$record['brand_name_en'] = $row['brand_name_en'];
$record['brand_country'] = $row['brand_country'];
$record['brand_website'] = $row['brand_website'];
$output[]=$record;
}
echo json_encode($output);
mysqli_close($connection);
?>

نظرات

Criss 11 سال پیش
احتمالا موقع آپلود کردن < فایل php و یا سیو کردن اون فرمت فایل رو بر اساس ASCII میزارید < اگر گزینه ایی در این مورد وجود داره سعی کنید < فایل رو Binary کنید
goorgool 11 سال پیش
خیر فرمت فایل php رو utf-8 قرار دادم

پاسخ‌ها 2

Sajad HP 11 سال پیش

بعد از دستور if  در کد بالا کد خط بعد را پاک کنید و این خط را به جای ان اضافه کنید :

 mysqli_query($connection,"SET NAMES 'utf8'");

و در انتهای کد شما به ورودی های تابع json_encode ورودی زیر را اضافه کنید 

 echo json_encode($output,JSON_UNESCAPED_UNICODE);

تست کنید اطلاع بدید.

نظرات

goorgool 11 سال پیش
سلام دوست عزیز مشکل حل نشد ولی من headerهایی که از سمت سرور میاد رو بررسی کردم و متوجه شدم که سرور اول Content-Encoding را null برمیگردونه ولی سرور دوم که دچار مشکله Content-Encoding را gzip برمیگردونه و فکر میکنم مشکل از همینجا باشه حالا من در فایل php هر چی سعی میکنم مقدار Content-Encoding را توسط header درست برگردونم ، باز هم gzip برمیگردونه، حالا من نمیدونم من کد رو اشتباه مینویسم که تغییری نمیکنه یا چیز دیگه ایه
کاشی زاده 11 سال پیش
کدتون رو سمت php چک کنید ببنید درست نمایش میده محتوی json رو یا نه اگر درست هست پس باید بررسی کنید ببنید در وب سرویس از چه کد های استفاده کردید .
goorgool 11 سال پیش
بله درست هست چون که وقتی از طریق httpUrlConnection بهش وصل میشم اطلاعات درست رو برمیگردونه و مشکلی نیست. ولی وقتی از طریق httpClient بهش وصل میشم این مشکل پیش میاد.
goorgool 11 سال پیش

دوستان من چک کردم دیدم وقتی با httpUrlConnection به این سرور وصل میشم اطلاعات رو به درستی برمیگردونه (همچنین مقدار Content-Encoding که سرور برمیگردونه null هست) ولی وقتی با httpClient وصل میشم همین مشکل بالا پیش میاد و میگه جیسون نیست (و مقدار Content-Encoding ک سرور برمیگردونه gzip هست)

متد inputstreamToString که همان متد استاد هست:

  public static String inputstreamToString(InputStream inputStream)
{
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder builder = new StringBuilder();

try {
String line;
while ((line = reader.readLine()) != null)
{
builder.append(line);
}
return builder.toString();
}
catch (IOException e) {
e.printStackTrace();
}
return null;

}

کد httpClient :

 public static String readUrlJsonClient(String url)
{
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("User-Agent", G.USER_AGENT);

try {
HttpResponse response = client.execute(httpGet);
Header[] header= response.getAllHeaders(); // headerhaie daryafti az server
for (int i = 0; i < header.length; i++)
{
Log.i("mytag", header[i].getName() + ":" + header[i].getValue());
}
code = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
Log.i("mytag", "3 ContentEncoding: " + entity.getContentEncoding()); // daryafte header
Log.i("mytag", "3 ContentType: " + entity.getContentType()); // daryafre header
InputStream stream = entity.getContent();
String result = inputstreamToString(stream);
return result;

}
catch (ClientProtocolException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return "";
}

کد HttpUrlConnection :

 public static String readUrlJsonUrlConnection(String url)
{
try {
URL url1 = new URL(url);
HttpURLConnection connection = (HttpURLConnection) url1.openConnection();
connection.setRequestProperty("User-Agent", G.USER_AGENT);
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();

for (String header: connection.getHeaderFields().keySet()) { // headerhaie daryafti az server
if (header != null) {
for (String value: connection.getHeaderFields().get(header)) {
Log.i("mytag", "2: " + header + ":" + value);
}
}
}
Log.i("mytag", " ContentEncoding:" + connection.getContentEncoding()); // daryafte header
Log.i("mytag", " ContentType:" + connection.getContentType()); // daryafte header
Log.i("mytag", " Date:" + connection.getDate()); // daryafte header
Log.i("mytag", " LastModified():" + connection.getLastModified()); // daryafte header
code = connection.getResponseCode();
InputStream stream = connection.getInputStream();
String result = Tavabe.inputstreamToString(stream);

return result;
}
catch (IOException e) {
e.printStackTrace();
}
return "";
}

نظرات

goorgool 11 سال پیش
دوستان مشکل حل شد.

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