Spring Boot 调用同步获取以调用后端API时,响应仅包含从后端返回的部分数据

7gcisfzg  于 2023-03-12  发布在  Spring
关注(0)|答案(1)|浏览(151)

我正在做一个课程项目。我们使用JavaScript作为前端。当调用异步获取时,响应只包含后端返回的部分数据。
例如,如果后端API返回:

{
    "status": "success",
    "content": [
        {
            name: "ABC",
            key: "123456"
        }
    ]
}

前端收到的响应:

{"status": "success"}

下面是我的代码:
前端:

export async function getObjectsFromS3(data) {
    const response = await fetch(url, {
        method: "GET",
        headers: {
            "Authorization": `Basic ${btoa("user:password")}`
        }
    });

    if (!response.ok) {
        throw new Error(response.status);
    }

    const result = await response.json();
    
    return result
}

后端:

@RestController
@RequestMapping("/users")
public class S3Controller {
    
    @Autowired
    S3Service s3Service;

    @GetMapping("/{userName}/objects")
    public String listObjects(@PathVariable String userName, @RequestParam String prefix) {
        AuthenticationUtil.authorizeUser(userName);
        String jsonString = "";
        JSONObject jo = new JSONObject();
        JSONArray ja = new JSONArray();

        ja.put("key");
        ja.put("name");
        ja.put("size");
        ja.put("type");

        try {
            List<S3Object> objects = s3Service.listObjects(prefix);
            for (S3Object object : objects) {
                String suffix = object.key().replace(prefix, "");
                String[] suffixDir = suffix.split("/");

                if ((suffixDir.length == 1 && suffixDir[0] !== "")) {
                    String type, name, key;
                    key = object.key();

                    if (key.charAt(key.length() - 1) === '/') 
                        type = "folder";
                    else 
                        type = "file";

                    name = suffixDir[suffixDir.length - 1];

                    jsonString += object.key() + "," + name + "," + String.valueOf(object.size()) + "," + type + "\n";
                }
            }
            jo.put("status", "success");
            jo.put("content", CDL.toJSONArray(ja, jsonString));
        } catch (Exception e) {
            jo.put("status", "error");
            jo.put("message", "Error when listing files: " + e.getMessage());
        }

        return jo.toString();
    }

下面是DevTools的响应截图。DevTool's Response
我试过用postman调用这个API,一切正常,但是从frontend调用时,响应只包含部分数据。

ljsrvy3e

ljsrvy3e1#

有两件事值得一试:
1删除后端服务器中的所有逻辑,只返回一个简单的JSON对象。
2将您的数据放入一个payload中,如下所示:

"payload": {
    "status": "success",
    "content": [
        {
          "name": "ABC",
          "key": 123456
        }
    ]
  }

相关问题