From 9b271dd8d09c42f05b00771d9e8b3dbb5c880ba6 Mon Sep 17 00:00:00 2001
From: Rodrigo Castro <18582098+rodrcastro@users.noreply.github.com>
Date: Wed, 12 Mar 2025 18:49:35 +0000
Subject: [PATCH 1/3] change code sample in python
---
packages/react-openapi/src/code-samples.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/react-openapi/src/code-samples.ts b/packages/react-openapi/src/code-samples.ts
index bb07f1f20c..e36c3fa92f 100644
--- a/packages/react-openapi/src/code-samples.ts
+++ b/packages/react-openapi/src/code-samples.ts
@@ -130,7 +130,7 @@ export const codeSampleGenerators: CodeSampleGenerator[] = [
if (body === 'files') {
code += indent(`files=${body}\n`, 4);
} else {
- code += indent(`data=${stringifyOpenAPI(body)}\n`, 4);
+ code += indent(`json=${stringifyOpenAPI(body)}\n`, 4);
}
}
From 0bef455a0db8866a1346b2940ce91fc1c813b4b0 Mon Sep 17 00:00:00 2001
From: Rodrigo Castro <18582098+rodrcastro@users.noreply.github.com>
Date: Wed, 12 Mar 2025 18:57:50 +0000
Subject: [PATCH 2/3] fix tests
---
packages/react-openapi/src/code-samples.test.ts | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/packages/react-openapi/src/code-samples.test.ts b/packages/react-openapi/src/code-samples.test.ts
index 4945f9fc9d..3fa3ec24a4 100644
--- a/packages/react-openapi/src/code-samples.test.ts
+++ b/packages/react-openapi/src/code-samples.test.ts
@@ -366,7 +366,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/x-www-form-urlencoded"},\n data={"key":"value"}\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/x-www-form-urlencoded"},\n json={"key":"value"}\n)\n\ndata = response.json()'
);
});
@@ -385,7 +385,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/json"},\n data={"key":"value"}\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/json"},\n json={"key":"value"}\n)\n\ndata = response.json()'
);
});
@@ -402,7 +402,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/xml"},\n data="value"\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/xml"},\n json="value"\n)\n\ndata = response.json()'
);
});
@@ -419,7 +419,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/graphql"},\n data="{ key }"\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/graphql"},\n json="{ key }"\n)\n\ndata = response.json()'
);
});
@@ -436,7 +436,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"text/csv"},\n data="key,value"\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"text/csv"},\n json="key,value"\n)\n\ndata = response.json()'
);
});
@@ -470,7 +470,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"text/plain"},\n data="value"\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"text/plain"},\n json="value"\n)\n\ndata = response.json()'
);
});
From 631cecc826f2f96dfde42ba4dedf755810e737cc Mon Sep 17 00:00:00 2001
From: Nolann Biron
Date: Wed, 19 Mar 2025 21:47:57 +0100
Subject: [PATCH 3/3] Better support for python json
---
.../react-openapi/src/code-samples.test.ts | 10 +++++-----
packages/react-openapi/src/code-samples.ts | 18 +++++++++++++++---
2 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/packages/react-openapi/src/code-samples.test.ts b/packages/react-openapi/src/code-samples.test.ts
index 3fa3ec24a4..d54ef2ed50 100644
--- a/packages/react-openapi/src/code-samples.test.ts
+++ b/packages/react-openapi/src/code-samples.test.ts
@@ -366,7 +366,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/x-www-form-urlencoded"},\n json={"key":"value"}\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/x-www-form-urlencoded"},\n data={"key":"value"}\n)\n\ndata = response.json()'
);
});
@@ -402,7 +402,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/xml"},\n json="value"\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/xml"},\n data="value"\n)\n\ndata = response.json()'
);
});
@@ -419,7 +419,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/graphql"},\n json="{ key }"\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"application/json"},\n json="{ key }"\n)\n\ndata = response.json()'
);
});
@@ -436,7 +436,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"text/csv"},\n json="key,value"\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"text/csv"},\n data="key,value"\n)\n\ndata = response.json()'
);
});
@@ -470,7 +470,7 @@ describe('python code sample generator', () => {
const output = generator?.generate(input);
expect(output).toBe(
- 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"text/plain"},\n json="value"\n)\n\ndata = response.json()'
+ 'import requests\n\nresponse = requests.get(\n "https://example.com/path",\n headers={"Content-Type":"text/plain"},\n data="value"\n)\n\ndata = response.json()'
);
});
diff --git a/packages/react-openapi/src/code-samples.ts b/packages/react-openapi/src/code-samples.ts
index e36c3fa92f..62ac0171c0 100644
--- a/packages/react-openapi/src/code-samples.ts
+++ b/packages/react-openapi/src/code-samples.ts
@@ -126,11 +126,16 @@ export const codeSampleGenerators: CodeSampleGenerator[] = [
code += indent(`headers=${stringifyOpenAPI(headers)},\n`, 4);
}
+ const contentType = headers?.['Content-Type'] || '';
+
if (body) {
if (body === 'files') {
code += indent(`files=${body}\n`, 4);
- } else {
+ } else if (contentType === 'application/json') {
+ // If the content type is JSON, we use json={}
code += indent(`json=${stringifyOpenAPI(body)}\n`, 4);
+ } else {
+ code += indent(`data=${stringifyOpenAPI(body)}\n`, 4);
}
}
@@ -326,7 +331,9 @@ const BodyGenerators = {
getPythonBody: (body: any, headers?: Record) => {
if (!body || !headers) return;
let code = '';
- const contentType: string = headers['Content-Type'] || '';
+ // Copy headers to avoid mutating the original object
+ const headersCopy = { ...headers };
+ const contentType: string = headersCopy['Content-Type'] || '';
if (isFormData(contentType)) {
code += 'files = {\n';
@@ -346,7 +353,12 @@ const BodyGenerators = {
body = 'files';
}
- return { body, code, headers };
+ if (isGraphQL(contentType)) {
+ // Set Content-Type to application/json for GraphQL, recommended by GraphQL spec
+ headersCopy['Content-Type'] = 'application/json';
+ }
+
+ return { body, code, headers: headersCopy };
},
getHTTPBody: (body: any, headers?: Record) => {
if (!body || !headers) return undefined;