精华内容
下载资源
问答
  • 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;
          }
    }

    更多相关内容
  • 正常返回的数据是流 可以读成图片 但是异常的时候返回的是对象(字段) 这种时候需要判断情况,就是说分别获取流文件的对象信息,而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

    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 模块

    展开全文
  • 目录前言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));
        }
    
    展开全文
  • 1.一般是由于访问路径中出现空格 2.访问路径不全(要加上项目的名称) 3.头部信息不对 4.请求参数放的地方不对,一般后端get请求放在头部信息,但post请求放在body里面 ...
  • encodingStrings = (Collection)response.headers().get("content-encoding"); if (null != encodingStrings && encodingStrings.contains("gzip")) { // 使用IOUtils,将binary data数据
  • 主要的错误信息 往下看错误日志 原因: es所在目录磁盘容量超过90%后, es切换到只有读的权限 ...解决方法: 清理磁盘垃圾日志文件释放空间后有两种方式能解决问题 ...可以通过以下命令将所有的index配置改为false,...
  • 和 webservice 供应商联调 saop 接口时遇到一个问题:服务商所有业务逻辑错误 (包括用户名密码、逻辑校验、请求数据为空等等) 都返回 HTTP 状态码 500 而不是状态码 200,同时错误码及详情在返回 body出。...
  • response.body().string()和response.body().toString(),如果想看到服务器返回的字符串,请使用 response.body().string() 若是使用response.body().toString()则出现: org.json.JSONException: Value okhttp3....
  • 本文就来揭秘这一需求在 WebFlux 中如何实现,我们 request/response body 均增加一个表示时间戳的字段 start/end 来模拟请求数据解密和响应数据加密,思路如下。 首先我们需要知道,WebFlux 的过滤器/拦截器是...
  • String 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-...
  • 文章目录背景及问题string()解决方法 背景及问题 在使用Okhttp时,经常会用到自定义的拦截器,对请求体Request或返回体Response做额外的处理。 在拦截器中,通常使用...Response response = chain.proceed(request)...
  • 1、response.body().byteStream()获取返回的输入流对象 2、response.body().string()获取返回的String对象 3、response.body().contentLength()获取待下载文件的总长度 4、response.body().close()关闭,似乎是防止...
  • 发送Get请求,但是请求参数要放在请求body内,所以经过多方查证后整理出来以下代码。 2.POM依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>...
  • [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(),否则第二次调用该方法的时候流是关闭的,不能进行使用了; /** * post请求,返回InputStream * * @param url...
  • java selenium获取Network response的内容

    千次阅读 热门讨论 2019-11-28 18:47:40
    public static final String NETWORK_RESPONSE_RECEIVED = "Network.responseReceived"; /** * post 请求超时时间 */ private static final int COMMAND_TIMEOUT = 5000; /** * 必须固定端口,因为...
  • import 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:07
    response对象--设置响应信息 【1】设置响应行 格式:HTTP/1.1 200 ok 设置状态码:setStatus(int 状态码) 【2】设置响应头 setHeader(String name ,String value) 【3】设置响应体 注意字符集的编码格式 ...
  • 发出request之后会得到 responseResponseEntity来接收返回内容 在发送请求的时候,可以使用 HttpClient RestTemplate OkHttp 一个文章看下三者的区别和使用方法。 这里用的okhttpRestTemplate 是自己写的一个util...
  • java 发起post请求,自定义header和body

    千次阅读 2020-12-31 13:37:06
    //获取responsebody部分 result = EntityUtils.toString(entity); //读取reponse的body部分并转化成字符串 } return result; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch ...
  • java.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()...
  • 解决办法:删除请求头中设置了这句话,addHeader("Accept-Encoding","gzip, deflate") OkHttp会认为你要按照自己处理解压缩步骤. 直接删除这个头信息后, OkHttp 会自动处理加头信息和解压缩的步骤,这样拿到的数据就...
  •  在控制台Network查看,该请求是有数据返回的,但是Responsebody或者data为空,状态码status为0 原因是jsonp在发送请求的时候在URL后面自动添加了 一个callback参数,而而我们没有把这个参数返回导致...
  • 一、请求方式:post,请求参数在body中,代码如下 public static JSONObject SmsPost(String url, Map<String, Object> map) { try { //创建一个获取连接客户端的工具 CloseableHttpClient httpClient =...
  • } 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:38
    String responseEntityStr = EntityUtils.toString(response.getEntity()); System.out.println("--上传返回信息--"+responseEntityStr); }else{ throw new AppBusinessException(UserErrorCode.UPLOAD_ERROR); } ...
  • * post请求 ,请求数据放到body里 * @param url 请求地址 * @param bodyData 参数 * @author wangyj * @date 2019年4月20日 */ public static String doPostBodyData(String url, Strin...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 198,969
精华内容 79,587
关键字:

java 给response 的body设值

java 订阅
友情链接: SHA.rar