且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Java:retrofit2发送http网络请求

更新时间:2022-08-22 14:36:52

文档:https://square.github.io/retrofit/

Github: https://github.com/square/retrofit

使用Python Flask提供简易的api测试服务

# -*- coding: utf-8 -*-
import random

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route("/get")
def get():
    """通过get方式传递查询参数"""
    name = request.args.get("name")
    age = random.randint(10, 30)

    data = {
        "name": name,
        "age": age,
    }

    return jsonify(data)


@app.route("/post", methods=['POST'])
def post():
    """通过post方式提交json数据"""
    name = request.json.get("name")
    age = random.randint(10, 30)

    data = {
        "name": name,
        "age": age,
    }

    return jsonify(data)


if __name__ == '__main__':
    app.run(debug=True)

依赖

<!--retrofit2引入的依赖-->
<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>retrofit</artifactId>
    <version>2.9.0</version>
</dependency>

<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>converter-gson</artifactId>
    <version>2.0.0-beta3</version>
</dependency>

<!--用于测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
</dependency>

返回的实体对象

package com.demo.http;

public class Person {
    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

请求接口

package com.demo.http;


import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

public interface ApiService {
    @GET("/get")
    Call<Person> getPerson(@Query("name") String name);
    
    @POST("/post")
    Call<Person> postPerson(@Body RequestBody body);
}

测试代码

package com.demo.http;

import com.google.gson.Gson;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import org.junit.BeforeClass;
import org.junit.Test;
import retrofit2.Call;
import retrofit2.GsonConverterFactory;
import retrofit2.Response;
import retrofit2.Retrofit;

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

public class RequestTest {
    // 请求地址
    private static final String BASE_URL = "http://127.0.0.1:5000/";

    // json
    private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");

    private static Retrofit retrofit;

    @BeforeClass
    public static void setUp() {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                // 类型转换 Could not locate ResponseBody converter for class
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    /**
     * GET 测试
     *
     * @throws IOException
     */
    @Test
    public void testGet() throws IOException {
        ApiService request = retrofit.create(ApiService.class);

        Call<Person> call = request.getPerson("Tom");
        // Person person = call.execute();

        // 同步请求
        Response<Person> response = call.execute();
        Person person = response.body();
        System.out.println(person);
        //    Person{name='Tom', age=10}
    }

    /**
     * POST json 测试
     *
     * @throws IOException
     */
    @Test
    public void testPost() throws IOException {
        ApiService request = retrofit.create(ApiService.class);

        // body参数
        Map<String, Object> map = new HashMap<>();
        map.put("name", "Jack");

        Gson gson = new Gson();
        String body = gson.toJson(map);
        System.out.println(body);

        RequestBody requestBody = RequestBody.create(body, JSON);

        Call<Person> call = request.postPerson(requestBody);

        // 同步执行
        Response<Person> response = call.execute();
        Person person = response.body();
        System.out.println(person);
        //  Person{name='Tom', age=24}
    }
}

参考

这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)