首页 > 其他分享 >使用OkHttp发送POST请求的快速入门指南

使用OkHttp发送POST请求的快速入门指南

时间:2022-11-09 11:56:29浏览次数:77  
标签:入门 Request RequestBody json call OkHttp POST 请求

英文原文:https://www.baeldung.com/okhttp-post

1介绍

本文将介绍 OkHttp 客户端的基本用法。

在本篇简短的技术文章中,我们将特别介绍 OkHttp 3.x 版本中发送Post请求的不同方式。

2 基本的 POST 请求d

我们可以使用 FormBody.Builder 构造基本的 RequestBody , 包含两个参数:用户名、密码,发送 POST请求。

@Test
public void whenSendPostRequest_thenCorrect() 
  throws IOException {
    RequestBody formBody = new FormBody.Builder()
      .add("username", "test")
      .add("password", "test")
      .build();
 
    Request request = new Request.Builder()
      .url(BASE_URL + "/users")
      .post(formBody)
      .build();
 
    Call call = client.newCall(request);
    Response response = call.execute();
     
    assertThat(response.code(), equalTo(200));

3 带授权的 POST 请求

如果要对请求进行身份验证,可以使用 Credentials.basic 构建器向请求头中添加凭据。

下面代码给出发送一个 String 字符串作为请求体带授权的例子:

@Test
public void whenSendPostRequestWithAuthorization_thenCorrect() 
  throws IOException {
    String postBody = "test post";
     
    Request request = new Request.Builder()
      .url(URL_SECURED_BY_BASIC_AUTHENTICATION)
      .addHeader("Authorization", Credentials.basic("username", "password"))
      .post(RequestBody.create(
        MediaType.parse("text/x-markdown), postBody))
      .build();
 
    Call call = client.newCall(request);
    Response response = call.execute();
 
    assertThat(response.code(), equalTo(200));
}

4 POST方式发送 JSON 数据

为了在请求体中发送 JSON,我们必须设置它的媒体类型 application/json。 我们可以使用 RequestBody.create构建器来构造:

@Test
public void whenPostJson_thenCorrect() throws IOException {
    String json = "{\"id\":1,\"name\":\"John\"}";
 
    RequestBody body = RequestBody.create(
      MediaType.parse("application/json"), json);
 
    Request request = new Request.Builder()
      .url(BASE_URL + "/users/detail")
      .post(body)
      .build();
  
    Call call = client.newCall(request);
    Response response = call.execute();
 
    assertThat(response.code(), equalTo(200));
}

5 Multipart POST 请求

为了发送一个 Multipart Post 请求, 我们需要将 RequestBody 构建为一个 MultipartBody 来发布文件、用户名和密码的 POST 请求:

@Test
public void whenSendMultipartRequest_thenCorrect() 
  throws IOException {  
    RequestBody requestBody = new MultipartBody.Builder()
      .setType(MultipartBody.FORM)
      .addFormDataPart("username", "test")
      .addFormDataPart("password", "test")
      .addFormDataPart("file", "file.txt",
        RequestBody.create(MediaType.parse("application/octet-stream"), 
          new File("src/test/resources/test.txt")))
      .build();
 
    Request request = new Request.Builder()
      .url(BASE_URL + "/users/multipart")
      .post(requestBody)
      .build();
 
    Call call = client.newCall(request);
    Response response = call.execute();
 
    assertThat(response.code(), equalTo(200));
}

6 发送不带默认字符编码的POST 请求

Okhttp 的默认字符编码是 UTF-8:

@Test
public void whenPostJsonWithoutCharset_thenCharsetIsUtf8() throws IOException {
    final String json = "{\"id\":1,\"name\":\"John\"}";
 
    final RequestBody body = RequestBody.create(
        MediaType.parse("application/json"), json);
 
    String charset = body.contentType().charset().displayName();
 
    assertThat(charset, equalTo("UTF-8"));
}

如果我们想使用其他字符编码,我们可以将其作为 MediaType.parse () 的第二个参数传入:

@Test
public void whenPostJsonWithUtf16Charset_thenCharsetIsUtf16() throws IOException {
    final String json = "{\"id\":1,\"name\":\"John\"}";
 
    final RequestBody body = RequestBody.create(
        MediaType.parse("application/json; charset=utf-16"), json);
 
    String charset = body.contentType().charset().displayName();
 
    assertThat(charset, equalTo("UTF-16"));
}

7 总结

在这篇短文中,我们给出了几个使用 OkHttp 客户端发送 POST 请求的示例。

和往常一样,本文的示例代码已发布在 GitHub上。

作者:明明如月
链接:https://www.imooc.com/article/298886
来源:慕课网
本文首次发布于慕课网 ,转载请注明出处,谢谢合作

标签:入门,Request,RequestBody,json,call,OkHttp,POST,请求
From: https://www.cnblogs.com/hefeng2014/p/16873122.html

相关文章

  • 尚硅谷java入门b站零基础 异常处理 +多线程+部分项目三 2022.3.26
    380如何自定义异常/**如何自定义异常类?*1.继承于现有的异常结构:RuntimeException、Exception*2.提供全局常量:serialVersionUID*3.提供重载的构造器**/publicc......
  • 尚硅谷Java入门哔哩哔哩274p-289p(2022.3.12)
    274super调用属性和方法super关键字的使用1.super理解为:父类的2.super可以用来调用:属性,方法,构造器3.super的使用:调用属性和方法 3.1我们可以在子类的方法或构造器中,通过......
  • 尚硅谷java零基础入门从221p开始的笔记
    221***面向对象上四种权限修饰的理解封装性的体现需要权限修饰符来配合1.java规定的四种权限(从小到大排列)private,缺省,protected,publicpublic类可以在任意地方被访问pr......
  • 尚硅谷java入门bilibili(290p-303p)2022.3.13
    290p多态性练习:几何图形*定义三个类,父类GeometricObject代表几何形状,子类Circle代表圆形,MyRectangle代表矩形publicclassGeometricObject{//几何图形protectedSt......
  • 数据库快速入门教程--视频
    ​​数据库快速入门教程--视频​​下载地址:​​http://v.51work6.com/courseInfoRedirect.do?action=courseInfo&courseId=240579​​本课程是这个课程体系的核心之一,为软件......
  • 洛谷题单【入门1】顺序结构-B2002 Hello,World!
    题目描述编写一个能够输出 Hello,World! 的程序,这个程序常常作为一个初学者接触一门新的编程语言所写的第一个程序,也经常用来测试开发、编译环境是否能够正常工作。......
  • Python入门之第三方模块安装
    Python入门之第三方模块安装平台:Win10x64+Anaconda3-5.3.0(+Python3.7.0) Issue说明:pipinstallline_profiler-2.1.2-cp37-cp37m-win_amd64.whl报错pip版本过低,需要更新......
  • 卡特兰数入门
    卡特兰数可以解决一些计数问题,还是挺常用的。前几项是\(1,1,2,5,14,42,132,\dots\)下文用\(C_n\)表示卡特兰数第\(n\)项,\(n\)从\(0\)开始。公式如果不记得通项......
  • 【视频教程】Dart编程语言基础入门教程 - 09日期时间
    Dart语言是谷歌团队开发的一款支持多平台(web、IOS、安卓)的全栈性语言,他也可以在前端,后端,服务器端上进行各种开发应用,是个不错的语言,目前也有一些公司在开始慢慢尝试着用它来......
  • Apache-CXF简介与第一个JAX-WS的入门程序
    CXF的历史官网:https://cxf.apache.org/Celtix和XFire合并而来。稳定版本3.3.11https://archive.apache.org/dist/cxf/3.3.11/入门项目新建一个普通Java项目即......