使用 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);
}
});
我正在尝试编写一个应用程序来从 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);
}
});