Java 从API获取数据
我想从android应用程序中的PHP服务器获取一些数据。为此,我编写了以下课程:Java 从API获取数据,java,android,Java,Android,我想从android应用程序中的PHP服务器获取一些数据。为此,我编写了以下课程: package com.example.sampledomain.myapplication; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection
package com.example.sampledomain.myapplication;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Api {
private String targetURL;
private String parameters;
public Api(String targetURL, String parameters)
{
this.targetURL = targetURL;
this.parameters = parameters;
}
public String execute()
{
HttpURLConnection connection = null;
try {
URL url = new URL(this.targetURL);
connection = this.createPostConnection(url);
this.sendRequest(connection);
String response = this.getResponse(connection);
return response;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
private HttpURLConnection createPostConnection(URL url)
{
try {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", Integer.toString(this.parameters.getBytes().length));
connection.setRequestProperty("Content-Language", "en-US");
return connection;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private void sendRequest(HttpURLConnection connection)
{
try {
DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.writeBytes(this.parameters);
wr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private String getResponse(HttpURLConnection connection)
{
try {
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
StringBuilder response = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
return response.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
但当我称之为:
String url = "http://sampledomain.pl/test.php";
String params = "";
Api ApiObj = new Api(url, params);
String response = ApiObj.execute();
System.out.print(response);
我不断得到巨大的错误执行堆栈:
12-19 13:52:31.258 2329-2329/com.example.sampledomain.myapplication W/System.err: android.os.NetworkOnMainThreadException
12-19 13:52:31.258 2329-2329/com.example.sampledomain.myapplication W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
12-19 13:52:31.258 2329-2329/com.example.sampledomain.myapplication W/System.err: at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
12-19 13:52:31.258 2329-2329/com.example.sampledomain.myapplication W/System.err: at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
12-19 13:52:31.258 2329-2329/com.example.sampledomain.myapplication W/System.err: at java.net.InetAddress.getAllByName(InetAddress.java:215)
12-19 13:52:31.258 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
12-19 13:52:31.258 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.example.sampledomain.myapplication.Api.sendRequest(Api.java:62)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.example.sampledomain.myapplication.Api.execute(Api.java:28)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.example.sampledomain.myapplication.MainActivity.showText(MainActivity.java:39)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at java.lang.reflect.Method.invoke(Native Method)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at android.view.View.performClick(View.java:5198)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at android.view.View$PerformClick.run(View.java:21147)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at android.os.Looper.loop(Looper.java:148)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at java.lang.reflect.Method.invoke(Native Method)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
12-19 13:52:31.259 2329-2329/com.example.sampledomain.myapplication W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
怎么了?看起来我可以用字符串创建URL对象,但在创建标题时会抛出一个错误-当我发送标题时,它会在某个地方中断。您无法在主线程上执行网络操作。创建一个异步任务,如下所示:
private class APICallTAsk extends AsyncTask<Void, Void, Void> {
@Override
protected Boolean doInBackground(Void... params) {
//make your api call here
}
}
更好地集成改进2库:用于RESTful Android web服务调用的类型安全HTTP客户端。它将允许您以简洁的方式将HTTP API转换为Java接口,从长远来看,这将帮助您更好地管理代码 描述集成和使用说明的网站链接为:
改造调用实例可以同步或异步执行。当同步执行时,您必须在异步任务中调用它,如上所述。异步执行时,不需要异步任务,因为改型2库在内部异步调用它。使用
async
class forAPI
为什么要使用tagPHP
tag?好吧,API是在PHP中…;)@KarolHernik,但您的代码与PHP
无关,请确保清单中有internet权限
APICallTAsk act = new APICallTAsk();
act.execute();