2011-05-27 28 views
12

Estoy intentando usar Ruby on Rails para comunicarme con la API de Salesforce. Puedo buscar datos con facilidad pero tengo problemas para publicar datos en el servidor. Estoy usando HTTParty como por mensaje de Quinton Wall aquí:Cambiar el tipo de cuerpo a JSON mediante HTTParty

https://github.com/quintonwall/omniauth-rails3-forcedotcom/wiki/Build-Mobile-Apps-in-the-Cloud-with-Omniauth,-Httparty-and-Force.com

pero todo lo que parecen ser capaces de llegar desde el servidor de la fuerza de ventas es el error que estoy presentando el cuerpo como html

{" mensaje "=>" MediaType de 'application/x-www-form-urlencoded' no es compatible con este recurso", "errorCode"=> "UNSUPPORTED_MEDIA_TYPE"}

el código responsable parece:

require 'rubygems' 
require 'httparty' 

class Accounts 
    include HTTParty 
    format :json 

    ...[set headers and root_url etc] 

    def self.save 
    Accounts.set_headers 
    response = (post(Accounts.root_url+"/sobjects/Account/", :body => {:name => "graham"}.to_json)) 
    end 
end 

Alguien tiene una idea de por qué el cuerpo debería publicarse como html y cómo cambiar esto para que definitivamente sea tan rápido como para que Salesforce no lo rechace.

Cualquier ayuda sería apreciada. vivas

Respuesta

11

Tienes que establecer el encabezado Content-Type en application/json. No he utilizado HTTParty, pero parece que usted tiene que hacer algo como

response = (post(Accounts.root_url+"/sobjects/Account/", :body => {:name => "graham"}.to_json) , :options => { :headers => { 'Content-Type' => 'application/json' } }) 

estoy un poco sorprendidos de que la opción de formato no hace esto automáticamente.

+1

aplausos. He encontrado que si simplemente agrego los encabezados de línea 'Content-Type' => "application/json" encima de la solicitud, esto parece ser el truco también. Solo debe establecerse por defecto en html aunque el cuerpo esté configurado como json. gracias por su ayuda – GrahamJRoy

+0

¿es posible que la llamada a_json la confunda con el formato del cuerpo? los otros ejemplos que vi no hicieron eso. – superfell

+0

interesante. Obtengo un error js parse si lo dejo: {"message" => "Token no reconocido 'naegaa': esperaba 'null', 'true' o 'false' en [line: 1, column: 23]", "errorCode" => "JSON_PARSER_ERROR"} – GrahamJRoy

18

El encabezado Content-Type debe establecerse en "application/json". Esto se puede hacer mediante la inserción de : cabeceras => { 'Content-Type' => 'application/json'} como un parámetro para posterior, es decir:

response = post(Accounts.root_url+"/sobjects/Account/", 
    :body => {:name => "graham"}.to_json, 
    :headers => {'Content-Type' => 'application/json'}) 
+1

También puede considerar usar el tipo de mime "application/vnd.api + json", [registrado con IANA] (http://www.iana.org/assignments/media-types/application/vnd.api+json) y documentado como parte de [jsonapi] (http://jsonapi.org/) – jesse

Cuestiones relacionadas