Итак, для школы мне нужно создать приложение для 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 и увидел страницу веб-службы.Так что я знаю, что связь хорошая.Но я не понимаю показанную ошибку.
Может кто-нибудь помочь мне с этим?Что я делаю неправильно?Я на правильном пути или есть другой код?
Заранее спасибо!