Este tópico descreve erros comuns em funções de callback durante operações de upload e como tratá-los.
Sobre callbacks de upload
Ao fazer upload de um arquivo, o OSS pode fornecer um Callback para o seu servidor de callback. Para implementar o callback de upload, inclua os parâmetros relevantes na solicitação de upload. As APIs que suportam callback de upload são PutObject, PostObject e CompleteMultipartUpload. Para obter mais informações, consulte Upload callback e Callback API no Guia do Desenvolvedor.
Um servidor de callback também é chamado de servidor de serviço.
Cenários de aplicação
-
Notificação
Uma aplicação típica envolve o upload e o callback por uma terceira parte autorizada, que especifica os parâmetros de callback durante o upload do arquivo. Após a conclusão do upload, o OSS envia uma solicitação de callback ao servidor de callback. Ao receber essa solicitação, o servidor registra as informações do upload.
-
Processamento, revisão e estatísticas
Ao receber uma solicitação de callback, o servidor de callback processa, revisa e gera estatísticas sobre os arquivos enviados.
Fluxo de dados
A tabela a seguir descreve os fluxos de dados.
Fluxo de dados | Significado | Descrição |
1 | O cliente faz upload de um arquivo e inclui um parâmetro de callback. Para obter mais informações sobre o formato, consulte SDK/PostObject. | O SDK implementa o upload (PutObject e CompleteMultipartUpload) e a API PostObject realiza o callback. |
2 | A instância do OSS armazena o arquivo e inicia um callback. | A instância do OSS envia uma solicitação Para obter mais informações sobre o formato da solicitação POST, consulte Iniciar uma solicitação de callback. |
3 | O servidor de callback retorna o resultado do processamento. |
|
4 | O OSS retorna o resultado do upload e do callback. |
|
SDK/PostObject
Durante o upload do arquivo, defina os parâmetros de callback para especificar a URL do servidor de callback, os dados a serem enviados a ele e o formato dos dados. Quando o servidor de callback processa um callback, algumas informações de contexto, como bucket e object, são especificadas usando variáveis de sistema. Outras informações de contexto usam variáveis personalizadas.
Os seguintes parâmetros estão disponíveis para um callback de upload:
|
Campo |
Significado |
Descrição |
|
callbackUrl |
Endereço do servidor de callback |
Obrigatório |
|
callbackHost |
Valor do |
Opcional. O valor padrão é |
|
callbackBody |
Corpo da mensagem de solicitação de callback |
Obrigatório. Pode conter variáveis de sistema e variáveis personalizadas. |
|
callbackBodyType |
Valor de |
Opcional. Pode ser |
Inclua os parâmetros de callback de upload na solicitação de upload de uma das duas maneiras a seguir:
Inclua os parâmetros de callback via
x-oss-callbackno cabeçalho da mensagem. Esta é uma maneira comum e recomendada.Inclua os parâmetros de callback via
callbackna QueryString.
As regras para gerar os valores de x-oss-callback ou callback são as seguintes:
Callback := Base64(CallbackJson)
CallbackJson := '{' CallbackUrlItem, CallbackBodyItem [, CallbackHostItem, CallbackBodyTypeItem] '}'
CallbackUrlItem := '"'callbackUrl'"' ':' '"'CallbackUrlValue'"'
CallbackBodyItem := '"'callbackBody'"' ':' '"'CallbackBodyValue'"'
CallbackHostItem := '"'callbackHost'"' ':' '"'CallbackHostValue'"'
CallbackBodyTypeItem := '"'callbackBodyType'"' : '"'CallbackBodyType'"'
CallbackBodyType := application/x-www-form-urlencoded | application/json
Exemplos de valores de CallbackJson:
"callbackUrl" : "http://abc.com/test.php",
"callbackHost" : "oss-cn-hangzhou.aliyuncs.com",
"callbackBody" : "{\"bucket\":${bucket}, \"object\":${object},\"size\":${size},\"mimeType\":${mimeType},\"my_var\":${x:my_var}}",
"callbackBodyType" : "application/json"
ou
"callbackUrl" : "http://abc.com/test.php",
"callbackBody" : "bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&my_var=${x:my_var}"
Variáveis de sistema e variáveis personalizadas
Variáveis para CallbackJson, como ${bucket}, ${object} e ${size}, no exemplo de CallbackJson são variáveis de sistema definidas pelo OSS. Durante o callback, o OSS substitui as variáveis de sistema pelos valores reais. A tabela a seguir lista as variáveis de sistema definidas pelo OSS.
|
Variável |
Significado |
|
${bucket} |
Nome do espaço de armazenamento |
|
${object} |
Nome do arquivo |
|
${etag} |
Etag do arquivo |
|
${size} |
Tamanho do arquivo |
|
${mimeType} |
Tipo de arquivo, como image/jpeg |
|
${imageInfo.height} |
Altura da imagem |
|
${imageInfo.width} |
Largura da imagem |
|
${imageInfo.format} |
Formato da imagem, como .jpg e .png |
As variáveis de sistema diferenciam maiúsculas de minúsculas.
A variável de sistema está no formato
${bucket}.imageInfo é definido para imagens. Para formatos que não sejam de imagem, o valor de imageInfo fica em branco.
Variáveis para CallbackJson, como ${x:my_var}, no exemplo de CallbackJson são variáveis personalizadas. Durante o callback, o OSS substitui as variáveis personalizadas pelos valores personalizados. Defina e inclua os valores das variáveis personalizadas na solicitação de upload de uma das duas maneiras a seguir:
Inclua as variáveis personalizadas via
x-oss-callback-varno cabeçalho da mensagem. Esta é uma maneira comum e recomendada.Inclua as variáveis personalizadas via
callback-varna QueryString.
As regras para gerar os valores de x-oss-callback-var ou callback-var são as seguintes:
CallbackVar := Base64(CallbackVarJson)
CallbackVarJson := '{' CallbackVarItem [, CallbackVarItem]* '}'
CallbackVarItem := '"''x:'VarName'"' : '"'VarValue'"'
Exemplos de valores de CallbackVarJson:
"x:my_var1" : "value1",
"x:my_var2" : "value2"
As variáveis personalizadas devem começar com x:: Elas diferenciam maiúsculas de minúsculas e seguem o formato
${x:my_var}.O comprimento da variável personalizada é limitado pelo tamanho do cabeçalho da mensagem e da URL. Recomendamos que o número de variáveis personalizadas não exceda 10 e que o comprimento total não ultrapasse 512 bytes.
Exemplo de uso do SDK
Alguns SDKs, como JAVA e JS, encapsulam as etapas anteriores. Outros, como Python, PHP e C, exigem o uso das regras acima para gerar os parâmetros de callback de upload e as variáveis personalizadas. A tabela a seguir lista exemplos de uso do SDK.
SDK | Exemplo de callback de upload | Descrição: |
JAVA | Observe os caracteres de escape em | |
Python | - | |
PHP | Não é necessário codificar | |
C # | Use using para ler | |
JS | - | |
C | - | |
Ruby | - | |
iOS | Certifique-se de que o formato de | |
Android | Observe os caracteres de escape em |
Atualmente, o SDK Go não oferece suporte a callback de upload.
Exemplo de uso do PostObject
O PostObject suporta callback de upload, cujos parâmetros são transmitidos pelo campo de formulário callback, enquanto as variáveis personalizadas são transmitidas por um campo de formulário independente. Para obter mais informações, consulte PostObjet.
A tabela a seguir lista exemplos de uso do PostObject.
|
SDK |
Exemplo de callback de upload |
|
Java |
|
|
Python |
|
|
C# |
Servidor de callback
O servidor de callback é um servidor HTTP que processa solicitações de callback e mensagens POST enviadas pelo OSS. A URL do servidor de callback corresponde ao valor do parâmetro de callback de upload callbackUrl. Implemente sua própria lógica de processamento no servidor de callback para registro, revisão, processamento e geração de estatísticas dos dados enviados.
Assinatura de callback
O servidor de callback precisa verificar a assinatura de uma solicitação POST para garantir que ela provenha do callback de upload do OSS. O servidor também pode processar a mensagem diretamente sem verificar a assinatura. No entanto, para aumentar a segurança, recomendamos que o servidor de callback verifique a assinatura da mensagem. Para obter mais informações sobre as regras de assinatura de callback, consulte Assinatura de callback.
O exemplo de servidor de callback do OSS descreve como implementar a verificação de assinatura. Recomendamos usar o código diretamente.
Processamento de mensagens
A lógica principal do servidor de callback é processar a solicitação de callback do OSS. Observe os seguintes itens:
O servidor de callback deve processar a solicitação POST do OSS.
O tempo limite do callback do OSS é de cinco segundos. Portanto, o servidor de callback deve concluir o processamento dentro desse prazo e retornar o resultado.
O corpo da mensagem enviado do servidor de callback para o OSS deve estar no formato JSON.
O servidor de callback usa sua própria lógica; o OSS fornece exemplos, mas não a lógica específica do serviço.
Exemplo de implementação
A tabela a seguir descreve exemplos de implementação do servidor de callback.
|
Linguagem |
Exemplo |
Método de execução |
|
JAVA |
Descompacte o pacote e execute |
|
|
PHP |
Implante e execute o programa no ambiente Apache. |
|
|
Python |
Descompacte o pacote e execute |
|
|
Ruby |
Execute |
Procedimento de depuração
A depuração do callback de upload inclui a depuração do cliente que faz o upload do arquivo e do servidor de callback que o processa. Recomendamos depurar primeiro o cliente e depois o servidor de callback. Após depurar as duas partes independentemente, realize o callback de upload completo.
-
Depuração do cliente
Utilize o servidor de callback
http://oss-demo.aliyuncs.com:23450fornecido pelo OSS, ou seja, o parâmetro de callbackcallbackUrlpara depurar o cliente. Esse servidor apenas verifica a assinatura da solicitação de callback, sem processá-la. Para solicitações com assinatura verificada com êxito, o servidor retorna{"Status":"OK"}. Para solicitações cuja verificação de assinatura falha, o servidor retorna400 Bad Request. Para solicitações que não sejam POST, o servidor retorna501 Unsupported method. Para obter mais informações sobre o código do exemplo de servidor de callback, consulte callback_app_server.py.zip. -
Depuração do servidor de callback
O servidor de callback é um servidor HTTP capaz de processar solicitações POST. Modifique o servidor de callback com base no exemplo fornecido pelo OSS ou implemente-o por conta própria. A tabela a seguir descreve os exemplos de servidor de callback fornecidos pelo OSS.
Linguagem
Exemplo
Método de execução
JAVA
Descompacte o pacote e execute
java -jar oss-callback-server-demo.jar 9000.PHP
Implante e execute o programa no ambiente Apache
Python
Descompacte o pacote e execute
python callback_app_server.py.C#
Compile o programa e execute
aliyun-oss-net-callback-server.exe 127.0.0.1 80.Go
Compile o programa e execute
aliyun_oss_callback_server.Ruby
Execute
ruby aliyun_oss_callback_server.rb.Depure o servidor de callback executando o comando cURL. Use os seguintes comandos:
# Run the following command to send a `POST` request whose message body is `object=test_obj` to the callback server: curl -d "object=test_obj" http://oss-demo.aliyuncs.com:23450 -v # Run the following command to send a `POST` request whose message body is `post.txt` to the callback server: curl -d @post.txt http://oss-demo.aliyuncs.com:23450 -v # Run the following command to send a `POST` request whose message body is `post.txt` and which carries the specified message header `Content-Type` to the callback server: curl -d @post.txt -H "Content-Type: application/json" http://oss-demo.aliyuncs.com:23450 -vNotaAo depurar o servidor de callback, ignore a verificação de assinatura, pois é difícil para o
cURLsimular a função de assinatura.O exemplo do OSS já fornece a função de verificação de assinatura. Recomendamos usá-la diretamente.
Recomendamos que o servidor de callback forneça a função de log para registrar todas as mensagens, facilitando a depuração e o rastreamento.
Após processar corretamente uma solicitação de callback, o servidor deve retornar
200em vez de 20x.O corpo da mensagem enviado do servidor de callback para o OSS deve estar no formato JSON, e
Content-Typedeve ser definido comoapplication/json.
Erros comuns e causas
-
InvalidArgument
<Error> <Code>InvalidArgument</Code> <Message>The callback configuration is not json format.</Message> <RequestId>587C79A3DD373E2676F73ECE</RequestId> <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId> <ArgumentName>callback</ArgumentName> <ArgumentValue>{"callbackUrl":"8.8.8.8:9090","callbackBody":"{"bucket":${bucket},"object":${object}}","callbackBodyType":"application/json"}</ArgumentValue> </Error>NotaAs configurações do parâmetro de callback estão incorretas ou o formato do parâmetro é inválido. O erro comum é que os parâmetros de callback em
ArgumentValuenão estejam em um formato JSON válido. Em JSON,\e"são caracteres de escape. Por exemplo,"callbackBody":"{"bucket":${bucket},"object":${object}}"deve ser"callbackBody":"{\"bucket\":${bucket},\"object\":${object}}". Para obter mais informações sobre os SDKs, consulte os exemplos de callback de upload na seção Exemplo de uso do SDK.Caractere após escape
Caractere antes do escape
\\
\\\\
“
\\\”
\b
\\b
\f
\\f
\n
\\n
\r
\\r
\t
\\t
-
CallbackFailed
Exemplos de erro CallbackFailed:
-
Exemplo 1
<Error> <Code>CallbackFailed</Code> <Message>Response body is not valid json format.</Message> <RequestId>587C81A125F797621829923D</RequestId> <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId> </Error>NotaO corpo da mensagem enviado do servidor de callback para o OSS não está no formato JSON. Confirme o conteúdo executando
curl -d "<Content>" <CallbackServerURL> -vou capturando pacotes. Recomendamos usar o Wireshark para capturar pacotes no Windows e o tcpdump para capturar pacotes no Linux. Mensagens de retorno inválidas incluem:OKe\357\273\277{"Status":"OK"}(o cabeçalho BOM contendo os bytesef bb bf). -
Exemplo 2
<Error> <Code>CallbackFailed</Code> <Message>Error status : -1. OSS can not connect to your callbackUrl, please check it.</Message> <RequestId>587C8735355BE8694A8E9100</RequestId> <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId> </Error>NotaO tempo de processamento do servidor de callback excede cinco segundos. Consequentemente, o OSS determina que ocorreu um tempo limite. Recomendamos modificar a lógica de processamento do servidor de callback para processamento assíncrono, garantindo que ele conclua o processamento dentro de cinco segundos e retorne o resultado ao OSS.
-
Exemplo 3
<Error> <Code>CallbackFailed</Code> <Message> error status:-1 8.8.8.8: 9090 reply timeout, cost: 5000 MS, timeout: 5000 MS (Ernest-4, errno170) </message> <RequestId>587C8D382AE0B92FA3EEF62C</RequestId> <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId> </Error>NotaO tempo de processamento do servidor de callback excede cinco segundos. Consequentemente, o OSS determina que ocorreu um tempo limite.
-
Exemplo 4
<Error> <Code>CallbackFailed</Code> <Message>Error status : 400.</Message> <RequestId>587C89A02AE0B92FA3C7981D</RequestId> <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId> </Error>NotaO código de status da mensagem enviada do servidor de callback para o OSS é
400. Verifique a lógica de processamento do servidor de callback. -
Exemplo 5
<Error> <Code>CallbackFailed</Code> <Message>Error status : 502.</Message> <RequestId>587C8D382AE0B92FA3EEF62C</RequestId> <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId> </Error>NotaO servidor de callback não foi iniciado,
CallbackUrlestá ausente nos parâmetros de callback ou a rede entre a instância do OSS e o servidor de callback está desconectada. Recomendamos implantar o servidor de callback no ECS, que pertence à mesma intranet que o OSS, para economizar custos de tráfego e garantir a qualidade da rede.
-
-
O corpo da resposta não está no formato JSON.
Por exemplo:

Este erro pode ter os seguintes motivos:
-
O corpo da resposta retornado pelo servidor de aplicativos para o OSS não está no formato JSON, conforme mostrado na figura a seguir:

O OSS relata o erro se resp_body não estiver em um formato JSON válido. Além disso, outros fatores subjacentes podem causar esse erro, como o servidor de aplicativos retornando um rastreamento de pilha em vez de uma resposta normal ao OSS devido a exceções.
-
O corpo da resposta retornado pelo servidor de aplicativos para o OSS carrega um BOM no cabeçalho.
Esse problema geralmente ocorre em servidores de aplicativos codificados em PHP, que incluem um cabeçalho BOM na resposta retornada ao OSS. Portanto, o OSS relata o erro porque três bytes adicionais (ou seja, o cabeçalho BOM) estão incluídos na resposta, o que não está em conformidade com o formato JSON. A figura a seguir mostra o conteúdo incluído no pacote enviado pelo servidor de aplicativos.

Na figura anterior, os bytes
ef bb bfsão os três bytes adicionais do cabeçalho BOM.NotaPara resolver esse problema, remova o cabeçalho BOM na resposta retornada pelo servidor de aplicativos ao OSS.
-
-
Status de erro
Códigos de status de erro, como 502 e 400, indicam erros retornados devido a funções de callback incorretas, conforme mostrado na figura a seguir.
NotaUm código de status de erro, como 400, 404 ou 403, indica o status HTTP retornado pelo servidor de aplicativos ao OSS. O código de status 200 indica operação bem-sucedida.
O código de status de erro 502 é retornado quando o serviço Web não está habilitado no servidor de aplicativos, o que significa que o servidor não pode receber a solicitação de callback enviada pelo OSS.
-
Tempo limite
A figura a seguir mostra um erro de tempo limite.
NotaPor motivos de segurança, o OSS aguarda o recebimento da resposta de callback por no máximo 5 segundos. Se a resposta não for retornada, o OSS se desconecta do servidor de aplicativos e retorna um erro de tempo limite ao cliente. Ignore o endereço IP incluído na mensagem de erro.