2012-03-19 22 views
8

Editar: Creo que he descubierto cómo hacer la parte de datos binarios. Verifíquelo en el código, pero estoy bastante seguro de que lo hice bien. Ahora estoy recibiendo un nuevo error al intentar completar la carga como se describe en el Vimeo API documentationPUT HTTP para cargar un archivo en Java

Edición 2: Agregado .debug() a la OAuthService y actualizada la salida.

Pregunta original: Estoy intentando subir un video a Vimeo usando el Vimeo API (Streaming Method). Estoy usando scribe para autorizar mi aplicación, obtener mi token de acceso y prepararme para la carga del video. Simplemente no sé qué hacer en el punto de la documentación de la API Vimeo dice "datos binarios de su archivo aquí" en este ejemplo de una petición HTTP para el PUT:

PUT http://1.2.3.4:8080/upload?ticket_id=abcdef124567890 HTTP/1.1

anfitrión: 1.2.3.4:8080

Content-Length: 339 108

Content-Type: video/mp4

.... datos binarios de su archivo aquí ....

Puedo obtener bien el ticket y los encabezados. Es solo, ¿qué debo hacer para insertar los datos binarios de mi archivo?

Notas:

  • Es una aplicación de escritorio en Java
  • Es un archivo de vídeo pequeña Estoy probando

Aquí está mi código de la opción de venta (recuerda, estoy usando scribe)

// Setup File (line 52) 
File testUp = new File("C:/Users/Kent/Desktop/test.mp4"); 
String contentLength = Long.toString(testUp.length()); 
System.out.println("The content length is: " + contentLength); 
byte[] fileBytes = ByteStreams.toByteArray(new FileInputStream(testUp)); 

// Upload file (line 58) 
request = new OAuthRequest(Verb.PUT, endpoint); 
request.addHeader("Content-Length", contentLength); 
request.addHeader("Content-Type", "video/mp4"); 
request.addPayload(fileBytes); 
response = signSendAndPrint(service, accessToken, request, "Upload PUT: " + endpoint); 

// Check response code is valid (line 65) 
if (response.getCode() != 200) { 
    System.out.println("The response was not 200! It was: " + response.getCode()); 
    return; 
} 

// Verify the upload (line 71) 
request = new OAuthRequest(Verb.PUT, endpoint); 
request.addHeader("Content-Length", "0"); 
request.addHeader("Content-Range", "bytes */*"); 
response = signSendAndPrint(service, accessToken, request, "Verify Upload PUT: " + endpoint); 

// Check response code is valid (line 77) 
if (response.getCode() != 308) { 
    System.out.println("The response was not 308! It was: " + response.getCode()); 
    return; 
} 

// Complete Upload (line 83) 
request = new OAuthRequest(Verb.PUT, endpoint); 
request.addQuerystringParameter("method", "vimeo.videos.upload.complete"); 
Response completeResponse = signSendAndPrint(service, accessToken, request, "complete"); // This is line 86, it's the second to top level of my code that breaks the process. 

//Set video info (line 88) 
setVimeoVideoInfo(completeResponse, service, accessToken, vimeoAPIURL); 
    } 



/** 
    * Signs the request on the service, prints information on the request, sends the request, prints 
    * information on the response and returns the response 
    * 
    * @param service 
    * @param accessToken 
    * @param request 
    * @param description 
    * @return 
    */ 
    private static Response signSendAndPrint(OAuthService service, Token accessToken, OAuthRequest request, String description) { 
    service.signRequest(accessToken, request); 
    printRequest(request, description + " Request"); 
    Response response = request.send(); //This is line 105. It's the top level of my code that breaks the process 
    printResponse(response, description + " Response"); 
    return response; 
    } 

de salida del método signSendAndPrint(OAuthService service, Token accessToken, OAuthRequest request, String description) y en el OAuthService.debug():

Upload PUT: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Request 
Headers: {Authorization=OAuth oauth_signature="MTPIVFfGVUQn4QswNV6av4CjzJw%3D", oauth_version="1.0", oauth_nonce="-606493399", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="MY_CONSUMER_KEY", oauth_token="MY_OAUTH_TOKEN", oauth_timestamp="1332428103", Content-Length=15125120, Content-Type=video/mp4} 
Verb: PUT 
Complete URL: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e 

Upload PUT: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Response 
Code: 200 
Headers: {null=HTTP/1.1 200 OK, Content-Length=0, Connection=close, Content-Type=text/plain, Server=Vimeo/1.0} 
Body: 
signing request: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e 
setting token to: Token[87bddf1382ac9f423d4b7c4166bdf0b2 , fdae7a033c7e1c932abce533627d6045124e8593] 
generating signature... 
base string is: PUT&http%3A%2F%2F174.129.155.54%3A8080%2Fupload&oauth_consumer_key%3DMY_CONSUMER_KEY%26oauth_nonce%3D1585934110%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1332428110%26oauth_token%3DMY_OAUTH_TOKEN%26oauth_version%3D1.0%26ticket_id%3Da64ed67b4aefdc35d18aec6cfa0b7c5e 
signature is: bhWu7IX9JKEEn/ULcpJECEuwqOc= 
appended additional OAuth parameters: { oauth_signature -> bhWu7IX9JKEEn/ULcpJECEuwqOc= , oauth_version -> 1.0 , oauth_nonce -> 1585934110 , oauth_signature_method -> HMAC-SHA1 , oauth_consumer_key -> MY_CONSUMER_KEY, oauth_token -> MY_OAUTH_TOKEN, oauth_timestamp -> 1332428110 } 
using Http Header signature 

Verify Upload PUT: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Request 
Headers: {Authorization=OAuth oauth_signature="bhWu7IX9JKEEn%2FULcpJECEuwqOc%3D", oauth_version="1.0", oauth_nonce="1585934110", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="MY_CONSUMER_KEY", oauth_token="MY_OAUTH_TOKEN", oauth_timestamp="1332428110", Content-Length=0, Content-Range=bytes */*} *///Note, this is not part of the output, I just added */// so the rest of it doesn't appear commented out. 
Verb: PUT 
Complete URL: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e 

Verify Upload PUT: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Response 
Code: 308 
Headers: {null=HTTP/1.1 308 Resume Incomplete, Range=bytes=0-15125119, Content-Length=0, Connection=close, Content-Type=text/plain, Server=Vimeo/1.0} 
Body: 
signing request: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e&method=vimeo.videos.upload.complete 
setting token to: Token[87bddf1382ac9f423d4b7c4166bdf0b2 , fdae7a033c7e1c932abce533627d6045124e8593] 
generating signature... 
base string is: PUT&http%3A%2F%2F174.129.155.54%3A8080%2Fupload&method%3Dvimeo.videos.upload.complete%26oauth_consumer_key%3DMY_CONSUMER_KEY%26oauth_nonce%3D3111236130%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1332428110%26oauth_token%3DMY_OAUTH_TOKEN%26oauth_version%3D1.0%26ticket_id%3Da64ed67b4aefdc35d18aec6cfa0b7c5e 
signature is: vXlQ6OUKms8eHan+wEBO2HXBn/M= 
appended additional OAuth parameters: { oauth_signature -> vXlQ6OUKms8eHan+wEBO2HXBn/M= , oauth_version -> 1.0 , oauth_nonce -> 3111236130 , oauth_signature_method -> HMAC-SHA1 , oauth_consumer_key -> MY_CONSUMER_KEY, oauth_token -> MY_OAUTH_TOKEN, oauth_timestamp -> 1332428110 } 
using Http Header signature 

complete Request 
Headers: {Authorization=OAuth oauth_signature="vXlQ6OUKms8eHan%2BwEBO2HXBn%2FM%3D", oauth_version="1.0", oauth_nonce="3111236130", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="MY_CONSUMER_KEY", oauth_token="MY_OAUTH_TOKEN", oauth_timestamp="1332428110"} 
Verb: PUT 
Complete URL: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e&method=vimeo.videos.upload.complete 
Exception in thread "main" org.scribe.exceptions.OAuthException: Problems while creating connection. 
    at org.scribe.model.Request.send(Request.java:70) 
    at org.scribe.model.OAuthRequest.send(OAuthRequest.java:12) 
    at autouploadermodel.VimeoTest.signSendAndPrint(VimeoTest.java:105) 
    at autouploadermodel.VimeoTest.main(VimeoTest.java:86) 
Caused by: java.net.SocketException: Unexpected end of file from server 
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:723) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:589) 
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:720) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:589) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1319) 
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) 
    at org.scribe.model.Response.<init>(Response.java:28) 
    at org.scribe.model.Request.doSend(Request.java:110) 
    at org.scribe.model.Request.send(Request.java:62) 
    ... 3 more 
Java Result: 1 

Respuesta

2

Es necesario añadir otros dos parámetros al completarse la carga. Vimeo API documentation dice que necesita tres parámetros para vimeo.videos.upload.complete: nombre de archivo, oauth_token y ticket_id. el escriba se ocupa de la oauth_token por usted.

Además, tiene que llamar al punto final original, no el que se obtiene al solicitar un ticket.

+0

¡Impresionante! ¡Funciona perfectamente! Muchas gracias. No puedo creer que fuera tan simple, pero así es la mitad de las veces. Gracias de nuevo :) – kentcdodds

Cuestiones relacionadas