Тестирование API каратэ - как мы извлекаем значения из ответа Content-Type: text / html?

У меня есть запрос, который включает в себя запрос graphQL в теле.

Когда я отправляю его, он возвращает ответ с Content-Type →text/html; charset=utf-8 и некоторыми другими обычными заголовками. Ответ txt/html обычно включает две вещи:

  1. ColDefs как первая строка
  2. метаданные во второй строке

Теперь мне нужно убедиться, что ColDefs всегда отображается в первой строке. Вторая строка содержит метаданные.

Как мне убедиться, что первая строка ответа всегда содержит colDefs, а вторая строка содержит информацию о метаданных?

Ответ:

{
    "colDefs": [{
        "entityAttributeId": "abc",
        "headerName": "xyz",
        "field": "2",
        "entityPath": "",
        "entityId": "mna"
    }, {
        "entityAttributeId": "abc",
        "headerName": "abc",
        "field": "3",
        "entityPath": "abc",
        "entityId": "abc"
    }
        
]
} {
    "1": "1000",
    "2": "abc",
    "3": "abc",
    "4": 12,
    "5": "6457.T",
    "6": "123",
    "7": "abc"
} {
    "1": "123",
    "2": "abc",
    "3": "abc",
    "4": 123,
    "5": "123",
    "6": "",
    "7": "abc"
} 

Когда я пытаюсь напечатать ответ каратэ , он не выводит содержимое второй строки (метаданные), а просто выводит colDefs.

Ответ каратэ:

{
    "colDefs": [{
        "entityAttributeId": "abc",
        "headerName": "xyz",
        "field": "2",
        "entityPath": "",
        "entityId": "mna"
    }, {
        "entityAttributeId": "abc",
        "headerName": "abc",
        "field": "3",
        "entityPath": "abc",
        "entityId": "abc"
}

Действия по воспроизведению:

URL: какой-то URL

Headers: Content-Type = 'application/json'

(отправка явно в функции карате),

Тело запроса

{
"query": "query($someid: [String]) {some(someid:$someid) {someid someNm someVariable {someVariable someVariableid otherVariable{ otherVariable1 { variable CUSIP issuer { someVariable2 }}}}}}",
        "variables": {
            "someid": ["1090"]
        },
        "includeMetadata": false
    }       
    
Response Header:  Connection →keep-alive
Content-Length →86488
Content-Type →text/html; charset=utf-8
   

Тело ответа:

{
    "colDefs": [{
        "entityAttributeId": "abc",
        "headerName": "xyz",
        "field": "2",
        "entityPath": "",
        "entityId": "mna"
    }, {
        "entityAttributeId": "abc",
        "headerName": "abc",
        "field": "3",
        "entityPath": "abc",
        "entityId": "abc"
    }
        
]
} {
    "1": "1000",
    "2": "abc",
    "3": "abc",
    "4": 12,
    "5": "6457.T",
    "6": "123",
    "7": "abc"
} {
    "1": "123",
    "2": "abc",
    "3": "abc",
    "4": 123,
    "5": "123",
    "6": "",
    "7": "abc"
} 

Ответ каратэ:

{
    "colDefs": [{
        "entityAttributeId": "abc",
        "headerName": "xyz",
        "field": "2",
        "entityPath": "",
        "entityId": "mna"
    }, {
        "entityAttributeId": "abc",
        "headerName": "abc",
        "field": "3",
        "entityPath": "abc",
        "entityId": "abc"
}

person QualityMatters    schedule 13.12.2018    source источник
comment
Затем сопоставьте response.colDefs == coldef. Это работает. А как насчет проверки метаданных. Как туда добраться? Ответ на печать показывает только colDefs.   -  person QualityMatters    schedule 13.12.2018
comment
@PeterThomas Как я могу распечатать весь текст / HTML-ответ от карате? Похоже, он сохраняет только часть ответа, который является своего рода json.   -  person QualityMatters    schedule 13.12.2018
comment
сделано. Мы можем продолжить здесь сейчас?   -  person QualityMatters    schedule 14.12.2018
comment
Я запутался ? ответ - HTML? вы можете вставить точную текстовую форму ответа? Каратэ не собирается волшебным образом конвертировать HTML в JSON.   -  person Peter Thomas    schedule 14.12.2018
comment
Обновленная деталь, о которой идет речь, с другими деталями.   -  person QualityMatters    schedule 14.12.2018
comment
Я вставил то, что вы утверждаете, является телом ответа в валидатор JSON, и это недействительный JSON. Я уверен, что вы все еще не предоставляете здесь полную картину. почему тип ответа HTML?   -  person Peter Thomas    schedule 14.12.2018
comment
Да, это недопустимый JSON. Требование для этого API: Конечная точка принимает запрос graphql в качестве входных данных Конечная точка возвращает плоские (прямоугольные) данные из результата graphql. Формат ответа - [ProjectName] Wire Format   -  person QualityMatters    schedule 14.12.2018
comment
было бы хорошо, если бы вы все это раскрыли раньше. Я попытался ответить - всего наилучшего.   -  person Peter Thomas    schedule 14.12.2018


Ответы (1)


Ясно, что ваш ответ недействителен JSON и в каком-то проприетарном формате - и ожидание, что Каратэ волшебным образом конвертирует его для вас, ожидает слишком многого :)

Я предлагаю вам написать код Java для пользовательской проверки. Здесь происходит то, что Karate изо всех сил пытается получить половину ответа, обработанного как JSON, и отказывается от остального. Вы действительно должны это оценить :)

Поскольку Karate также хранит копию необработанного ответа в байтах (начиная с версии 0.9.0), вы можете сделать это:

* string temp = responseBytes

Теперь, пожалуйста, используйте код Java или пользовательский синтаксический анализ строк - и делайте все, что вам нужно, на temp, который будет Java String. Я должен сказать, что это похоже на ОЧЕНЬ плохо спроектированный API.

person Peter Thomas    schedule 14.12.2018