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

无法从aws lambda(java)读取json正文响应。上面写着ReadableStream

冯通
2023-03-14

我有一个无服务器系统,后端使用AWS lambda(java),前端使用React。我正在发送一个用户输入的名称值,并期待一个hello{name}作为回报。我使用fetch api(post)将用户输入的数据(在本例中为“name”)发送到后端lambda。lambda能够打印和修改它。它将jsonnode响应发送回前端,但在前端,当我console.log(response)时,它不会在正文中打印任何内容。

上面写着身体:{...}在点击三个点时,它表示Object ReadableStream。正文:ReadableStream锁定:false

public class DataProcessor {

    LambdaLogger logger;
    ObjectMapper objectMapper;

    public void handler(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {

        this.logger = context.getLogger();
        this.objectMapper = new ObjectMapper();
        logger.log("Beginning data processing");

        // Get our inputs
        JsonNode body = this.extractBody(inputStream);

        logger.log(body.toString());

        String username = body.get("headers").get("X-FORWARDED-USER").toString().replace("\"", "");
        String method = body.get("httpMethod").toString().replace("\"", "");
        String path = body.get("path").toString().replace("\"", "");
        String data = body.get("body").toString().replace("\"", "");
        Boolean isBase64Encoded = body.get("isBase64Encoded").asBoolean();

        if (isBase64Encoded) {
          data = new String(Base64.getDecoder().decode(data), "utf-8");
        }

        logger.log("username: " + username);
        logger.log("method: " + method);
        logger.log("path: " + path);
        logger.log("data: " + data);
        logger.log("isBase64Encoded: " + isBase64Encoded);

        JsonNode responseJson;

        responseJson =  (JsonNode)constructResponse(data);

        logger.log("Response: " + responseJson.toString());

        // Output the response
        OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
        writer.write(responseJson.toString());
        writer.close();
    }

    // construct response
    private ObjectNode constructResponse(String body) throws IOException {
      ObjectNode response = this.objectMapper.createObjectNode();
      response.put("statusCode", 200);
      response.put("isBase64Encoded", true);
      response.put("body", body);
      response.put("headers", this.objectMapper.readTree("{\"Content-Type\":\"application/json\"}"));
      return response;
    }

    // get body from inputStream
    private JsonNode extractBody(InputStream inputStream) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode input = objectMapper.readValue(inputStream, JsonNode.class);
        return input;
    }
}
class MyForm extends React.Component {
  constructor() {
    super();
    this.state={ name: ''};
    this.handleChange = this.handleChange.bind(this);
    this.handleClick = this.handleClick.bind(this);
  }

  handleChange = event =>{
    this.setState({ [event.target.name]:event.target.value })
  }

  handleClick = event =>{
    this.setState(state => ({
        isFormOn: !state.isFormOn,
        name: state.name
    }));
  }

  handleSubmit = event =>{
    event.preventDefault();
    console.log("Name : " + this.state.name)

    const url ="abc"

    const data = { name:this.state.name}

    console.log("Data is : ", data)

    fetch(url, {
        method: 'POST',
        body: JSON.stringify(data)
     })
     .then(function(response){
        console.log("Response is : ", response);
        let json = JSON.parse(response);
        console.log("This is json parsed string : ", JSON.stringify(json));
     })
     .then(data => console.log("data is : ", data))
     .catch(error => console.error('Error:', error))

  }

  render(){
    return(
        <div>
            {
                <form onSubmit={this.handleSubmit}>
                    Name : <input type="text" name="name" onChange={this.handleChange} />
                    <input type="submit" value="Submit" />
                </form>
            }
        </div>
    )
  }

}

ReactDOM.render(
  <MyForm />,
  document.getElementById('root')
);

共有1个答案

宇文俊风
2023-03-14

您需要使用json()读取和解析响应,它接收响应流并读取到完成:

 fetch(url, {
    method: 'POST',
    body: JSON.stringify(data)
 })
 .then(response => response.json())
 .then(data => console.log("data is : ", data))
 .catch(error => console.error('Error:', error))
 类似资料:
  • 问题内容: 在Java中,当HTTP结果为404范围时,此代码将引发异常: 就我而言,我碰巧知道内容是404,但无论如何我还是想阅读响应的内容。 (在我的实际情况下,响应代码为403,但是响应的主体说明了拒绝的原因,我希望向用户显示该原因。) 如何访问响应正文? 问题答案: 这是错误报告(关闭,无法修复,不是错误)。 他们的建议是这样编码:

  • Axios 0.17.1 响应的console.log为 {data:“{”error“:”name必须输入多个…null [“ispipe”:protected]=>null}}“,状态:203,statustext:”非权威信息“,标题:{…},配置:{…},…}配置:{adapter:f,转换请求:{…},转换响应:{…},超时:0,xsrfcookiename:”xsrf-token“,…

  • 我用邮递员寄出这个请求https://postman-echo.com/get?record=aaaa 测试包含以下代码: 控制台中的输出: 对象对象 我所期待的:回应json {“args”:{“record”:“aaaa”},“headers”:{“x-forwarded-proto”:“https”,“x-forwarded-port”:“443”,“host”:“postman echo.

  • 问题内容: 我在文件中有以下JSON : 如何使用PHP 添加到文件中? 这是我到目前为止的内容: 这给了我一个致命错误:无法在此行上将stdClass类型的对象用作数组: 我正在使用PHP5.2。有什么想法吗?谢谢! 问题答案: 错误消息中的线索是-如果您查看文档以了解它可能需要第二个参数,该参数控制返回数组还是对象-它默认为object。 因此,将您的通话更改为 并且它将返回一个关联数组,您的

  • 我希望有人能帮我解决这个问题。 我想用WebClient创建一个Rest客户端,从API中检索响应。所以我创建了我的Spring项目,添加了webflux、lombok和h2。我还创建了一个DTO类“CashAccount”和以下方法: 当我使用“.bodyToMono(String.class)”时,所有的功能都很好,我收到了结果: 相反,当我使用“.bodyToMono(cashcount.c

  • 如何从改造和存储到java类并访问某个地方来读取此响应??