【问题标题】:How to log Google Cloud Storage response headers while uploading from Google App Engine如何在从 Google App Engine 上传时记录 Google Cloud Storage 响应标头
【发布时间】:2019-09-22 17:03:13
【问题描述】:

我想改进我的应用程序的日志记录,查看此处提供的 App Engine 入门教程: https://cloud.google.com/java/getting-started-appengine-standard/using-cloud-storage

我坚持如何为每次上传记录来自 Google Cloud Storage 的响应标头。

如何访问 HTTP 响应的低级属性?

这是官方教程中的辅助方法:

  public String uploadFile(Part filePart, final String bucketName) throws IOException {
    DateTimeFormatter dtf = DateTimeFormat.forPattern("-YYYY-MM-dd-HHmmssSSS");
    DateTime dt = DateTime.now(DateTimeZone.UTC);
    String dtString = dt.toString(dtf);
    final String fileName = filePart.getSubmittedFileName() + dtString;

    // the inputstream is closed by default, so we don't need to close it here
    BlobInfo blobInfo =
        storage.create(
            BlobInfo
                .newBuilder(bucketName, fileName)
                // Modify access list to allow all users with link to read file
                .setAcl(new ArrayList<>(Arrays.asList(Acl.of(User.ofAllUsers(), Role.READER))))
                .build(),
            filePart.getInputStream());
    // return the public download link
    return blobInfo.getMediaLink();
  }

【问题讨论】:

  • 为什么需要页眉?我不确定这些库是否可以为您提供此信息。覆盖一些类(不推荐)或直接使用API​​(更好的方式)->您可以根据需要处理请求正文和标头。
  • @guillaumeblaquiere 我想捕获并记录标头以调试来自 GCS 的错误响应。异常处理是不够的。 >直接使用API​​(更好的方式)->您可以根据需要处理请求正文和标头您可以提供代码示例吗?将其发布为答案,我很乐意接受。

标签: google-app-engine google-cloud-storage


【解决方案1】:

这里是请求API的代码:

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.util.Iterator;
import java.util.List;
import java.net.URL;

public class OracleConnection extends HttpServlet { //extends only usefull for Cloud Run

    //With function, the name can be different. Not with Cloud Run. Here a GET request
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response) throws IOException {
        String token = request.getParameter("token");
        String bucket = request.getParameter("bucket");
        String fileName = request.getParameter("file");

        String getUrl = "https://www.googleapis.com/storage/v1/b/" + bucket + "/o/" + fileName + "?alt=media";

        URL url = new URL(getUrl);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("Authorization", "Bearer " + token);

        con.getRequestProperties().forEach((s, strings) -> System.out.println(s + " -> " + strings));
        //Do the query
        int status = con.getResponseCode();

        StringBuilder fullResponseBuilder = new StringBuilder("Response code \n");
        fullResponseBuilder.append(con.getResponseCode())
                .append(" ")
                .append(con.getResponseMessage())
                .append("\nHeaders\n");

        con.getHeaderFields().entrySet().stream()
                .filter(entry -> entry.getKey() != null)
                .forEach(entry -> {
                    fullResponseBuilder.append(entry.getKey()).append(": ");
                    List headerValues = entry.getValue();
                    Iterator it = headerValues.iterator();
                    if (it.hasNext()) {
                        fullResponseBuilder.append(it.next());
                        while (it.hasNext()) {
                            fullResponseBuilder.append(", ").append(it.next());
                        }
                    }
                    fullResponseBuilder.append("\n");
                });

        Reader streamReader = null;

        if (con.getResponseCode() > 299) {
            streamReader = new InputStreamReader(con.getErrorStream());
        } else {
            streamReader = new InputStreamReader(con.getInputStream());
        }

        BufferedReader in = new BufferedReader(streamReader);
        String inputLine;
        StringBuilder content = new StringBuilder();
        while ((inputLine = in.readLine()) != null) {
            content.append(inputLine);
        }

        in.close();

        fullResponseBuilder.append("Response: ")
                .append(content);
        //File content is in 'content' string.
        System.out.println(fullResponseBuilder.toString());
        response.getWriter().println(fullResponseBuilder.toString());
        response.setStatus(HttpServletResponse.SC_OK);
    }
}

我用这个命令调用它(部署在码头服务器,它只是为了提供参数的例子)

curl "localhost:8080/?bucket=<mybucket>&file=<my full path file>&token=$(gcloud config config-helper --format='value(credential.access_token)')"

响应如下:

Response code
200 OK
Headers
Alt-Svc: quic=":443"; ma=2592000; v="46,43,39",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
Server: UploadServer
X-Goog-Generation: 1567533725338357
Pragma: no-cache
X-Goog-Metageneration: 1
Date: Tue, 24 Sep 2019 10:03:36 GMT
X-Goog-Hash: crc32c=Yqnzlw==,md5=kAQK2I6n1zJq0o/LkH7G/w==
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
ETag: CPWV/ZaeteQCEAE=
Content-Disposition: attachment
X-Goog-Storage-Class: REGIONAL
X-GUploader-UploadID: AEnB2UruP4LxUKRnX7tB6uRBAwnEbKJgfhuoWBWQa2_aArD7L-mUC96Fr9-cA0w90bMLwsZFE5joxT392Hd-Ab-XTwgkybvMPw
Vary: X-Origin, Origin
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Content-Length: 14
Content-Language: en
Content-Type: text/csv
Response: <your file content>
`` 

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2018-07-22
    • 1970-01-01
    • 2013-06-27
    • 2021-11-05
    • 2015-07-07
    相关资源
    最近更新 更多