-
2022-04-11 12:39:23
具体报错信息是这样的
执行添加的功能时
Unable to parse response body for Response{requestLine=POST /article/_doc?timeout=1m HTTP/1.1, host=http://106.52.65.18:9200, response=HTTP/1.1 201 Created}; nested exception is java.lang.RuntimeException: Unable to parse response body for Response{requestLine=POST /article/_doc?timeout=1m HTTP/1.1, host=http://106.52.65.18:9200, response=HTTP/1.1 201 Created}
原因是因为es服务器的响应程序解析不了,有可能是spring-boot版本低了,没有做这方面的处理,我的es是8.0版本的,但是数据是能保存进es的,而且es那边也不报错,所以我干脆在添加的方法上做个try{}catch(){},捕捉异常处理,代码如下:
try{ repository.save(e); }catch (Exception exception){ if(!(exception.getMessage()).contains("Created")){ throw exception; } }
更多相关内容 -
java接收文件流+Response.body()调用两次(分别接收文件和对象)
2020-12-04 09:42:53正常返回的数据是流 可以读成图片 但是异常的时候返回的是对象(字段) 这种时候需要判断情况,就是说分别获取流文件的对象信息,而Response.body()这个只能用一次,所以推出这个解决方法 import okhttp3.*; import ...正常返回的数据是流 可以读成图片 但是异常的时候返回的是对象(字段) 这种时候需要判断情况,就是说分别获取流文件的对象信息,而Response.body()这个只能用一次,所以推出这个解决方法
import okhttp3.*; import okio.Buffer; import okio.BufferedSource; import java.io.*; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; public static void main(String[] args) throws Exception { OkHttpClient client = new OkHttpClient().newBuilder() .build(); Request request = new Request.Builder() .url("http://127.0.0.1:8080/test/duizhang") .build(); Response response = client.newCall(request).execute(); ResponseBody body = response.body(); BufferedSource source = body.source(); source.request(Long.MAX_VALUE); Buffer buffer = source.buffer(); String responseBodyString = buffer.clone().readString(Charset.forName("UTF-8")); System.out.println(responseBodyString); InputStream is = body.byteStream(); byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流(后缀名) File sf=new File("F://文件接收"); if(!sf.exists()){ sf.mkdirs(); } // 新的图片文件名 = 编号 +"."图片扩展名 OutputStream os = new FileOutputStream(sf.getPath()+"\\"+sf.getName()); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } // 完毕,关闭所有链接 os.close(); is.close(); System.out.println("程序执行完毕"); }
-
如何修改response的header和body
2021-07-12 22:16:22如何修改response的header和body如何修改response的header和body修改header修改statusCode修改body 如何修改response的header和body shenyu是基于 webflux 的响应式编程项目,由于之前没有接触过,我在开发 ...如何修改response的header和body
如何修改response的header和body
shenyu是基于 webflux 的响应式编程项目,由于之前没有接触过,我在开发 modifyResponse插件的时候,开始有点摸不着头脑,然后大佬推荐了一个链接:
https://htmlpreview.github.io/?https://github.com/get-set/reactor-core/blob/master-zh/src/docs/index.html看完我对响应性编程有了初步的了解。
修改header
1.获取HttpHeaders
ServerHttpResponse response = exchange.getResponse(); HttpHeaders httpHeaders = response.getHeaders();
2.HttpHeaders提供了 add、set、addAll、remove 等函数来操作数据。
if (Objects.nonNull(modifyResponseRuleHandle.getAddHeaders()) && MapUtils.isNotEmpty(modifyResponseRuleHandle.getAddHeaders())) { Map<String, String> addHeaderMap = modifyResponseRuleHandle.getAddHeaders(); addHeaderMap.entrySet().stream().forEach(a -> httpHeaders.add(a.getKey(), a.getValue())); } if (Objects.nonNull(modifyResponseRuleHandle.getSetHeaders()) && MapUtils.isNotEmpty(modifyResponseRuleHandle.getSetHeaders())) { Map<String, String> setHeaderMap = modifyResponseRuleHandle.getSetHeaders(); setHeaderMap.entrySet().stream().forEach(a -> httpHeaders.set(a.getKey(), a.getValue())); } if (Objects.nonNull(modifyResponseRuleHandle.getReplaceHeaderKeys()) && MapUtils.isNotEmpty(modifyResponseRuleHandle.getReplaceHeaderKeys())) { Map<String, String> replaceHeaderMap = modifyResponseRuleHandle.getReplaceHeaderKeys(); replaceHeaderMap.entrySet().stream().forEach(a -> { httpHeaders.addAll(a.getValue(), httpHeaders.get(a.getKey())); httpHeaders.remove(a.getKey()); }); } if (Objects.nonNull(modifyResponseRuleHandle.getRemoveHeaderKeys()) && !CollectionUtils.isEmpty(modifyResponseRuleHandle.getRemoveHeaderKeys())) { Set<String> removeHeaderList = modifyResponseRuleHandle.getRemoveHeaderKeys(); removeHeaderList.stream().forEach(a -> httpHeaders.remove(a)); }
修改statusCode
1.获取ClientResponse
ClientResponse clientResponse = exchange.getAttribute(Constants.CLIENT_RESPONSE_ATTR);
2.设置code
response.setStatusCode(HttpStatus.valueOf(modifyResponseRuleHandle.getStatusCode()));
修改body
这一步是最难的,我也是请教了大佬才解决的问题。
关键点是自定义一个类 ModifyServerHttpResponse 继承 ServerHttpResponseDecorator ,然后重写 writeWith 函数。然后从 DataBuffer 里读出 body 的内容,修改完再写回去。
1.执行入口
doExecute()最后调用 ModifyServerHttpResponse 的初始化return chain.execute(exchange.mutate() .response(new ModifyServerHttpResponse(exchange, modifyResponseRuleHandle)).build());
2.WebClientMessageWriter 在 writeWith 的时候,会走到子类的重写函数里
return response.writeWith(clientResponse.body(BodyExtractors.toDataBuffers())).doOnCancel(() -> clean(exchange));
3.重写 body ,这一块有参考 SpringCloudGateway
public Mono<Void> writeWith(@NonNull final Publisher<? extends DataBuffer> body) { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); //重新生成response ClientResponse clientResponse = prepareClientResponse(body, httpHeaders); //修改body里的内容,并返回Mono字节流 Mono<byte[]> modifiedBody = clientResponse.bodyToMono(byte[].class) .flatMap(originalBody -> Mono.just(updateResponse(originalBody))); //生成BodyInserter BodyInserter<Mono<byte[]>, ReactiveHttpOutputMessage> bodyInserter = BodyInserters.fromPublisher(modifiedBody, byte[].class); //保存body的信息 CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, exchange.getResponse().getHeaders()); //把body写回resposne return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> { Mono<DataBuffer> messageBody = DataBufferUtils.join(outputMessage.getBody()); HttpHeaders headers = getDelegate().getHeaders(); if (!headers.containsKey(HttpHeaders.TRANSFER_ENCODING) || headers.containsKey(HttpHeaders.CONTENT_LENGTH)) { //重写body的长度 messageBody = messageBody.doOnNext(data -> headers.setContentLength(data.readableByteCount())); } return getDelegate().writeWith(messageBody); })); }
因为body的内容可能是多层级的,例如
{ "code":0, "msg":"sucess", "data":{ "nameInfo":{ "name":"test" }, "body":{ "age":"18" } } }
所以修改 body 内容,用的是 JsonPath,需要在插件的 pom 文件里加上下面的依赖
<dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.4.0</version> </dependency>
具体代码,可以参考 shenyu 的代码仓库 https://github.com/apache/incubator-shenyu
里面的 shenyu-plugin-modify-reponse 模块 -
java使用spring ResponseEntity设置响应头完成
2020-05-28 22:37:43目录前言ResponseEntity代码 前言 在开发中我们肯定有很多地方需要文件处理 今天就记录一点关于响应头的东西,其实对我们来说处理一个文件的下载,需要设置响应头,告诉浏览器该怎么处理。比如excel一般设置响应头是...前言
在开发中我们肯定有很多地方需要文件处理 今天就记录一点关于响应头的东西,其实对我们来说处理一个文件的下载,需要设置响应头,告诉浏览器该怎么处理。比如excel一般设置响应头是直接这样写这个
response.setContentType("application/x-download;charset=utf-8"); response.addHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
这是没问题的,但是我们用的spring框架有一个处理响应头的方式
ResponseEntity
ResponseEntity代码
ResponseEntity可以看看这位博主的
https://blog.csdn.net/neweastsun/article/details/81142870自己写一个工具类
FileUtil
来处理响应头 代码如下
下面这段代码实际中估计不会这么写,这段代码可以(MediaType.APPLICATION_OCTET_STREAM
是以流的形式下载public static ResponseEntity<InputStreamResource> download(String fileName, InputStream inputStream) { HttpHeaders headers = new HttpHeaders(); try { headers.add("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + URLEncoder.encode(fileName, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return ResponseEntity.ok() .headers(headers) .cacheControl(CacheControl.maxAge(1, TimeUnit.DAYS).cachePublic()) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(new InputStreamResource(inputStream)); }
-
idea工具调试java后端接口时出现Response body is empty
2019-01-16 11:10:441.一般是由于访问路径中出现空格 2.访问路径不全(要加上项目的名称) 3.头部信息不对 4.请求参数放的地方不对,一般后端get请求放在头部信息,但post请求放在body里面 ... -
Java SpringBoot Response中headers含content-encoding=gzip,body数据处理
2020-10-26 20:01:57encodingStrings = (Collection)response.headers().get("content-encoding"); if (null != encodingStrings && encodingStrings.contains("gzip")) { // 使用IOUtils,将binary data数据 -
ElasticSearch 写入数据时报 Unable to parse response body 错误 记录解决方案
2021-03-23 13:49:32主要的错误信息 往下看错误日志 原因: es所在目录磁盘容量超过90%后, es切换到只有读的权限 ...解决方法: 清理磁盘垃圾日志文件释放空间后有两种方式能解决问题 ...可以通过以下命令将所有的index配置改为false,... -
在服务端返回 2XX 以外的 HTTP 响应码时,HttpURLConnection 该怎样拿到 response body?
2018-09-03 17:41:27和 webservice 供应商联调 saop 接口时遇到一个问题:服务商所有业务逻辑错误 (包括用户名密码、逻辑校验、请求数据为空等等) 都返回 HTTP 状态码 500 而不是状态码 200,同时错误码及详情在返回 body 中给出。... -
response.body().string() 和 response.body().toString()
2019-09-03 16:38:22response.body().string()和response.body().toString(),如果想看到服务器返回的字符串,请使用 response.body().string() 若是使用response.body().toString()则出现: org.json.JSONException: Value okhttp3.... -
揭秘 WebFlux 中如何修改 request/response body
2021-05-06 08:16:16本文就来揭秘这一需求在 WebFlux 中如何实现,我们给 request/response body 均增加一个表示时间戳的字段 start/end 来模拟请求数据解密和响应数据加密,思路如下。 首先我们需要知道,WebFlux 的过滤器/拦截器是... -
response.body().string() 的值消失了
2019-05-14 11:10:04String returnMsg=response.body().string(); if (response.isSuccessful()){ logger.info("baoguan seccuss is {}", returnMsg); System.out.println("i am coming"); }else { System.out.println("fail... -
java中如何设置response下载文件
2018-05-04 20:04:39转自 http://yibuyisheng.github.io/blogs/site/blogs/filedownload.html在 WEB 开发中,我们会期望用户...以前接触过一种方式,就是在响应 header 中设置 force-download :12Content-Type: application/force-... -
解决Okhttp的Response#body()#string()后Response返回体为空问题
2019-09-09 23:40:19文章目录背景及问题string()解决方法 背景及问题 在使用Okhttp时,经常会用到自定义的拦截器,对请求体Request或返回体Response做额外的处理。 在拦截器中,通常使用...Response response = chain.proceed(request)... -
第一行代码中出现的 response.body()的四个常用方法
2020-07-06 16:23:291、response.body().byteStream()获取返回的输入流对象 2、response.body().string()获取返回的String对象 3、response.body().contentLength()获取待下载文件的总长度 4、response.body().close()关闭,似乎是防止... -
Java发送Http请求之——发送请求参数在Body中Get请求
2020-09-10 17:01:50发送Get请求,但是请求参数要放在请求body内,所以经过多方查证后整理出来以下代码。 2.POM依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>... -
Elasticsearch Unable to parse response body HTTP/1.1 413 Request Entity Too Large问题解决
2020-08-17 17:50:00[ERROR] o.s.a.i.SimpleAsyncUncaughtExceptionHandler - Unexpected exception occurred invoking async method: public void org.zsdy.ext.admin.controller.EsQueryDataList.synchroniseDataAll(java.util.List,... -
OkHttpUtils 关于response.body().byteStream()的坑
2020-10-30 16:05:34OkHttpUtils类使用遇到的一个坑记录,在使用流文件的时候,不能进行两次的response.body().byteStream(),否则第二次调用该方法的时候流是关闭的,不能进行使用了; /** * post请求,返回InputStream * * @param url... -
java selenium获取Network response的内容
2019-11-28 18:47:40public static final String NETWORK_RESPONSE_RECEIVED = "Network.responseReceived"; /** * post 请求超时时间 */ private static final int COMMAND_TIMEOUT = 5000; /** * 必须固定端口,因为... -
java导出Excel通过response返回Excel.xls文件
2019-08-09 10:44:48import org.apache.poi.hssf.usermodel.HSSFWorkbook;...import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import javax.servlet.http.HttpServletResponse; public String... -
response对象--设置响应信息
2019-05-16 21:51:07response对象--设置响应信息 【1】设置响应行 格式:HTTP/1.1 200 ok 设置状态码:setStatus(int 状态码) 【2】设置响应头 setHeader(String name ,String value) 【3】设置响应体 注意字符集的编码格式 ... -
JAVA使用http包进行url接口调用以及返回值处理 HttpEntity ResponseEntity
2020-12-02 15:05:57发出request之后会得到 response 用ResponseEntity来接收返回内容 在发送请求的时候,可以使用 HttpClient RestTemplate OkHttp 一个文章看下三者的区别和使用方法。 这里用的okhttpRestTemplate 是自己写的一个util... -
java 发起post请求,自定义header和body
2020-12-31 13:37:06//获取response的body部分 result = EntityUtils.toString(entity); //读取reponse的body部分并转化成字符串 } return result; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch ... -
java.io.IOException: Unable to parse response from server
2017-09-29 09:22:53java.io.IOException: Unable to parse response from server -
Java Web打印request body
2019-03-18 09:51:18默认的ServletInputStream不支持reset,所以默认的流只能读取一次,但是如果我们要打印body就需要读取inputStream,这会导致Spring无法读取body体,所以通过HttpServletRequestWrapper包装重新定义getInputStream()... -
okhttp 使用response.body().string()获取到的数据是一堆乱码
2020-07-07 15:53:00解决办法:删除请求头中设置了这句话,addHeader("Accept-Encoding","gzip, deflate") OkHttp会认为你要按照自己处理解压缩步骤. 直接删除这个头信息后, OkHttp 会自动处理加头信息和解压缩的步骤,这样拿到的数据就... -
java后台+vue前端,解决jsonp跨域问题(有数据返回的,但是Response的body或者data为空)
2018-08-28 15:42:32在控制台Network查看,该请求是有数据返回的,但是Response的body或者data为空,状态码status为0 原因是jsonp在发送请求的时候在URL后面自动添加了 一个callback参数,而而我们没有把这个参数返回导致... -
java中使用post请求,参数在body中的代码
2020-11-23 13:57:06一、请求方式:post,请求参数在body中,代码如下 public static JSONObject SmsPost(String url, Map<String, Object> map) { try { //创建一个获取连接客户端的工具 CloseableHttpClient httpClient =... -
RestTemplate通过对象传参,response的body为空讨论
2020-10-30 02:04:04} controller @ResponseBody @RequestMapping(value = "",method = RequestMethod.POST) public Response APIcreate(@RequestBody C c) { String json = JSONUtil.toJSONString(c); ... -
java用HttpPost发送post请求,传body
2020-03-30 18:06:38String responseEntityStr = EntityUtils.toString(response.getEntity()); System.out.println("--上传返回信息--"+responseEntityStr); }else{ throw new AppBusinessException(UserErrorCode.UPLOAD_ERROR); } ... -
JAVA利用HttpClient发送post请求,将请求数据放到body里
2020-01-19 09:25:31* post请求 ,请求数据放到body里 * @param url 请求地址 * @param bodyData 参数 * @author wangyj * @date 2019年4月20日 */ public static String doPostBodyData(String url, Strin...