2013-11-20 6 views
0

Я разрабатываю клиент AdWords API на Ruby с использованием драгоценных камней Google google-adwords-api и ads-common (который использует savon).Разбор ошибкиСтрих от ответа API AdWords

Когда какая-либо политика AdWords нарушена, Savon создает исключение с описанием нарушения в своем message. Например, нарушающие правила о товарных знаках:

[PolicyViolationError{ 
    super=PolicyViolationError.POLICY_ERROR @ operations[0].operand.ad.headline, 
    key=PolicyViolationKey{policyName=trademark,violatingText=Xerox}, 
    externalPolicyName=Trademarked Term, 
    externalPolicyUrl=, 
    externalPolicyDescription=Due to trademark reasons, we do not allow advertisers to use 'Xerox' in their Google AdWords ads. This term may be trademarked either for a certain product or service category and may apply only in certain countries you have targeted. 

    , 
    isExemtable=true, 
    violatingParts=[Part{index=0, length=5}]}] 

Я форматировал его для ясности, но первоначально, есть только две линия ломает после «целенаправленной.», Остальное одна линии без ломаешь и с пробелами только после запятых, aroung "@" и в тексте на естественном языке.

Как я могу разобрать этот вид сообщения с помощью Ruby самым простым способом? Я надеюсь, что это какой-то язык разметки, и для него есть драгоценный камень. Поэтому я не хочу использовать регулярные выражения, если есть более правильный путь.

+0

Это строка или структура? Если это строка, я бы использовал регулярное выражение. Какие данные вам нужно извлечь? –

+0

Строка. RegEx - это верный ответ, и, вероятно, я его буду использовать. Я просто надеялся, что кто-то узнает язык разметки и скажет мне, какой драгоценный камень использовать. – Hnatt

ответ

0

Найден ответ. Он лгал в жемчужине Google google-adwords-api. Исключением является класс AdwordsApi::V201309::AdGroupAdService::ApiException. Кроме того, атрибут message имеет атрибут errors, содержащий одно и то же сообщение в виде структуры. Поэтому нет необходимости разбирать странный синтаксис разметки.

> pp e.errors 
[{:field_path=>"operations[0].operand.ad.headline", 
    :trigger=>nil, 
    :error_string=>"PolicyViolationError.POLICY_ERROR", 
    :api_error_type=>"PolicyViolationError", 
    :key=>{:policy_name=>"trademark", :violating_text=>"Sony"}, 
    :external_policy_name=>"Trademarked Term", 
    :external_policy_url=>nil, 
    :external_policy_description=> 
    "Due to trademark reasons, we do not allow advertisers to use 'Sony' in their Google AdWords ads. This term may be trademarked either for a certain product or service category and may apply only in certain countries you have targeted.\n\n", 
    :is_exemptable=>true, 
    :violating_parts=>[{:index=>0, :length=>4}], 
    :xsi_type=>"PolicyViolationError"}] 

Хороший хэш, из которого я могу вытащить policy_name, violating_text и другие детали.

Смежные вопросы