当前位置: 首页 > 知识库问答 >
问题:

Web服务处理协议

鲜于喜
2023-03-14

我正试图使Web服务与protobuf和json一起工作。问题在于,为了构建我的proto,我需要能够读取inputStream(至少我没有看到其他方法)。

我为protobuf创建了一个转换器:

public class ProtobufMessageConverter extends AbstractHttpMessageConverter<MyProto>{

    @Override
    protected boolean supports(Class<?> aClass) {
        return MyProto.class.equals(aClass);
    }

    @Override
    protected MyProto readInternal(Class<? extends MyProto> aClass, HttpInputMessage httpInputMessage)
            throws IOException, HttpMessageNotReadableException {
        return MyProto.parseFrom(httpInputMessage.getBody());
    }

    @Override
    protected void writeInternal(MyProto proto, HttpOutputMessage httpOutputMessage)
            throws IOException, HttpMessageNotWritableException {
        OutputStream wr = httpOutputMessage.getBody();
        wr.write(proto.toByteArray());
        wr.close();
    }
}

在我的Spring配置中使用:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.test")
public class SpringMvcConfiguration extends WebMvcConfigurationSupport {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) {
        httpMessageConverters.add(new ProtobufMessageConverter(new MediaType("application","octet-stream")));

        addDefaultHttpMessageConverters(httpMessageConverters);
    }
}

我的控制器:

@RequestMapping(value = "/proto", method = {POST}, consumes = {MediaType.APPLICATION_OCTET_STREAM_VALUE})
@ResponseBody
public MyProto openProto(@RequestHeader(value = "Host") String host, @RequestBody
   MyProto strBody, HttpServletRequest httpRequest
) throws InterruptedException {
    return null;
}

问题是,如果我让控制器这样做,我会得到一个错误,因为我的webservice不支持application/octet流。

[main]信息组织。日食码头。服务器ServerConnector-已启动ServerConnector@73b05494{HTTP/1.1}{0.0.0.0:8180}org。springframework。网状物HttpMediaTypeNotSupportedException:组织不支持内容类型“应用程序/八位字节流”。springframework。网状物servlet。mvc。方法注释。AbstractMessageConverterMethodArgumentResolver。readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:155)。。。

如果我把String放在@askestBody中,那么我就进入了我的方法,但它似乎没有使用转换器,并且字符串不能通过parsefrom函数转换到MyProto中。

你知道吗?

共有1个答案

钦景胜
2023-03-14

事实上,我找到了答案。我们需要将原始BUFF视为字节[]。此类型已经有一个HttpMessageConverter。因此,ResponseBody应该是

public byte[] openProto(@RequestHeader(value = "Host") String host, @RequestBody
   byte[] strBody, HttpServletRequest httpRequest
) throws InterruptedException {
    return null;
}
 类似资料:
  • 我目前正在开发Jersey/Hibernate web服务(在Tomcat 9容器中),它应该能够使用和生成JSON(应用程序/JSON)和XML(应用程序/XML)。它支持GET和POST来使用这些类型。DELETE是受支持的,并且可以工作,对于JSON,GET和POST也是如此。但是,当我尝试使用XML内容类型时,我得到了一个500内部服务器错误。 结构如下:(检查下面的代码)歌曲列表(son

  • 我想使用WSO2 IS作为身份提供者,使用SAML 2.0协议实现SSO系统。我已经分析了SSO示例https://docs.wso2.com/display/IS500/Configuring使用SAML 2.0进行单点登录,了解如何实现服务提供商端以生成SAML 2.0身份验证请求。AFAIK实现SAML SP的另一种方法是使用OpenAM、OpenSAML或Shibboleth。但所有这些方

  • 我正在考虑两个小的Spring Boot应用程序: 应用1:运行在http://localhost:8081上的小型web服务,实现一个简单的Spring控制器来响应/camel上的GET请求。访问http://localhost:8081/camel时,该服务仅返回“Hello World”。 应用程序2:一个小型应用程序,它应该执行对应用程序1的GET请求,并打印出对控制台的响应(在本例中为“

  • 《知晓云服务协议》是广州爱范儿科技股份有限公司及其关联公司(以下简称“本公司”、“本网站”或“甲方”)与所有使用知晓云服务的主体(包括但不限于个人、团队、企业等,以下简称“用户”、“您”或“乙方”)对知晓云服务及相关服务的使用所订立的有效合约。《知晓云服务协议》以下或简称“本服务协议”、“服务协议”或“本协议”。用户使用知晓云服务的任何行为即表示接受本协议的全部条款。本协议适用于任何知晓云服务,包

  • 本服务条款(以下简称“本协议”)由北京百度网讯科技有限公司(以下简称“百度”)与您(以下简称“您”或“用户”)订立,用于规范您对百度统计(以下简称“本服务”)的使用。只要您点击 “确定”按钮、完成注册程序或开通、使用本服务,即代表您已理解并同意本协议,特别是以黑体字标示出的关于百度统计及您重大权益的条款均以知晓、理解并接受,同意将其作为确定双方权利义务的依据。如果您不同意本协议,请您立即停止使用本

  • 京东小程序开放平台开发者服务协议 【请认真阅读并理解以下内容,其中以加粗方式显著标识的文字,请着重阅读、慎重考虑】 前言 1、本协议由拟在京东小程序开放平台(以下或简称“京东小程序平台”或“小程序平台”)开发京东小程序(以下或简称“小程序”)的京东小程序开发者(以下简称“开发者”,“乙方”或“您”)与京东小程序开放平台运营方(以下或简称“京东”或“甲方”)共同缔结,具有合同效力。 2、本协议由协议