Java中使用 okhttp3 发送 Post 和 Get 请求

Java中使用 okhttp3 发送 Post 和 Get 请求



一、引入okhttp3的依赖

 <dependency>
     <groupId>com.squareup.okhttp3</groupId>
     <artifactId>okhttp</artifactId>
     <version>4.9.1</version>
 </dependency>

二、编写代码


	/**
	 * 发送 POST 请求
	 *
	 * @param url 请求的 URL
	 * @param params 请求参数的 Map
	 * @return 响应的 JSON 对象
	 * @throws IOException 如果请求失败
	 */
	public static JSONObject sendPostRequest(String url, Map<String, String> params) throws IOException {
		// 创建 OkHttpClient 实例
		OkHttpClient client = new OkHttpClient.Builder()
				.connectTimeout(30, TimeUnit.SECONDS)  // 设置连接超时时间
				.writeTimeout(30, TimeUnit.SECONDS)    // 设置写超时时间
				.readTimeout(60, TimeUnit.SECONDS)     // 设置读超时时间
				.build();

		RequestBody requestBody;
		if (params != null && !params.isEmpty()) {
			// 构建请求体
			FormBody.Builder formBuilder = new FormBody.Builder();
			// 将 Map 中的键值对添加到请求体中
			for (Map.Entry<String, String> entry : params.entrySet()) {
				formBuilder.add(entry.getKey(), entry.getValue());
			}
			requestBody = formBuilder.build();
		} else {
			// 如果没有参数,构建一个空的请求体
			requestBody = RequestBody.create("", null);
		}

		// 构建请求
		Request request = new Request.Builder()
				.url(url)          // 设置请求 URL
				.post(requestBody) // 设置请求方法为 POST,并传入请求体
				.build();

		// 发送请求并处理响应
		try (Response response = client.newCall(request).execute()) {
			if (response.isSuccessful()) {
				// 如果响应成功,返回响应体字符串并解析为 JSON 对象
				String data = Objects.requireNonNull(response.body()).string();
				return new JSONObject(data);
			} else {
				// 如果响应失败,抛出异常
				throw new IOException("Unexpected code " + response);
			}
		}
	}


	/**
	 * 发送 GET 请求
	 *
	 * @param url 请求的 URL
	 * @param params 请求参数的 Map
	 * @return 响应的 JSON 对象
	 * @throws IOException 如果请求失败
	 */
	public static JSONObject sendGetRequest(String url, Map<String, String> params) throws IOException {
		// 创建 OkHttpClient 实例
		OkHttpClient client = new OkHttpClient.Builder()
				.connectTimeout(30, TimeUnit.SECONDS)  // 设置连接超时时间
				.writeTimeout(30, TimeUnit.SECONDS)    // 设置写超时时间
				.readTimeout(60, TimeUnit.SECONDS)     // 设置读超时时间
				.build();

		// 构建带参数的 URL
		String fullUrl = buildUrlWithParams(url, params);

		// 构建请求
		Request request = new Request.Builder()
				.url(fullUrl)      // 设置请求 URL
				.get()             // 设置请求方法为 GET
				.build();

		// 发送请求并处理响应
		try (Response response = client.newCall(request).execute()) {
			if (response.isSuccessful()) {
				// 如果响应成功,返回响应体字符串并解析为 JSON 对象
				String data = Objects.requireNonNull(response.body()).string();
				return new JSONObject(data);
			} else {
				// 如果响应失败,抛出异常
				throw new IOException("Unexpected code " + response);
			}
		}
	}


	/**
	 * 构建带参数的 URL
	 *
	 * @param url 基础 URL
	 * @param params 参数的 Map
	 * @return 带参数的完整 URL
	 */
	private static String buildUrlWithParams(String url, Map<String, String> params) {
		if (params == null || params.isEmpty()) {
			return url;
		}

		StringBuilder urlBuilder = new StringBuilder(url);
		if (!url.contains("?")) {
			urlBuilder.append("?");
		} else if (!url.endsWith("&") && !url.endsWith("?")) {
			urlBuilder.append("&");
		}

		try {
			for (Map.Entry<String, String> entry : params.entrySet()) {
				urlBuilder.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8.name()));
				urlBuilder.append("=");
				urlBuilder.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.name()));
				urlBuilder.append("&");
			}
		} catch (IOException e) {
			throw new RuntimeException("Error encoding URL parameters", e);
		}

		urlBuilder.setLength(urlBuilder.length() - 1); // 移除最后一个 "&"

		return urlBuilder.toString();
	}

三、调用示例

public static void main(String[] args) {
        // 请求 URL
        String postUrl = "https://example.com/api";
        String getUrl = "https://example.com/api";

        // 请求参数
        Map<String, String> params = Map.of(
                "param1", "value1",
                "param2", "value2"
        );

        // 发送 POST 请求
        try {
            JSONObject postResponse = sendPostRequest(postUrl, params);
            System.out.println("POST Response: " + postResponse.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 发送 GET 请求
        try {
            JSONObject getResponse = sendGetRequest(getUrl, params);
            System.out.println("GET Response: " + getResponse.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 发送不带参数的 POST 请求
        try {
            JSONObject postResponseNoParams = sendPostRequest(postUrl, null);
            System.out.println("POST Response without params: " + postResponseNoParams.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 发送不带参数的 GET 请求
        try {
            JSONObject getResponseNoParams = sendGetRequest(getUrl, null);
            System.out.println("GET Response without params: " + getResponseNoParams.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Android使用OkHttp3进行POST和GET请求发送数据到OneNet物联网云平台可以按照以下步骤进行。 首先,要使用OkHttp3,需要将其添加为项目的依赖项。可以在项目的build.gradle文件添加以下代码来导入OkHttp3库: ```groovy implementation 'com.squareup.okhttp3:okhttp:3.12.1' ``` 接下来,要发送POST请求,可以使用OkHttp3的Request和RequestBody类来构建请求,并使用OkHttpClient来执行请求。 ```java OkHttpClient client = new OkHttpClient(); // 构建请求体 FormBody requestBody = new FormBody.Builder() .add("key1", "value1") .add("key2", "value2") .build(); // 构建请求 Request request = new Request.Builder() .url("https://api.heclouds.com/devices/{deviceId}/datapoints") .addHeader("api-key", "YOUR_API_KEY") .post(requestBody) .build(); // 执行请求 try { Response response = client.newCall(request).execute(); if (response.isSuccessful()) { // 请求成功 String responseData = response.body().string(); // 处理返回的数据 } else { // 请求失败 // 处理错误信息 } } catch (IOException e) { e.printStackTrace(); } ``` 上面的代码示例,我们创建了一个FormBody作为请求体,并填充了要发送的数据。请求的URL需要替换为OneNet物联网云平台实际的URL,同时需要在请求添加API密钥。 对于GET请求,可以使用OkHttp3的Url类来构建请求,同样使用OkHttpClient来执行请求。 ```java OkHttpClient client = new OkHttpClient(); // 构建请求 HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.heclouds.com/devices/{deviceId}/datapoints").newBuilder(); urlBuilder.addQueryParameter("key1", "value1"); urlBuilder.addQueryParameter("key2", "value2"); // 执行请求 try { Request request = new Request.Builder() .url(urlBuilder.build()) .addHeader("api-key", "YOUR_API_KEY") .get() .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { // 请求成功 String responseData = response.body().string(); // 处理返回的数据 } else { // 请求失败 // 处理错误信息 } } catch (IOException e) { e.printStackTrace(); } ``` 同样地,GET请求的URL需要替换为OneNet物联网云平台实际的URL,同时在请求添加API密钥。GET请求需要使用Url类来构建URL,并通过addQueryParameter()方法添加查询参数。 以上就是使用OkHttp3在Android发送POST和GET请求到OneNet物联网云平台的简要步骤。根据实际的接口定义和需求,可能需要调整请求的参数和处理返回数据的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七@归七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值