使用 okHttp 从 URL 获取文本时出现逻辑错误

Logical error in getting a text from URL with okHttp

我正在尝试编写一个应用程序来从 url 中读取文本文件,例如“http://chemvaaj.xzn.ir/test/words.txt” 这似乎是正确的,但它不 return 它应该是什么 :\

这是我的代码:

   public  String DL (){
    OkHttpHandler handler = new OkHttpHandler();
     String text ="";
    try {
        text = handler.execute().get();


        if (text!= null && text.length()> 0){

            System.out.println("not empty");

            return text;
        }

    } catch (Exception e) {
            text= "empty !!";
    }
    return text;
}

这里是 OkHttpHandler class :

public class OkHttpHandler extends AsyncTask<Void, Void, String> {

private final String DB_URL = "http://chemvaaj.xzn.ir/test/words.txt";

OkHttpClient httpClient = new OkHttpClient();

@Override
protected String doInBackground(Void... params) {

    Request.Builder builder = new Request.Builder();
    builder.url(DB_URL);

    Request request = builder.build();

    try {

        Response response = httpClient.newCall(request).execute();
        return response.body().toString();

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

    return null;
}

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    Log.e("ANSWER", "" + s);
}
}

这是我的 logcat 在调用 DL() 函数后:

10-28 00:23:25.167 17288-17288/erfan.bagheri.chemvaaj E/ANSWER﹕ com.squareup.okhttp.internal.http.RealResponseBody@423bc6b8

我不熟悉 OkHttpClient,但从日志中我猜测 body 响应是一个复杂的对象,它没有 toString() 来显示人类可读的响应。您可能必须打印该对象的特定成员才能获得可读的响应。

首先,请检查 AsyncTask 是如何工作的。 Here's the official,简单易懂的使用方法。

然后你会发现方法 execute() returns 是任务本身,而不是生成的 String 对象。

看来 OkHttpClient 返回的 Response 对象可以通过以下方式转换为字符串:

response.body().toString();

再提示一下:请避免在任何方法中返回 null,这被认为是非常糟糕的做法。

您应该将 return response.body().toString(); 替换为 return response.body().string();

请参考我下面的工作示例代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.textView);
        new GetFileRequest().execute();
    }
...
private class GetFileRequest extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            try {
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder()
                        .url("http://chemvaaj.xzn.ir/test/words.txt")
                        .build();
                Response response = client.newCall(request).execute();
                return response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
                return e.toString();
            }
        }
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if (mTextView != null && result != null) {
                mTextView.setText(result);
            }
        }
    }

这是截图

希望对您有所帮助!

OkHttpClient 使用错误(假设你想使用异步)。 OkHttp 是一个功能齐全的 Http 客户端库,并且本身实现了异步请求。 所以没必要AndroidAsyncTask.

正确的方法是:

private final OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url("http://chemvaaj.xzn.ir/test/words.txt")
        .build();

client.newCall(request).enqueue(new Callback() {

      @Override public void onResponse(Response response) throws IOException {
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

        System.out.println(response.body().string());
      }

      @Override public void onFailure(Request request, Throwable throwable) {
        throwable.printStackTrace();
      }
});

试试这个

OkHttpClient 及回调:

OkHttpClient client = new OkHttpClient();

            Request request = new Request.Builder()
                    .url("http://publicobject.com/helloworld.txt")
                    .build();



            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    e.printStackTrace();
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {

                    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

//                    Headers responseHeaders = response.headers();
//                    for (int i = 0; i < responseHeaders.size(); i++) {
//                        System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
//                    }
//                    System.out.println(response.body().string());

                    InputStream in = response.body().byteStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    String result, line = reader.readLine();
                    result = line;
                    while((line = reader.readLine()) != null) {
                        result += line;
                    }
                    System.out.println(result);


                }
            });