后端请求接口

OkHttp网络请求实战
本文介绍如何使用OkHttp实现GET和POST请求,并演示文件上传的过程。同时提供了响应数据解析为List和Map的方法。

如果有更好的方法 可以在评论留下链接

1.添加相关依赖

<!-- feign-okhttp -->
<dependency>
	<groupId>io.github.openfeign</groupId>
	<artifactId>feign-okhttp</artifactId>
	<version>11.7</version>
</dependency>

1.get请求

/**
  * OkHttpClient Get请求
  * @param url 请求地址
  * @return
  */
public Result<?> httpClientGet (String url) {
        try {
            Response lsresponse = null;
            OkHttpClient lsclients = new OkHttpClient().newBuilder()
                    .build();
            Request lsrequest = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
            lsresponse = lsclients.newCall(lsrequest).execute();
            if (lsresponse.isSuccessful()) {
                return Result.ok(lsresponse.body().string());
            }else {
                return Result.error("请求数据错误!");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return Result.error("数据接口请求失败");
        }
 }

请求时如果需要加header 可直接在addHeader中添加 

2.Post请求

/**
  * OkHttpClient Post请求
  * @param url 请求地址
  * @param bodys 请求体传参
  * @param token 请求token
  * @return
  */
 public Result<?> httpClientPost (String url , String bodys, String token) {
        try {
            Response lsresponse = null;
            OkHttpClient lsclients = new OkHttpClient().newBuilder()
                    .build();
            MediaType lsmediaTypes = MediaType.parse("application/json");
            RequestBody body = RequestBody.create(lsmediaTypes, bodys);
            Request lsrequest = new Request.Builder()
                    .url(url)
                    .method("POST", body)
                    .addHeader("Authorization",token)
                    .addHeader("Content-Type", "application/json")
                    .build();
            lsresponse = lsclients.newCall(lsrequest).execute();
            if (lsresponse.isSuccessful()) {
                return Result.ok(lsresponse.body().string());
            }else {
                return Result.error("请求数据错误!");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return Result.error("数据接口请求失败");
        }
    }

3.文件上传

感觉这种文件上传性能比较低,请求慢,目前我还没写过其他的文件上传请求 

/**
 *param doPostMulti post请求
 *param filePath 文件地址
 *param dataId 数据id
 */
public String doPostMulti(String filePath,String dataId) {
        Result result = httpClient.getToken(tokenUrl);
        String token = result.getMessage();
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(uploadUrl);
            URL url2 = new URL(filePath);
            URLConnection urlConn = url2.openConnection();
            InputStream input = urlConn.getInputStream();
            // 创建请求内容
            MultipartEntityBuilder builder =                 
            MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
            builder.addBinaryBody("file", input, ContentType.DEFAULT_BINARY, 
            filePath.substring(filePath.indexOf("=")+1));
            builder.addTextBody("dataId", dataId);
            builder.setContentType(ContentType.MULTIPART_FORM_DATA);
            builder.setBoundary("----egevgdsewgeagdvsdfergergsvgds");//随机字符串
            builder.setCharset(UTF_8);
            HttpEntity entity = builder.build();
            httpPost.setEntity(entity);
            httpPost.addHeader("Authorization", token);
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        return resultString;
    }

4.附加处理

可能有更好的处理方式,我暂时使用的是这种

        list格式数据处理

//data为请求的返回值,为字符串类型  lsresponse.body().string()
List<Map> arrayList = new ArrayList();
SONObject object = JSONObject.parseObject(data);
String datalist = object.getString("data");
CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, Map.class);
arrayList = objectMapper.readValue(datalist, listType);

        map格式数据处理

//data为请求的返回值,为字符串类型  lsresponse.body().string()
Map<String, Object> hashMap = new HashMap<>();
JSONObject object = JSONObject.parseObject(data);
String datalist = object.getString("result");
MapType mapType = objectMapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class);
hashMap = objectMapper.readValue(datalist, mapType);
在前端使用 POST 请求调用后端 DELETE 接口时,有特定的方法和需要注意的事项。 ### 方法 若用惯了 SpringMVC,由于其对 PUT、DELETE 方式不支持,可加入 HiddenHttpMethodFilter,在前端将 DELETE 请求改为 type:"POST",并通过 data:{_method:"DELETE"} 来让后端接收 DELETE 操作。例如在前端代码里,可以这样实现: ```javascript $.ajax({ url: yourUrl, type: "POST", data: {_method: "DELETE"}, success: function(response) { // 处理成功响应 }, error: function(error) { // 处理错误响应 } }); ``` ### 注意事项 - **后端支持**:后端需要对这种通过 POST 模拟 DELETE 的方式进行支持。如 SpringMVC 就需要加入 HiddenHttpMethodFilter 来处理 _method 参数,以此识别请求是 DELETE 操作。 - **同源策略问题**:在前后端分离架构中,当前端应用(如 React、Vue)与后端服务部署在不同域名或端口时,浏览器会触发同源策略限制,致使 API 调用失败。此时,后端需要设置 CORS 相关的响应头,像 `Access-Control-Allow-Origin` 等,从而允许前端跨域调用。例如,在 Java 的 Spring 框架里,可以通过配置 CORS 过滤器来解决: ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true); } } ``` - **请求体处理**:如果后端 DELETE 接口需要接收请求体,客户端需要使用 `@RequestBody` 标注,如: ```java @RequestMapping(value="/answer/{answerId}",method=RequestMethod.DELETE) public ResponseResult deleteAnswer(@PathVariable("answerId")int answerId,@RequestBody Issue issue){ // 处理逻辑 } ``` 前端发送请求时要确保请求体格式正确。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值