É possível encaminhar solicitações para diferentes aplicativos via Content-Type?

4

Estou criando uma API JSON e gostaria de atualizar a API usando algum tipo de negociação de conteúdo. No momento, estou pensando em usar os Tipos MIME de fornecedores para fazer isso.

Embora eu possa fazer isso no nível do aplicativo, estou pensando que seria melhor fazer isso acontecer no nível do servidor HTTP. Isso é possível com o Apache ou nginx?

O tipo de conteúdo seria algo como: application/vnd.vendorname-v1+json ou possivelmente usando parâmetros: application/vnd.vendorname+json;v=1

    
por Adam Lassek 13.07.2011 / 22:12

3 respostas

6

A abordagem idiomática do Nginx para esse tipo de problema é via map . Por favor, veja minha resposta no StackOverflow .

Basicamente, você define uma map em http seção

map $any_variable $my_upstream {
  # Default value:
  default upstream1;

  # Exact match:
  application/vnd.vendorname+json;v=1 upstream2;

  # Regexp:
  ~^application.*vnd.vendorname-v1\+json upstream3;
}

Você pode combinar correspondências exatas e expressões regulares em um mapa.

Você simplesmente usa $my_upstream em server ou location seção (s):

location / {
  proxy_pass http://$my_upstream$uri;
}

O Nginx avalia as variáveis do mapa preguiçosamente, apenas uma vez (por solicitação) e quando você as usa.

    
por 14.07.2011 / 09:38
1

Claro; O mod_rewrite do Apache poderia fazer isso com um pouco de RewriteCond , apesar de eu estar um pouco enferrujado demais para dar um exemplo do topo da minha cabeça. No nginx, porém, seria parecido com o seguinte (assumindo que você tinha dois upstreams definidos; um para o seu jsonapp e outro para ... otherstuff):

if ($content_type = application/vnd.vendorname-v1+json) {
    proxy_pass http://jsonapp/
    break;
}
proxy_pass http://otherstuff/
    
por 14.07.2011 / 01:44
0

Eu vou contra o que os outros sugeriram.

Acho que é uma péssima ideia confiar na versão da API JSON do servidor HTTP. O servidor HTTP não sabe nada sobre a API que você está desenvolvendo. É como definir a versão do Linux em um arquivo de texto em vez de criá-lo na origem do kernel. Isso torna as atualizações mais complicadas.

Tudo o que precisa é de uma configuração incorreta na estrada e tudo pode ir de barriga para o próximo cara que não sabia sobre a configuração complicada.

Sem saber muito sobre o que você está fazendo, deve haver uma maneira de torná-lo possível usando sua linguagem de script (você está usando uma linguagem de script ou é um respondente JSON personalizado?). ou seja, como uma variável global disponível em javascript. Ou retornando a solicitação, uma solicitação JSON para obter a versão da API. Ou sempre enviá-lo em todas as respostas JSON na frente da resposta. É muito pouco texto depois de tudo.

Use o K.I.S.S. abordagem e você não vai se arrepender disso.

    
por 14.07.2011 / 23:12