Тип содержимого полезной нагрузки запроса POST - PullRequest
0 голосов
/ 17 июня 2019

Я отправляю тело JSON в своем POST-запросе, но http.DetectContentType идентифицирует его как текстовый / обычный тип.

Я хочу иметь гибкость для обработки полезной нагрузки запроса на основе их типа контента - еслиXML {} if JSON {} else {NO Processing}

Чтобы выполнить эту условную обработку, я использую http.DetectContentType для возврата типа содержимого запроса, но он возвращает текст / обычный текст для каждого сценария.

func Test(w http.ResponseWriter, r *http.Request) *ErrorObject {

        reqBuffer := make([]byte, 512)
        _, err := r.Body.Read(reqBuffer)
        if err != nil {

    return ErrorObject{}.New(1, err, nil)
}

contentType := GetContentType(reqBuffer)
fmt.Printf(contentType)

    if contentType == "application/xml" || contentType == "text/xml" {
    w.Header().Set("Content-Type", "application/xml; charset=UTF-8") ...}
    if contentType == "application/json" || contentType == "text/json" {
    w.Header().Set("Content-Type", "application/json; charset=UTF-8") ... } 
    else return Invalid Request Type error
} 

   func GetContentType(buffer []byte) string {

       fmt.Println(string(buffer))
       contentType := http.DetectContentType(buffer)
       fmt.Printf(contentType)
       return contentType

    }

Ожидайте возврата функции - Тип контента как application / json, но получаю текст / обычный

Использование POSTMAN для отправки запроса на сервер с Body в виде raw и JSON

    {
      "data": [
         {
           "group": "TEST",
           "name": "TEST",
           "released": true,
           "version": 1,
           "teststeps": [
              {
                   "bin": 32,
                   "comment": "PAA",
                   "dataType": "J",
                   "format": "R6.2",
                   "id": "PAA3",
                   "osg": 8,
                   "usg": 0
              }
            ],
           "parameters": [
              {
                  "comment": "test",
                  "description": "test",
                  "format": "R7.0",
                  "id": 1,
                  "teststepId": "PAA",
                  "value": 30,
                  "type": "teststep"
            }
          ]
        }
     ]
  }

1 Ответ

4 голосов
/ 17 июня 2019

Я использую http.DetectContentType для возврата типа содержимого запроса, но он возвращает текст / обычный текст для каждого сценария.

Согласно документации DetectContentType "... реализует алгоритм, описанный в https://mimesniff.spec.whatwg.org/, для определения типа содержимого заданных данных" .Алгоритм в первую очередь предназначен для обработки типов контента, которые браузер может обрабатывать самостоятельно.

И если вы посмотрите на фактический код , вы увидите, что ему вообще не важно, application/json или что-то подобное, и что он возвращает text/plain для всего, что выглядит недвоичный (и не был сопоставлен ранее как с text/html).

Другими словами: это неправильный инструмент для работы.Правильным способом было бы указать клиенту, какой тип контента отправляется с использованием заголовка Content-Type, и не дать серверу угадать тип контента.

...