Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

[BUG][KOTLIN] multiplatform/jvm-ktor: `DELETE` without `requestBody` sends `"Content-Type: application/json"` with an empty body

Đang mở Phù hợp với người mới
#25,223 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@mohitduhan19 đang làm issue này rồi.

Từ ngày 13/10/2026.

  • #25243 của @mohitduhan19 — đang mở

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
78/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
kotlin
Lĩnh vực
backend

Hướng nghiên cứu

Đọc modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClient.kt.mustache và tệp tương ứng libraries/jvm-ktor/infrastructure/ApiClient.kt.mustache; kiểm tra cách hàm request xử lý EmptyContent và các phương thức đặt loại nội dung và phần thân. Kiểm tra các bài kiểm thử template hiện có cho những thư viện này, rồi xác minh rằng DELETE được tạo không có requestBody sẽ bỏ qua loại nội dung và phần thân, còn DELETE có phần thân JSON vẫn gửi cả hai.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Issue: Bug
Bug Report Checklist
  • Have you provided a full/minimal spec to reproduce the issue?
  • Have you validated the input using an OpenAPI validator?
  • Have you tested with the latest master to confirm the issue still exists?
  • Have you searched for related issues/PRs?
  • What's the actual output vs expected output?
Description

For operations without a requestBody, the kotlin client with library=multiplatform generates localVariableBody = io.ktor.client.utils.EmptyContent. ApiClient.request then sets a JSON content type and the body for every PUT, POST, PATCH, and DELETE, regardless of whether there is a body:

if (requestConfig.method in listOf(RequestMethod.PUT, RequestMethod.POST, RequestMethod.PATCH, RequestMethod.DELETE)) {
    val contentType = (requestConfig.headers[HttpHeaders.ContentType]?.let { ContentType.parse(it) }
        ?: ContentType.Application.Json)
    this.contentType(contentType)
    this.setBody(body)
}

As a result, a DELETE /items/{id}?row=1 without a request body goes out with Content-Type: application/json and Content-Length: 0. Servers that bind a JSON body whenever the content type says JSON reject the request. ASP.NET Core with FastEndpoints answers:

{"statusCode":400,"message":"One or more errors occurred!","errors":{"/SerializerErrors":["The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. LineNumber: 0 | BytePositionInLine: 0."]}}

The same DELETE succeeds when the client omits the Content-Type header. DELETE operations that do declare a JSON requestBody work as expected.

The same block exists in libraries/jvm-ktor/infrastructure/ApiClient.kt.mustache.

openapi-generator version

7.25.0 (Gradle plugin org.openapi.generator). The same code is in the 7.26.0 templates and on master (modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClient.kt.mustache, the request function). Not a regression as far as I can tell.

OpenAPI declaration file content or url
openapi: 3.0.0
info:
  title: Delete without body
  version: 1.0.0
paths:
  /items/{id}:
    delete:
      operationId: deleteItem
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: rowVersion
          in: query
          required: true
          schema:
            type: integer
      responses:
        '204':
          description: Deleted
Generation Details
generatorName: kotlin
library: multiplatform
additionalProperties:
  dateLibrary: kotlinx-datetime
Steps to reproduce
  1. Generate the client from the spec above with -g kotlin --library multiplatform.
  2. Call deleteItem("1", 1) against any server, or a request logger.
  3. Observe the request headers: Content-Type: application/json, Content-Length: 0.

Actual: a JSON content type is sent although the operation has no request body.
Expected: no Content-Type header (and no body) when the operation declares no requestBody.

Related issues/PRs

None found (searched for "multiplatform DELETE content-type empty body" and "EmptyContent Content-Type").

Suggest a fix

Only set the content type and body when there is a body, for example:

if (requestConfig.method in listOf(RequestMethod.PUT, RequestMethod.POST, RequestMethod.PATCH, RequestMethod.DELETE) &&
    body != null && body !is io.ktor.client.utils.EmptyContent
) {
    val contentType = (requestConfig.headers[HttpHeaders.ContentType]?.let { ContentType.parse(it) }
        ?: ContentType.Application.Json)
    this.contentType(contentType)
    this.setBody(body)
}

The same change applies to the jvm-ktor template.

Ngôn ngữ chính
Java
Star
26.8k
Fork
7.7k
Merge trung bình
1 ngày 12 giờ
Pull request đã merge (30 ngày)
141

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của OpenAPITools/openapi-generator

Tất cả issue của OpenAPITools/openapi-generator

Issue tương tự

Thêm issue về Java

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.