安卓中使用OkHttp进行网络请求

16

我要做什么:::

我正在尝试学习如何在Android中使用Okhttp进行网络调用。


我已经完成了什么:::

  • 我已经阅读了他们的文档 here
  • 我已经下载并将JAR文件添加到项目中
  • 我正在使用他们的示例代码,来自这里

我的代码:::

MainActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.internal.http.Request;
import com.squareup.okhttp.internal.http.Response;
    public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

             Request request = new Request.Builder()
                .url("https://raw.github.com/square/okhttp/master/README.md")
                .build();

            Response response = client.execute(request);

            Log.d("ANSWER", response.body().string());

        }

    }

我遇到的错误::

在这一行Response response = client.execute(request); 我收到了以下错误:

无法解析变量client

如何解决!


{更新}

public class MainActivity extends Activity {

    OkHttpClient client = new OkHttpClient();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

         Request request = new Request.Builder()
            .url("https://raw.github.com/square/okhttp/master/README.md")
            .build();

        Response response = client.execute(request);

        Log.d("ANSWER", response.body().string());

    }

}

现在我面临的错误是:

在第 Response response = client.execute(request); 行中出现错误:方法 execute(Request) 在类型 OkHttpClient 中未定义


master 分支上的代码与最新版本不对应。 - Jake Wharton
@Jake Wharton....我不太明白...你能指导我一个有效的代码(或者在我的代码上发布更改作为答案)吗?我尝试找例子,但是没有太多可用的资源可以获取,谢谢。 - Devrath
1
他的意思是主分支与1.5.4版本不同。请查看https://github.com/square/okhttp/blob/parent-1.5.4/samples/guide/src/main/java/com/squareup/okhttp/guide/GetExample.java,以获取GET请求的1.5.4示例。 - Ian G. Clifton
只是一条注释:我用简单的 gradle clean --refresh-dependencies 解决了一个类似的问题。 - forresthopkinsa
8个回答

13

OkHttpClient 类型没有定义 execute(Request) 方法,因此您会收到此异常。

您之所以出现这种情况是因为 OkHttpClient 并没有 execute(Request) 方法。相反,您需要使用以下方式从 OkHttpClient 对象获取 Call 对象,然后在该对象上调用 execute() 方法:

  Call call = client.newCall(request);
  Response response = call.execute();

我认为你应该使用

Response response = client.newCall(request).execute();

使用client.newCall(request).execute()代替Response response = client.execute(request);

OkHttp文档

OkHttp博客


4
我建议您使用新版的okHttp 2.0 RC。对于发起POST请求,最好的方法是:
String post(String url, String json) throws IOException {
    RequestBody body = RequestBody.create(JSON, json);
    Request request = new Request.Builder()
        .url(url)
        .post(body)
        .build();
    Response response = client.newCall(request).execute();
    return response.body().string();
}

3
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new AsyncTask<String, Integer, String> (){

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            try {
                client = new OkHttpClient();
                s = post("https://raw.github.com/square/okhttp/master/README.md","");
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            return null;
        }

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

        }
    }.execute();

}

2
@Override
protected String doInBackground(String... ulr) {
    Response response = null;
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
    .url(ulr[0])
    .build();

    try {
        response = client.newCall(request).execute();
         return response.body().string();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;        
}

像这样使用!


1
你错过了这行代码

OkHttpClient client = new OkHttpClient();

意思是:创建一个名为client的OkHttpClient对象。

1
尝试在您的清单文件中添加互联网权限?
<uses-permission android:name="android.permission.INTERNET" />

0

我尝试使用线程和异步任务,但仍然出现与更新持续存在的相同错误... 我还漏掉了其他什么吗? - Devrath

0

你只需要替换: 这个:

Response response = client.execute(request);

作者:

Response response = client.newCall(request).execute();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接