Добавление цели приближения в API AdWords приводит к ошибке CampaignCriterionError.CONCRETE_TYPE_REQUIRED

#google-ads-api

#google-ads-api

Вопрос:

Редактировать: Google подтвердил, что это ошибка в клиентских библиотеках: https://github.com/googleads/googleads-java-lib/issues/20

Я пытаюсь добавить критерий таргетинга на близость к кампании с помощью AdWords API. Я использую версию API JAX-WS (потому что мне это нужно для запуска в App Engine). Я могу добавить критерии приближения с помощью версии API AXIS, поэтому мне интересно, есть ли ошибка в API.

Это код, который я использую для добавления критерия близости:

     // Get the CampaignService.
CampaignCriterionServiceInterface campaignCriterionService =
    adWordsServices.get(session, CampaignCriterionServiceInterface.class);

Proximity proximity = new Proximity();
GeoPoint geoPoint = new GeoPoint();
geoPoint.setLatitudeInMicroDegrees(43633941);
geoPoint.setLongitudeInMicroDegrees(-79398718);
proximity.setGeoPoint(geoPoint);
proximity.setRadiusDistanceUnits(ProximityDistanceUnits.KILOMETERS);
proximity.setRadiusInUnits(10.0);

List<CampaignCriterionOperation> operations = new ArrayList<CampaignCriterionOperation>();
for (Criterion criterion : new Criterion[] { proximity }) {
  CampaignCriterionOperation operation = new CampaignCriterionOperation();
  CampaignCriterion campaignCriterion = new CampaignCriterion();
  campaignCriterion.setCampaignId(campaignId);
  campaignCriterion.setCriterion(criterion);
  operation.setOperand(campaignCriterion);
  operation.setOperator(Operator.ADD);
  operations.add(operation);
}

CampaignCriterionReturnValue result =
    campaignCriterionService.mutate(operations);

// Display campaigns.
for (CampaignCriterion campaignCriterion : result.getValue()) {
  System.out.printf("Campaign criterion with campaign id '%s', criterion id '%s', "
        "and type '%s' was added.n", campaignCriterion.getCampaignId(), campaignCriterion
      .getCriterion().getId(), campaignCriterion.getCriterion().getCriterionType());
}
  

По сути, это код из https://github.com/googleads/googleads-java-lib/blob/master/examples/adwords_axis/src/main/java/adwords/axis/v201402/targeting/AddCampaignTargetingCriteria.java где критерии были заменены критерием близости и классами из com.google.api.ads.adwords.axis.* заменены их эквивалентами com.google.api.ads.adwords.jaxws.*.

При запуске (с соответствующей информацией ads.properties) я получаю следующую ошибку:

 <?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <ResponseHeader xmlns="https://adwords.google.com/api/adwords/cm/v201402">
            <requestId>0004fd8ef85c5a600aec338ad0007a98</requestId>
            <serviceName>CampaignCriterionService</serviceName>
            <methodName>mutate</methodName>
            <operations>1</operations>
            <responseTime>363</responseTime>
        </ResponseHeader>
    </soap:Header>
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Server</faultcode>
            <faultstring>[CampaignCriterionError.CONCRETE_TYPE_REQUIRED @ operations[0].operand.criterion]</faultstring>
            <detail>
                <ApiExceptionFault xmlns="https://adwords.google.com/api/adwords/cm/v201402">
                    <message>[CampaignCriterionError.CONCRETE_TYPE_REQUIRED @ operations[0].operand.criterion]</message>
                    <ApplicationException.Type>ApiException</ApplicationException.Type>
                    <errors xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CampaignCriterionError">
                        <fieldPath>operations[0].operand.criterion</fieldPath>
                        <trigger/>
                        <errorString>CampaignCriterionError.CONCRETE_TYPE_REQUIRED</errorString>
                        <ApiError.Type>CampaignCriterionError</ApiError.Type>
                        <reason>CONCRETE_TYPE_REQUIRED</reason>
                    </errors>
                </ApiExceptionFault>
            </detail>
        </soap:Fault>
    </soap:Body> </soap:Envelope>
  

Я подозреваю, что что-то идет не так при составлении xml-файла, отправляемого в AdWords, потому что исходящий запрос выглядит следующим образом:

 <?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Header>
        <RequestHeader xmlns="https://adwords.google.com/api/adwords/cm/v201402">
            <userAgent>Test (AwApi-Java, AdWords-AppEngine/1.28.0, Common-Java/1.28.0, JAX-WS/Unknown, Java/1.7.0_45, maven)</userAgent>
            <developerToken>REMOVEDFORSAFETYREASONS</developerToken>
            <clientCustomerId>XYZ-XYZ-XYYZ</clientCustomerId>
        </RequestHeader>
    </S:Header>
    <S:Body>
        <mutate xmlns="https://adwords.google.com/api/adwords/cm/v201402" xmlns:ns2="https://adwords.google.com/api/adwords/video/v201402">
            <operations>
                <operator>ADD</operator>
                <operand>
                    <campaignId>185385127</campaignId>
                    <criterion/>
                </operand>
            </operations>
        </mutate>
    </S:Body>
</S:Envelope>
  

Обратите внимание, что тег criterion полностью пуст.

Запуск того же кода, но с версией API AXIS работает и выдает следующий исходящий xml:

 <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Header>
        <ns1:RequestHeader xmlns:ns1="https://adwords.google.com/api/adwords/cm/v201402" soapenv:mustUnderstand="0">
            <ns1:clientCustomerId>XYZ-XYZ-XYYZ</ns1:clientCustomerId>
            <ns1:developerToken>REMOVEDFORSAFETY</ns1:developerToken>
            <ns1:userAgent>Test (AwApi-Java, AdWords-Axis/1.28.0, Common-Java/1.28.0, Axis/1.4, Java/1.7.0_45, jars)</ns1:userAgent>
            <ns1:validateOnly>false</ns1:validateOnly>
            <ns1:partialFailure>false</ns1:partialFailure>
        </ns1:RequestHeader>
    </soapenv:Header>
    <soapenv:Body>
        <mutate xmlns="https://adwords.google.com/api/adwords/cm/v201402">
            <operations>
                <operator>ADD</operator>
                <operand>
                    <campaignId>185385127</campaignId>
                    <criterion xmlns:ns2="https://adwords.google.com/api/adwords/cm/v201402" xsi:type="ns2:Proximity">
                        <ns2:geoPoint>
                            <ns2:latitudeInMicroDegrees>43633941</ns2:latitudeInMicroDegrees>
                            <ns2:longitudeInMicroDegrees>-79398718</ns2:longitudeInMicroDegrees>
                        </ns2:geoPoint>
                        <ns2:radiusDistanceUnits>KILOMETERS</ns2:radiusDistanceUnits>
                        <ns2:radiusInUnits>10.0</ns2:radiusInUnits>
                    </criterion>
                </operand>
            </operations>
        </mutate>
    </soapenv:Body>
</soapenv:Envelope>
  

Обратите внимание, что в последнем случае критерий включает геолокацию и радиус, как и следовало ожидать.

Другие типы критериев, такие как местоположение и язык, отлично работают как в версиях AXIS, так и в JAX-WS.

Кто-нибудь сталкивался с этой проблемой раньше? Есть предложения, что может быть не так?

Ответ №1:

Это было исправлено в версии v201409 (выпуск 1.34.0) AdWords API. Обновление до этой версии устранило проблему для меня.