美文网首页NetAndroid程序员
OkHttp之post请求发送给服务器json

OkHttp之post请求发送给服务器json

作者: 许晓北 | 来源:发表于2016-03-03 18:03 被阅读33656次

在第一篇中简单介绍了OkHttp的get请求发送,今天简单说下post请求发送json到服务器。
Android老版本网络请求:
HttpUrlConnection
Apache Http Client

Android6.0版本网络请求:
HttpUrlConnection
OkHttp

新版本废弃了老的网络请求,那么它的优势是什么呢?
1,支持SPDY,共享同一个Socket来处理同一个服务器的所有请求
2,如果SPDY不可用,则通过连接池来减少请求延时
3,无缝的支持GZIP来减少数据流量
4,缓存响应数据来减少重复的网络请求

public class MainActivity extends AppCompatActivity {

public static final String TAG = "MainActivity";
public static final MediaType JSON=MediaType.parse("application/json; charset=utf-8");
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //开启一个线程,做联网操作
    new Thread() {
        @Override
        public void run() {
            
         postJson();
        }
    }.start();
}

 private void postJson() {
    //申明给服务端传递一个json串
    //创建一个OkHttpClient对象
    OkHttpClient okHttpClient = new OkHttpClient();
    //创建一个RequestBody(参数1:数据类型 参数2传递的json串)
    RequestBody requestBody = RequestBody.create(JSON, json);
    //创建一个请求对象
    Request request = new Request.Builder()
            .url("http://192.168.0.102:8080/TestProject/JsonServlet")
            .post(requestBody)
            .build();
    //发送请求获取响应
    try {
    Response response=okHttpClient.newCall(request).execute();
        //判断请求是否成功
        if(response.isSuccessful()){\
            //打印服务端返回结果
            Log.i(TAG,response.body().string());
            
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

}  

SPDY(读作“SPeeDY”)是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。

ZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。
HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。

第一篇地址 http://www.jianshu.com/p/cd8d03d4286e

相关文章

网友评论

  • 746a9b561a2f:我想问下,OKhttp 发送post异步请求时,是否会丢失数据
  • f76281add009:《OkHttp之post请求发送给服务器json - 简书》写的挺不错的,已经收藏了。

    源码解析:http://sina.lt/fdcQ


    6b9bfcd7acbf:恩恩

    还不错那
  • ed67fd64a020: :joy: 请问下怎么传入多个参数?
    许晓北:你的参数放在json里面不行吗?
  • 755589f53a58:String jsonString = gson.toJson(mMyGridViewPojo);

    //申明给服务端传递一个json串
    //创建一个OkHttpClient对象
    OkHttpClient okHttpClient = new OkHttpClient();
    //创建一个RequestBody(参数1:数据类型 参数2传递的json串)
    RequestBody requestBody = RequestBody.create(String, jsonString);
    //创建一个请求对象
    Request request = new Request.Builder()
    .url("http://192.168.0.102:8080/TestProject/JsonServlet")
    .post(requestBody)
    .build();
    楼主 我的数据类型老是报错
    许晓北:数据类型是JSON啊~
  • d17cf5fce128:博主,你好。请问上传两张图片到服务器要求使用json数据该怎么做 ?
    许晓北:上传图片和下载图片之类的一般用一些图片框架 你可以看下
  • b508ad856469:myHttp = new MyHttp();我是封装在MyHttp里的。MyHttp的代码是:

    public static final MediaType JSON = MediaType
    .parse("application/json; charset=utf-8");
    OkHttpClient client = new OkHttpClient();
    private String result = null;

    // post
    public String postDevice(String json, String method) {
    // 申明给服务器传递一个json串
    // 创建一个RequestBody(参数1:数据类型 参数2传递的是json串)
    RequestBody requestBody = RequestBody.create(JSON, json);
    // 创建一个请求对象
    Request request = new Request.Builder().url(Constants.WEB_URL + method)
    .post(requestBody).build();
    // 发送请求获取响应
    try {
    com.squareup.okhttp.Response response = client.newCall(request)
    .execute();
    if (response.isSuccessful()) {

    return response.body().string();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    许晓北:@luckysunfeng 你可以看下你导入的包是否重复 或者可以尝试换下jar包的版本,这个包是import com.squareup.okhttp.MediaType;内的。另外建议早点换AS吧 看你代码是没什么问题的。估计可能jar包问题~
  • b508ad856469:你调试了吗?
    b508ad856469:@许晓北 我老是提示找不到MediaType,我用的是Okhttp 2.7和Okio 1.6的包,我用的是Eclipse.
    许晓北:@luckysunfeng 调试过了 当时就是成功写了demo才写的~ 当时记得好像是2.几版本 你看下是不是导入包的问题?
  • b508ad856469:public static final MediaType JSON=MediaType.parse("application/json; charset=utf-8"); 我怎么提示这个找不到啊?你用的是哪个版本的okhttp?
    许晓北:@luckysunfeng 刚又测试了一下 2.0版本的也没有问题 这个包是import com.squareup.okhttp.MediaType;
  • f7e338f3ae45:楼主你用okhttp的时候,有没有上传文件的同时上传json呢
    198fa621bf64:@流放23333 private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

    private void post() {
    File file1 = new File(Environment.getExternalStorageDirectory(), "default_default.jpg");
    File file2 = new File(Environment.getExternalStorageDirectory(), "default_default.jpg");
    OkHttpClient client = new OkHttpClient();
    RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
    .addFormDataPart("version", "1")
    .addFormDataPart("mobile", "158")
    .addFormDataPart("validateCode", "433985")
    .addFormDataPart("name", "戴")
    .addFormDataPart("idCardNumber", "330")
    .addFormDataPart("gmtBirthday", "1992-12-28")
    .addFormDataPart("nation", "汉")
    .addFormDataPart("gender", "男")
    .addFormDataPart("registerAddress", "浙江省")
    .addFormDataPart("password", "123456")
    .addFormDataPart("idCardFile", "default_default.jpg", RequestBody.create(MEDIA_TYPE_PNG, file1))
    .addFormDataPart("avatarFile", "default_default.jpg", RequestBody.create(MEDIA_TYPE_PNG, file2))
    .build();
    Request request = new Request.Builder().url("http://122.225.193.238:8081/api/v1/user/register").post(requestBody).build();
    client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
    Log.i("test2", "onFailure: " + e.toString());
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
    Log.i("test2", "onResponse: " + response.body().string());
    }
    });
    f7e338f3ae45:@许晓北 谢谢
    许晓北:@f7e338f3ae45 RequestBody 可以构建复杂的请求体
    RequestBody requestBody = new MultipartBuilder()
    .type(MultipartBuilder.FORM)
    .addPart(
    Headers.of("Content-Disposition", "form-data; name=\"title\""),
    RequestBody.create(null, "Square Logo"))
    .addPart(
    Headers.of("Content-Disposition", "form-data; name=\"image\""),
    RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
    .build();
    具体你可以看下Okhttp Post方式提交分块请求

本文标题:OkHttp之post请求发送给服务器json

本文链接:https://www.haomeiwen.com/subject/qifokttx.html