Java Google云存储API和可恢复上传返回空位置头
我试图使用Google云存储JSON API获取可恢复上传的位置头,如下所述:,但我总是收到响应代码400的错误请求。我知道我在这条路上的某个地方犯了一个愚蠢的错误,但我就是看不到这是在哪里发生的,所以如果有人能成功地让这个工作,或者能指出我所缺少的东西,那将是一个很大的帮助 这是我的申请代码:Java Google云存储API和可恢复上传返回空位置头,java,google-app-engine,google-cloud-storage,httpurlconnection,Java,Google App Engine,Google Cloud Storage,Httpurlconnection,我试图使用Google云存储JSON API获取可恢复上传的位置头,如下所述:,但我总是收到响应代码400的错误请求。我知道我在这条路上的某个地方犯了一个愚蠢的错误,但我就是看不到这是在哪里发生的,所以如果有人能成功地让这个工作,或者能指出我所缺少的东西,那将是一个很大的帮助 这是我的申请代码: private static final String RESUMEABLE_UPLOAD_URL_FORMAT = "https://www.googleapis.com/upload/storage
private static final String RESUMEABLE_UPLOAD_URL_FORMAT = "https://www.googleapis.com/upload/storage/v1/b/%s/o?uploadType=resumable"
public String getLocationForResumeableUpload(String filename, ResourceType resourceType, String contentType, Long contentLength) throws EndpointException {
String resumeableUploadURL = String.format(RESUMEABLE_UPLOAD_URL_FORMAT,
getBucketForResourceType(resourceType).getBucketName());
try {
URL uploadURL = new URL(resumeableUploadURL);
HttpURLConnection connection = (HttpURLConnection) uploadURL.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("X-Upload-Content-Type", contentType);
connection.setRequestProperty("X-Upload-Content-Length", "" + contentLength);
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
String json = "{\"name\":\"" + filename + "\"}";
connection.setRequestProperty("Content-Length", String.valueOf(json.getBytes().length));
List<String> scopes = new ArrayList<>();
scopes.add("https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService.GetAccessTokenResult accessToken =
AppIdentityServiceFactory.getAppIdentityService().getAccessToken(scopes);
connection.setRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());
connection.connect();
if (connection.getResponseCode() >= 400) {
log.debug("connection failed with accessToken: " + accessToken.getAccessToken());
log.debug(connection.getResponseMessage());
throw new NotFoundException("Object at url: " + resumeableUploadURL +
" returns response code: " + connection.getResponseCode() + " response message: " + connection.getResponseMessage());
}
String responseMessage = connection.getResponseMessage();
String locationHeader = connection.getHeaderField("Location");
log.debug("Upload request response: " + responseMessage + " Location header: " + locationHeader);
return locationHeader;
} catch (MalformedURLException e) {
log.error("URL Malformed: " + resumeableUploadURL + " unable to fetch resumeable upload url", e);
throw new InternalServerException("Unable to complete upload request", e);
} catch (IOException e) {
log.error("Unable to fetch upload URL from GCS: " + resumeableUploadURL, e);
throw new InternalServerException("Unable to complete upload request", e);
}
}
private static final String RESUMEABLE\u UPLOAD\u URL\u FORMAT=”https://www.googleapis.com/upload/storage/v1/b/%s/o?uploadType=resumable"
公共字符串GetLocationForResumableUpload(字符串文件名、ResourceType ResourceType、String contentType、Long contentLength)引发EndpointException异常{
String resumeableUploadURL=String.format(可恢复上传URL格式,
getBucketForResourceType(resourceType).getBucketName());
试一试{
URL uploadURL=新URL(resumeableUploadURL);
HttpURLConnection connection=(HttpURLConnection)uploadURL.openConnection();
connection.setRequestMethod(“POST”);
connection.setRequestProperty(“X-Upload-Content-Type”,contentType);
connection.setRequestProperty(“X-Upload-Content-Length”,“”+contentLength);
setRequestProperty(“内容类型”,“应用程序/json;字符集=UTF-8”);
字符串json=“{\'name\”:\”“+filename+“\”}”;
setRequestProperty(“Content-Length”,String.valueOf(json.getBytes().Length));
列表范围=新的ArrayList();
作用域。添加(“https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService.GetAccessTokenResult accessToken=
AppIdentityServiceFactory.getAppIdentityService().getAccessToken(作用域);
setRequestProperty(“授权”、“承载者”+accessToken.getAccessToken());
connection.connect();
if(connection.getResponseCode()>=400){
调试(“与accessToken的连接失败:+accessToken.getAccessToken());
log.debug(connection.getResponseMessage());
抛出新的NotFoundException(“url处的对象:”+ResumableUploadURL+
返回响应代码:“+connection.getResponseCode()+”响应消息:“+connection.getResponseMessage());
}
字符串responseMessage=connection.getResponseMessage();
字符串locationHeader=connection.getHeaderField(“位置”);
log.debug(“上传请求响应:+responseMessage+”位置头:+locationHeader”);
返回位置标题;
}捕获(格式错误){
log.error(“URL格式错误:+ResumableUploadURL+“无法获取可恢复上传URL”,e);
抛出新的InternalServerException(“无法完成上传请求”,e);
}捕获(IOE异常){
log.error(“无法从GCS获取上传URL:+ResumableUploadURL,e”);
抛出新的InternalServerException(“无法完成上传请求”,e);
}
}
更新1:结果发现我的代码中有一个bug,我正在检查响应代码>400,请求返回响应代码:400-错误请求。现在我的问题是,为什么我的请求不正确?因此,需要将对象的名称放入查询字符串中,如下所示:
private static final String RESUMEABLE_UPLOAD_URL_FORMAT = "https://www.googleapis.com/upload/storage/v1/b/%s/o?uploadType=resumable&name=%s"
public String getLocationForResumeableUpload(String filename, ResourceType resourceType, String contentType, Long contentLength) throws EndpointException {
String resumeableUploadURL = String.format(RESUMEABLE_UPLOAD_URL_FORMAT,
getBucketForResourceType(resourceType).getBucketName(), filename);
try {
URL uploadURL = new URL(resumeableUploadURL);
HttpURLConnection connection = (HttpURLConnection) uploadURL.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("X-Upload-Content-Type", contentType);
connection.setRequestProperty("X-Upload-Content-Length", "" + contentLength);
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
connection.setRequestProperty("Content-Length", String.valueOf(0));
List<String> scopes = new ArrayList<>();
scopes.add("https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService.GetAccessTokenResult accessToken =
AppIdentityServiceFactory.getAppIdentityService().getAccessToken(scopes);
connection.setRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());
connection.connect();
if (connection.getResponseCode() >= 400) {
log.debug("connection failed with accessToken: " + accessToken.getAccessToken());
log.debug(connection.getResponseMessage());
throw new NotFoundException("Object at url: " + resumeableUploadURL +
" returns response code: " + connection.getResponseCode() + " response message: " + connection.getResponseMessage());
}
String responseMessage = connection.getResponseMessage();
String locationHeader = connection.getHeaderField("Location");
log.debug("Upload request response " + connection.getResponseCode() + " : " + responseMessage + " Location header: " + locationHeader);
return locationHeader;
} catch (MalformedURLException e) {
log.error("URL Malformed: " + resumeableUploadURL + " unable to fetch resumeable upload url", e);
throw new InternalServerException("Unable to complete upload request", e);
} catch (IOException e) {
log.error("Unable to fetch upload URL from GCS: " + resumeableUploadURL, e);
throw new InternalServerException("Unable to complete upload request", e);
}
}
因此,完整的代码如下所示:
private static final String RESUMEABLE_UPLOAD_URL_FORMAT = "https://www.googleapis.com/upload/storage/v1/b/%s/o?uploadType=resumable&name=%s"
public String getLocationForResumeableUpload(String filename, ResourceType resourceType, String contentType, Long contentLength) throws EndpointException {
String resumeableUploadURL = String.format(RESUMEABLE_UPLOAD_URL_FORMAT,
getBucketForResourceType(resourceType).getBucketName(), filename);
try {
URL uploadURL = new URL(resumeableUploadURL);
HttpURLConnection connection = (HttpURLConnection) uploadURL.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("X-Upload-Content-Type", contentType);
connection.setRequestProperty("X-Upload-Content-Length", "" + contentLength);
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
connection.setRequestProperty("Content-Length", String.valueOf(0));
List<String> scopes = new ArrayList<>();
scopes.add("https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService.GetAccessTokenResult accessToken =
AppIdentityServiceFactory.getAppIdentityService().getAccessToken(scopes);
connection.setRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());
connection.connect();
if (connection.getResponseCode() >= 400) {
log.debug("connection failed with accessToken: " + accessToken.getAccessToken());
log.debug(connection.getResponseMessage());
throw new NotFoundException("Object at url: " + resumeableUploadURL +
" returns response code: " + connection.getResponseCode() + " response message: " + connection.getResponseMessage());
}
String responseMessage = connection.getResponseMessage();
String locationHeader = connection.getHeaderField("Location");
log.debug("Upload request response " + connection.getResponseCode() + " : " + responseMessage + " Location header: " + locationHeader);
return locationHeader;
} catch (MalformedURLException e) {
log.error("URL Malformed: " + resumeableUploadURL + " unable to fetch resumeable upload url", e);
throw new InternalServerException("Unable to complete upload request", e);
} catch (IOException e) {
log.error("Unable to fetch upload URL from GCS: " + resumeableUploadURL, e);
throw new InternalServerException("Unable to complete upload request", e);
}
}
公共字符串GetLocationForResumableUpload(字符串文件名、ResourceType ResourceType、String contentType、Long contentLength)引发EndpointException{
String resumeableUploadURL=String.format(可恢复上传URL格式,
getBucketForResourceType(resourceType).getBucketName(),文件名);
试一试{
URL uploadURL=新URL(resumeableUploadURL);
HttpURLConnection connection=(HttpURLConnection)uploadURL.openConnection();
connection.setRequestMethod(“POST”);
connection.setRequestProperty(“X-Upload-Content-Type”,contentType);
connection.setRequestProperty(“X-Upload-Content-Length”,“”+contentLength);
setRequestProperty(“内容类型”,“应用程序/json;字符集=UTF-8”);
connection.setRequestProperty(“内容长度”,String.valueOf(0));
列表范围=新的ArrayList();
作用域。添加(“https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService.GetAccessTokenResult accessToken=
AppIdentityServiceFactory.getAppIdentityService().getAccessToken(作用域);
setRequestProperty(“授权”、“承载者”+accessToken.getAccessToken());
connection.connect();
if(connection.getResponseCode()>=400){
调试(“与accessToken的连接失败:+accessToken.getAccessToken());
log.debug(connection.getResponseMessage());
抛出新的NotFoundException(“url处的对象:”+ResumableUploadURL+
返回响应代码:“+connection.getResponseCode()+”响应消息:“+connection.getResponseMessage());
}
字符串responseMessage=connection.getResponseMessage();
字符串locationHeader=connection.getHeaderField(“位置”);
log.debug(“上传请求-响应”+连接.getResponseCode()+”:“+responseMessage+”位置头:“%+locationHeader”);
返回位置标题;
}捕获(格式错误){
log.error(“URL格式错误:+ResumableUploadURL+“无法获取可恢复上传URL”,e);
抛出新的InternalServerException(“无法完成上传请求”,e);
}捕获(IOE异常){
log.error(“无法从GCS获取上传URL:+ResumableUploadURL,e”);
抛出新的InternalServerException(“无法完成上传请求”,e);
}
}