Как подключиться к веб-сервису RESTlet, встроенному в Eclipse, из приложения Android, встроенного в Android Studio? - PullRequest
0 голосов
/ 21 декабря 2018

Итак, для школы мне нужно создать приложение для Android с помощью Android Studio, которое взаимодействует с веб-сервисом RESTful.Мне нужно создать программу в Eclipse, используя Java, чтобы настроить веб-сервис RESTlet на моем локальном хосте.А затем с помощью Android Studio создайте приложение для взаимодействия с этим веб-сервисом.В моем веб-сервисе Eclipse я извлекаю данные из KNMI (института погоды).Я должен отобразить эти данные в своем приложении для Android.

Я совершенно застрял.Я несколько раз пытался обратиться за помощью к своему учителю (это только общение в интранете, на получение ответа уходит не менее недели), но безуспешно.Так как большую часть своей помощи я получаю от StackOverflow, а также смотрю на проблемы других людей и учусь у них, я впервые подумал, что попрошу вас, ребята, напрямую, так как не смог найти решение моей конкретной проблемы здесь.Я пробовал много разных кодов и занимался этим несколько недель.

Я использовал следующее для настройки веб-службы:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import org.restlet.Server;
import org.restlet.data.Protocol;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
import org.restlet.resource.ServerResource;

public class FirstServerResource extends ServerResource {

    private final static String POST_PARAMS = "vars=TN:TX&stns=260";

    public static void main(String[] args) throws Exception {
        // Create the HTTP server and listen on port 8182  
        new Server(Protocol.HTTP, 8182, FirstServerResource.class).start();
    }

    @Get
    public String toString() {
        StringBuilder sb = new StringBuilder();
        HttpURLConnection urlConn = null;
        InputStreamReader in = null;
        try {
            URL url = new URL("http://projects.knmi.nl/klimatologie/daggegevens/getdata_dag.cgi");

            urlConn = (HttpURLConnection) url.openConnection();
            urlConn.setRequestMethod("POST");

            urlConn.setDoOutput(true);
            OutputStream os = urlConn.getOutputStream();
            os.write(POST_PARAMS.getBytes());
            os.flush();
            os.close();

            if (urlConn != null)
                urlConn.setReadTimeout(60 * 1000);
            if (urlConn != null && urlConn.getInputStream() != null) {
                in = new InputStreamReader(urlConn.getInputStream(),
                        Charset.defaultCharset());
                BufferedReader bufferedReader = new BufferedReader(in);
                if (bufferedReader != null) {
                    int cp;
                    while ((cp = bufferedReader.read()) != -1) {
                        sb.append((char) cp);
                    }
                    bufferedReader.close();
                }
            }
            in.close();
        } catch (Exception e) {
            throw new RuntimeException("Exception while calling URL: " + "http://projects.knmi.nl/klimatologie/daggegevens/getdata_dag.cgi", e);
        }

        return sb.toString();
    }

    @Post
    public String PostData() {

        return "test";
    }
}  

Этот код работает для меня и возвращает следующее вмой локальный хост: 8182 =

# BRON: KONINKLIJK NEDERLANDS METEOROLOGISCH INSTITUUT (KNMI)
# Opmerking: door stationsverplaatsingen en veranderingen in waarneemmethodieken zijn deze tijdreeksen van dagwaarden mogelijk inhomogeen! Dat betekent dat deze reeks van gemeten waarden niet geschikt is voor trendanalyse. Voor studies naar klimaatverandering verwijzen we naar de gehomogeniseerde reeks maandtemperaturen van De Bilt <http://www.knmi.nl/kennis-en-datacentrum/achtergrond/gehomogeniseerde-reeks-maandtemperaturen-de-bilt> of de Centraal Nederland Temperatuur <http://www.knmi.nl/kennis-en-datacentrum/achtergrond/centraal-nederland-temperatuur-cnt>.
# 
# 
# STN      LON(east)   LAT(north)     ALT(m)  NAME
# 260:         5.180       52.100       1.90  DE BILT
# 
# YYYYMMDD = Date (YYYY=year MM=month DD=day); 
# TN       = Minimum temperature (in 0.1 degrees Celsius); 
# TX       = Maximum temperature (in 0.1 degrees Celsius); 
# 
# STN,YYYYMMDD,   TN,   TX
# 
  260,20181101,   85,  132
  260,20181102,   23,  118
  260,20181103,   -1,  101
  260,20181104,    6,  119
  260,20181105,   51,  112
  260,20181106,   68,  190
  260,20181107,   87,  139
  260,20181108,   40,  137
  260,20181109,   58,  112
  260,20181110,   93,  134
  260,20181111,   82,  134
  260,20181112,   85,  117
  260,20181113,   81,  132
  260,20181114,   38,  132
  260,20181115,   31,  128
  260,20181116,    6,   77
  260,20181117,   10,   91
  260,20181118,  -14,   78
  260,20181119,   28,   69
  260,20181120,   26,   44
  260,20181121,   18,   53
  260,20181122,   17,   43
  260,20181123,   -8,   69
  260,20181124,    6,   35
  260,20181125,   19,   47
  260,20181126,   35,   60
  260,20181127,   14,   52
  260,20181128,   28,   95
  260,20181129,   95,  112
  260,20181130,   63,  116
  260,20181201,   57,   96
  260,20181202,   96,  132
  260,20181203,   74,  133
  260,20181204,    2,   96
  260,20181205,   17,   84
  260,20181206,   84,  123
  260,20181207,   71,  118
  260,20181208,   67,  112
  260,20181209,   55,  100
  260,20181210,   36,   77
  260,20181211,   -9,   77
  260,20181212,  -29,   43
  260,20181213,   -8,   25
  260,20181214,   -8,   33
  260,20181215,  -11,    8
  260,20181216,  -10,   33
  260,20181217,   24,   84
  260,20181218,   44,   79
  260,20181219,   55,   98
  260,20181220,   54,   87

Теперь я должен извлечь эти строковые данные из локального хоста.

В моей учебной книге (примечание: моя учебная книга сильно устарела) сказано, что для получения информации из веб-службы мне нужно сделать следующее:

  • Добавить следующее для построения.gradle:

    dependencies {
        ...
        compile group: 'org.restlet.android', name: 'org.restlet', version: '2.3.6'
    }
    
    repositories {
        maven {
            mavenCentral ()
            url 'http://maven.restlet.com/'
        }
    }
    

    Конфигурация 'compile' теперь устарела, поэтому я заменил ее на 'реализация'.

  • Используйте код:

    package com.example.restful;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import org.json.JSONObject;
    import org.json.JSONTokener;
    import org.restlet.representation.Representation;
    import org.restlet.resource.ClientResource;
    
    public class MainActivity extends AppCompatActivity {
    
        public static final String URL = "http://ipadress:8182/";
        public static final String TAG = "RESTlet App";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ClientResource cr = new ClientResource(URL);
    
            try {
                Representation r = cr.get();
                String json = r.getText();
    
                Log.i(TAG, "Received get reply: " + r.toString());
    
                JSONObject object = (JSONObject) new JSONTokener(text).nextValue();
    
                if (object != null) {
                    MyClass mine = new MyClass();
                    mine.text = object.getString("text");
                }
            } catch (Exception e) {
                Log.w(TAG, "Unable to get: " + e.getMessage());
            }
        }
    }
    

    и

    package com.example.restful;
    
    public class MyClass {
        public String mine = null;
        public MyClass() {};
        public MyClass(String mine) {
            this.mine = mine;
        }
    
        @Override
        public String toString() {
            return "text = " + mine;
        }
    }
    

Но я не могу заставить это скомпилировать.Он гласит: «не может разрешить символ« текст »».Лично я чувствовал, что этот код был неправильным и мне не нужно использовать JSON, потому что это строковые данные.

Итак, я попытался:

package com.example.restletclient;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import org.restlet.Request;
import org.restlet.data.Form;
import org.restlet.data.Method;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = findViewById(R.id.text);

        ClientResource clientResource = new ClientResource("http://restlet.com");
        Request request = new Request(Method.GET, "http://ipadress:8182");
        clientResource.setRequest(request);

        Form form = new Form();
        form.set("foo" ,"barValue");

        try {
            Representation response = clientResource.post(form.getWebRepresentation(null));
            System.out.println("Got response! response: " + response.getText());
            textView.setText(new ClientResource("ipadress:8182").get().getText());
        } catch (Exception e) {
            System.out.println("No response. Error: " + e.getMessage());
        }

    }
}

И я получаю следующую ошибку:

com.example.restletclient I / System.out: Нет ответа.Ошибка: Внутренняя ошибка соединителя (1002) - Соединитель обнаружил непредвиденное состояние, которое не позволило ему выполнить запрос.

Я зашел на свой ipadress: 8182 на эмуляторе Android и увидел страницу веб-службы.Так что я знаю, что связь хорошая.Но я не понимаю показанную ошибку.

Может кто-нибудь помочь мне с этим?Что я делаю неправильно?Я на правильном пути или есть другой код?

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...