Java 从API获取数据

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

我想从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;
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 for
API
为什么要使用tag
PHP
tag?好吧,API是在PHP中…;)@KarolHernik,但您的代码与
PHP
无关,请确保清单中有internet权限
APICallTAsk act = new APICallTAsk();
act.execute();