android okHttp 发送post 、get请求示例

 

引用okHttp框架

在build.gradle添加okHttp的依赖

dependencies {
    ........
    compile 'com.squareup.okhttp3:okhttp:3.9.0'
}

发送get请求

//get请求时键值对放在地址后,地址末尾加?后编写键值对,键值对之间用&连接
Request request = new Request.Builder()
        .url("http://192.168.0.128:8080/VoiceNote/ServletTest?name=zero").build();
OkHttpClient client = new OkHttpClient();
Call call = client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {

    }
    /**
     * 此时还在非UI线程中
     * @param call
     * @param response
     * @throws IOException
     */
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        final String res = response.body().string();
        Log.i("okhttp", res);
        //InputStream inputStream = response.body().byteStream();获取输入流,传输大文件时使用

        //这里还在非UI线程中,如果有涉及刷新UI等操作,要切换到UI线程再进行
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
//                        textview.setText(res);
            }
        });
    }
});

get请求加载图片

Request request = new Request.Builder()
        .url("http://pic17.nipic.com/20111122/6759425_152002413138_2.jpg").build();
OkHttpClient client = new OkHttpClient();
Call call = client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {

    }
    /**
     * 此时还在非UI线程中
     * @param call
     * @param response
     * @throws IOException
     */
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        long length=response.body().contentLength();//获取文件总长度
        Log.i("okhttp", "length:"+length);
        InputStream inputStream = response.body().byteStream();
        final BitmapDrawable d= (BitmapDrawable) BitmapDrawable.createFromStream(inputStream,"hehe.jpg");

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                imageView.setImageBitmap(d.getBitmap());
            }
        });
    }
});

 

发送post请求

String url="http://192.168.0.12:8080/VoiceNote/ServletTest";//发送请求的地址
OkHttpClient client=new OkHttpClient();
FormBody.Builder formBodyBuild=new FormBody.Builder();
formBodyBuild.add("name","zero");//此处添加所需要提交的参数
Request request=new Request.Builder().url(url)
        .post(formBodyBuild.build()).build();
Call call=client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tv.setText("error");
            }
        });
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        String res = response.body().string();
        Log.i("okhttp", "response:" + res);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tv.setText("success");
            }
        });
    }
});

上面红字部分按实际需求修改:

发送字符串时

RequestBody requestBody = RequestBody
        .create(MediaType.parse("text/plan;charset=utf-8)"), "你好啊");
Request request = new Request.Builder().url(url)
        .post(requestBody).build();

发送json数据时

JSONObject object=new JSONObject();
    try {
        object.put("name","zero");
    } catch (JSONException e) {
        e.printStackTrace();
}
RequestBody requestBody=RequestBody
        .create(MediaType.parse("application/json; charset=utf-8"),object.toString());
Request request = new Request.Builder().url(url)
        .post(requestBody).build();

需要传多种数据时 使用

MultipartBody.Builder body=new MultipartBody.Builder();
RequestBody requestBody= body.setType(MediaType.parse("multipart/form-data"))
        .addFormDataPart("name", "zero")
        *******这里插入其他数据例如file、json、键值对等**********        
        .build();
Request request = new Request.Builder().url(url)
        .post(requestBody).build();

 

不知道发送数据的类型可以百度搜索

HTTP Content-type 对照表

 

上面示例所请求的接口只是一个运行在Java Web项目的简单的Servlet,收到什么参数就返回什么参数

import java.io.IOException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;

@WebServlet("/ServletTest")
public class ServletTest extends HttpServlet {
    public ServletTest() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Map<String, String> params = new HashMap<>();
		Map<String, String[]> map =  request.getParameterMap();
		for(String key : map.keySet()) {
//			params.put(key, map.get(key)[0]);
			params.put(key,URLDecoder.decode(map.get(key)[0],"utf-8"));
		}
		System.out.println("接收到的参数:"+params.toString());
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().print(JSON.toJSONString(params));
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

 

OkHttp是一个非常强大的HTTP客户端库,可以用于发送各种类型的HTTP请求。在Android中使用OkHttp发送请求,通常有两种方式: 1. 同步请求 2. 异步请求 对于较大的请求和上传文件等操作,我们可能需要将请求分成多个步骤进行发送,这时候就需要用到OkHttpRequestBody和MultipartBody等类来实现分步发送请求。 下面是一个分步发送POST请求的示例代码: ```java OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body1 = RequestBody.create(mediaType, "Hello"); RequestBody body2 = RequestBody.create(mediaType, "World"); MultipartBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addPart(RequestBody.create(mediaType, "param1"), body1) .addPart(RequestBody.create(mediaType, "param2"), body2) .build(); Request request = new Request.Builder() .url("http://www.example.com/upload") .post(requestBody) .build(); Response response = client.newCall(request).execute(); ``` 在这个示例中,我们将请求分成两步,使用RequestBody创建两个数据块,然后将它们添加到MultipartBody中。最后将MultipartBody作为请求体,发送POST请求。 注意,这个示例中的请求是同步的,如果需要异步请求,可以使用OkHttp的enqueue()方法来实现。 ```java client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理请求失败的情况 } @Override public void onResponse(Call call, Response response) throws IOException { // 处理请求成功的情况 } }); ``` 以上就是使用OkHttp分步发送请求的基本示例,希望能够对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值