android — Не могу получить JSONArray с IP-сервера, но я могу с обычного сервера?" />

Не могу получить JSONArray с IP-сервера, но я могу с обычного сервера?

Я выполняю миграцию службы с обычного доменного DNS-сервера на сервер только с IP-адресом, и это обеспечивает службу json для моего приложения, проблема в том, что я не могу получить JSONArray со следующим кодом в новом URL:

 protected JSONArray doInBackground(String... arg0) {
                String reponse;

                try{
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost(url);
                    HttpResponse responce = httpclient.execute(httppost);
                    HttpEntity httpEntity = responce.getEntity();
                    reponse = EntityUtils.toString(httpEntity);
                    return new JSONArray(reponse);
                    //With the oldURL I printed the JSON as a string and everithing OK but the new URL returns a null string of JSON
                }catch(Exception e){
                    e.printStackTrace();

                }


                return null;
            }

String newurlexample = "http://111.22.333.44:1234/FOLD/blablabla";

String oldurl = "https:/example.com/FOLD/file.json";

И я получаю следующий журнал:

    07-13 17:47:02.142: W/System.err(18824): org.json.JSONException: Value Method of type java.lang.String cannot be converted to JSONArray
07-13 17:47:02.145: W/System.err(18824):    at org.json.JSON.typeMismatch(JSON.java:111)
07-13 17:47:02.145: W/System.err(18824):    at org.json.JSONArray.<init>(JSONArray.java:96)
07-13 17:47:02.146: W/System.err(18824):    at org.json.JSONArray.<init>(JSONArray.java:108)
07-13 17:47:02.146: W/System.err(18824):    at com.karlol.***.Doctor_Fragment$GetData.doInBackground(Doctor_Fragment.java:171)
07-13 17:47:02.146: W/System.err(18824):    at com.karlol.***.Doctor_Fragment$GetData.doInBackground(Doctor_Fragment.java:1)
07-13 17:47:02.147: W/System.err(18824):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
07-13 17:47:02.147: W/System.err(18824):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
07-13 17:47:02.147: W/System.err(18824):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
07-13 17:47:02.147: W/System.err(18824):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
7 голосов | спросил Karlo A. López 14 J000000Tuesday15 2015, 01:49:39

5 ответов


0

Из заголовка вашего вопроса я могу заметить, что что-то не так между URL-адресом, который вы использовали, и новым ip. Сначала вы должны убедиться, что ваш новый веб-сервис дает тот же результат, что и старый. любым способом вы можете попытаться получить ваши данные, используя это:

try{
       HttpClient httpclient = new DefaultHttpClient();
       HttpPost httppost = new HttpPost(url);
       HttpResponse responce = httpclient.execute(httppost);
       HttpEntity httpEntity = responce.getEntity();
       is = httpEntity.getContent();
       BufferedReader reader = new BufferedReader(new InputStreamReader(
            is));

      StringBuilder sb = new StringBuilder();
      String line = null;
      while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
        reponse = sb.toString();


       return new JSONArray(reponse);
       //With the oldURL I printed the JSON as a string and everithing OK but the new URL returns a null string of JSON

       }catch(Exception e){
          e.printStackTrace();

}

РЕДАКТИРОВАТЬ:

Если вы используете сервер общего хостинга ... нередко наличие нескольких веб-сайтов на одном IP-адресе, различающихся только по названию сайта (так называемый виртуальный хостинг). То, что вы делаете, будет работать только в том случае, если на данном IP есть один сайт.

РЕДАКТИРОВАТЬ 2

Вам необходимо протестировать свой веб-сервис с помощью плагина RESTful (chrome или firefox), то есть Клиент расширенного отдыха

ответил Mohamed Salem Lamiri 16 J000000Thursday15 2015, 02:32:56
0

У нас та же проблема, прежде чем пытаться использовать это. поменяйте тот, что внутри вашей попытки и поймайте с этим. Надеюсь, поможет.

      FileCache filecache;


String result="";
                HttpURLConnection conn = null;
                String finalurl="http://111.22.333.44:1234/FOLD/blablabla";
                filecache = new FileCache(context);
                File f = filecache.getFile(finalurl);
                try {
                    URL url = new URL(finalurl);
                    conn = (HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(30000);
                    conn.setReadTimeout(30000);
                    conn.setInstanceFollowRedirects(true);
                    InputStream is = conn.getInputStream();
                    OutputStream os = new FileOutputStream(f);
                    Utils.CopyStream(is, os);
                    FileReader isr = new FileReader(f);
                    BufferedReader reader = new BufferedReader(isr);
                    StringBuilder sb = new StringBuilder();
                    String line = null;

                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    result = sb.toString();
                    is.close();
                    os.close();
                    conn.disconnect();
                    return new JSONArray(result);
                }catch (Exception ex) {
                    Log.e("Error", ex+"can't access" + finalurl + result);
                }

FileCache.java

import android.content.Context;
import java.io.File;

    /**
     * Created by cristiana214 on 1/26/2015.
     */
    public class FileCache {
        private File cacheDir;
        public FileCache(Context context) {
            // Find the dir to save cached images
            if (android.os.Environment.getExternalStorageState().equals(
                    android.os.Environment.MEDIA_MOUNTED)) {
                cacheDir = new File(context.getExternalCacheDir(),"folder/i");
            } else
                cacheDir = context.getCacheDir();
            if (!cacheDir.exists())
                cacheDir.mkdirs();
        }

        public File getFile(String url) {
            String filename = String.valueOf(url.hashCode());
            File f = new File(cacheDir, filename);
            return f;
        }
        public void clear() {
            File[] files = cacheDir.listFiles();
            if (files == null)
                return;
            for (File f : files)
                f.delete();
        }
    }

Utils.java

import java.io.InputStream;
import java.io.OutputStream;

/**
 * Created by cristiana214 on 1/26/2015.
 */
public class Utils  {
    public static void CopyStream(InputStream is, OutputStream os){
        final int buffer_size=1024*10;
        try{
            byte[] bytes=new byte[buffer_size];
            for(;;){
                int count=is.read(bytes, 0, buffer_size);
                if(count==-1)
                    break;
                os.write(bytes, 0, count);
            }
        }
        catch(Exception ex){}
    }
}
ответил Cristiana Chavez 21 J000000Tuesday15 2015, 07:26:28
0

По вашему коду ошибки

org.json.JSONException: Value Method of type java.lang.String cannot be converted to JSONArray

вы пытаетесь преобразовать строку в JSONArray. также есть указатель на задачу doInBackground, строка 171, поэтому вам обязательно нужно проверить эту строку. Я думаю, что проблема заключается в этих строках:

reponse = EntityUtils.toString(httpEntity);
return new JSONArray(reponse);
ответил Ivan V 22 J000000Wednesday15 2015, 14:10:24
0

Если это кому-то поможет, мне пришлось изменить запрос на GET вместо POST, и этот код работал отлично, хотя я не мог заставить работать запрос POST.

    try {
                    URL obj = new URL("http://anIPaddress/REST/Folder/Consult?Operation=AnOperation");
                    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
//con default method is GET
                    con.setRequestProperty("Accept", "application/json");
                    con.setRequestProperty("Content-Type", "application/json");
                    int responseCode = con.getResponseCode();
                    Log.v("Lolo", "\nSending 'GET' request to URL : " + con.getURL());
                    Log.v("Lolo", "RESPONSE CODE : " + responseCode);
                    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    String inputLine;
                    StringBuffer response = new StringBuffer();
                    while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                    }
                    in.close();

                    return new JSONArray(response.toString());
    }

Большое спасибо за ваши ответы и вашу помощь.

ответил Karlo A. López 22 J000000Wednesday15 2015, 18:13:11
0

Проверьте эту строку в своем сообщении:

  

W /System.err (18824): org.json.JSONException: метод значения типа java.lang.String не может быть преобразован в JSONArray

Вы получаете это исключение, потому что ответ от сервера, который вы получаете, не отформатирован в формате JSON. Поэтому, когда вы пытаетесь преобразовать строку ответа в JSONArray, она вызывает вышеприведенное исключение JSONException.

Теперь решение вашей проблемы: вам нужно убедиться, что ответ отформатирован в правильном формате JSON. И запишите ваш ответ перед синтаксическим анализом в JSON, чтобы проверить правильность ответа или нет.

Надеюсь, это поможет вам :) Благодаря

ответил Biswajit 22 J000000Wednesday15 2015, 14:26:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132