μ±κ³΅νλ©΄ 204 "μ½ν
μΈ μμ"μνλ‘ μλ΅νλ λ³ν μμ²μ΄ μμ΅λλ€. apollo-link-errorμ κ²°ν©νλ©΄ μ§μμ μΌλ‘ λ€νΈμν¬ μ€λ₯κ° λ°μν©λλ€ : Unexpected end of JSON input .
apollo-link-restκ° μλ΅μ λΉ λ³Έλ¬Έμ ꡬ문 λΆμνλ €λ κ²μΌλ‘ 보μ λλ€.
μ΄κ²μ μννλ λ°©λ²μ λν μμ΄λμ΄κ° μμ΅λκΉ? BTW SharePoint REST APIμ ν΅μ νλ €κ³ νλ―λ‘ μλ² μλ΅μ μ‘°μ ν μμλ λ°©λ²μ΄ λ§μ§ μμ΅λλ€.
λΉ μλ΅μ μ²λ¦¬νλ λ°©λ²μ apollo-link-restμ μ리λ λ°©λ²μ΄ μμ΄μΌν©λλ€.
λ΄ λμ°λ³μ΄ νΈμΆ :
<Mutation mutation={M_WRITE_PROJECT_DETAILS}>
{(writeProjectDetails, { data }) => (
<Form.Button
content="Save"
onClick={() => {
const token = localStorage.getItem("token");
writeProjectDetails({
variables: {
projectId: project.Id,
input: {
__metadata: {
type: "SP.Data.ProjectListItem"
},
Title: project.Title
}
},
context: {
headers: {
"X-RequestDigest": token,
"X-HTTP-Method": "MERGE",
"IF-MATCH": "*"
}
}
});
}}
/>
)}
</Mutation>
ν΄λΉνλ gql 쿼리 :
const M_WRITE_PROJECT_DETAILS = gql`
mutation writeToSPList($projectId: String, $input: String) {
writeToSPList(projectId: $projectId, input: $input)
@rest(
type: "Project"
path: "/web/lists/GetByTitle('Projects')/items(:projectId)"
method: "POST"
) {
NoResponse
}
}
`;
"NoResponse"λ μλ΅μ΄ μκΈ° λλ¬Έμ λΆλͺ ν _null_μ΄μ§λ§ μλ΅ νλμμ΄ λ³νμ λ³΄λΌ μ μμ΅λλ€.
@isopterix- μ§κΈ λΉμ₯μ΄ λ¬Έμ λ₯Ό μ½κ² ν΄κ²°ν λ°©λ²μ΄ μλ€κ³ μκ°ν©λλ€. -λ΄ μ΄κΈ° μκ°μ Fetchλ₯Ό λννκ³ 204 κ°μ μλ΅ λ³Έλ¬Έμ {}
λ체νλ μ¬μ©μ μ§μ Fetch ꡬνμ μ 곡νλ κ²μ΄ μ’μ΅λλ€
@isopterix μλ ν
μ€νΈλ‘μ΄ λ¬Έμ λ₯Ό μ¬ννλ €κ³ νμ§λ§ ν
μ€νΈλ λΉ λ³Έλ¬Έμ ν΅κ³Όνμ΅λλ€. λ³Έλ¬Έμ΄ λΉ λ¬Έμμ΄ μΈ κ²½μ° fetch response.json()
κ° {}
λ°ννλ κ²μΌλ‘ 보μ
λλ€. μ€λ₯κ° λ°μνλ μμΉλ₯Ό νμΈνκΈ° μν΄ λΌμ΄λΈ μ€μ μμ λ μμΈν μΆμ ν μ μμ΅λκΉ?
describe('response parsing', () => {
it('supports empty response bodies', async () => {
expect.assertions(1);
const link = new RestLink({ uri: '/api' });
fetchMock.post('/api/posts', {
status: 204,
body: '',
});
const mutation = gql`
mutation postEmptyResponse($input: String!) {
newPost(input: $input)
@rest(type: "Post", path: "/posts", method: "POST") {
NoResponse
}
}
`;
const {data} = await makePromise<Result>(
execute(link, {
operationName: 'postEmptyResponse',
query: mutation,
variables: { input: 'Love apollo' },
}),
);
expect(data).toEqual({
newPost: {
NoResponse: null,
__typename: 'Post',
}
});
});
});
@isopterix λ λ΄ λ§μ§λ§ λκΈμ μ κ²½
λΉ λ³Έλ¬Έμ κ°μ§ ν λ λ΄κ° 보λ ν κ°μ§ λ¬Έμ λ res.json()
λλ res.text()
λ₯Ό νΈμΆνμ§ μκ³ λ³Έλ¬Έμ 무μμ΄ μλμ§ μ μμλ νμ€ν λ°©λ²μ΄ μμΌλ©° νμ λ κ°μ§ λͺ¨λλ₯Ό νΈμΆνλ κ²½μ°λ μλ€λ κ²μ
λλ€. λΆνμν. κ·Έλ μ§ μμΌλ©΄ Content-Length
ν€λλ₯Ό λ³Ό μ μμ§λ§ νμ μ λ’°ν μ μλμ§ νμ€νμ§ μμ΅λλ€. λ λ€λ₯Έ μ΅μ
μ Content-Type
κ° application/json
μΈ κ²½μ°μλ§ JSONμ ꡬ문 λΆμνλ κ²μ΄μ§λ§ μΌλΆ APIλ λͺ¨λ μλ΅κ³Ό λΉ 204 μλ΅μ λν΄ ν΄λΉ ν€λλ₯Ό 곡ν΅μΌλ‘ μ€μ ν μλ μμ΅λλ€.
λλ¨Έμ§ λ§ν¬λ 300 μ΄μμ μν μ½λμμ networkError
λ₯Ό μμ±νλ―λ‘ μλ΅ κ΅¬λ¬Έ λΆμμ 2xx μν μ½λλ₯Ό μ¬λ°λ₯΄κ² μ²λ¦¬ ν μμμλ§νΌ μΆ©λΆν μ λ¬Ένλμ΄μΌν©λλ€. λ€μκ³Ό κ°μ΄ ν©λ¦¬μ μΌλ‘ μμ ν μμλ κ²λ€ μ€ :
204 μλ΅μ λ³Έλ¬Έμ΄ λΉμ΄μλ μ μΌν μλ΅μ΄μ΄μΌν©λλ€. μν μ½λλ₯Ό κ²μ¬νκ³ 204 μΌ λ κΈ°λ³Έ {}
λ°ννλ μ΅μ
μΌκΉμ? λ§€μ° κ΅¬μ²΄μ μΈ μ£μ§ μΌμ΄μ€μ λν ν
μ€νΈμ΄κΈ°λνμ§λ§ λΌμ΄λΈλ¬λ¦¬κ° HTTP νμ€μλ³΄λ€ μ μ€μνλλ‘ λ§λ€ μ μμ΅λλ€.
@fbartho μ΄λ¬ν μ κ·Ό λ°©μ μ€ νλλ₯Ό μ νΈν©λκΉ? μ΄ μ΅μ μ€ νλ λλ κ·Έ μ‘°ν©μ΄ ν©λ¦¬μ μΌλ‘ λ€λ¦¬λ©΄ PRμ ν κ²μ λλ€.
μ¬κΈ°μ μ€κ° κΈΈμ΄ μμκΉμ? λ κ°μ§ νλμ λͺ¨λ μ§μν μ μμ΅λκΉ?
μ λ 204λ₯Ό κΈ°λ³Έμ μΌλ‘ {}λ‘ ν΄μνλ κ²μ 맀μ°μ§μ§ν©λλ€. λλ "null"μ΄ JSONμ λ΄μ©μ΄μλ μλ―Έμ ν΄λΉνλ nullλ‘ κ°μ£Όλ©λκΉ?
λΉ λ³Έλ¬Έμ μ
μ€νΈλ¦Ό GraphQL ν΄μμ΄ μλνλ €λ©΄ {}
λ₯Ό λ°νν΄μΌν©λλ€.
data: {
__typename: "...",
NoResponse: null,
}
"λ νλμ΄ λͺ¨λ μ§μ λ μ μμ΅λκΉ?"λΌκ³ λ§νλ©΄ 204 μν μ½λλ₯Όλ³΄κ³ ν€λλ₯Όλ³΄κ³ μλ€λ λ»μ
λκΉ? Content-Length
κ° μ€μ λ‘ μ‘΄μ¬νκ³ 0
μμ λμ΄λ₯Ό λΉ λ³Έλ¬Έμ λ λ€λ₯Έ νμλ‘ μ·¨νκ³ κΈ°λ³Έκ°μ λ°ν ν μ μμ΅λλ€.
μ΄μ μ Content-Type
ν€λλ₯Ό μ μνμ§λ§ json
μ΄μΈμ κ²μΌλ‘ μ€μ λμμ λ μνν΄μΌ ν μμ
μ λν΄ μ νν μ μ μμ΅λλ€. μ΄ ν€λλ₯Ό ν΄μνλ €λ©΄ μ μ λ bodySerializer
κ³Ό μ μ¬ν responseSerializer
κ΅¬μ± μ΅μ
μ μ¬μ©νμ¬ μνν΄μΌ ν κ²μ
λλ€. κ·Έκ²μ μλ§λ κ³Όμμ΄λ©° νΉν λΉ λ³Έλ¬Έ λ¬Έμ λ₯Ό ν΄κ²°νμ§ λͺ»ν κ²μ
λλ€.
204 λ° Content-Length ꡬνμ μννκ²λμ΄ κΈ°μ©λλ€.
μ§κΈκΉμ§ μ΄μ μ μ‘°μΈμ λ°λκ³ 204 μλ΅μ μ²λ¦¬νκΈ° μν΄ μ¬μ©μ μ§μ κ°μ Έ μ€κΈ°λ₯Ό ꡬννμ΅λλ€. νμ§λ§ μ μ ν μλ΅μ λ°κΈ°κ° μ΄λ €μ μ΅λλ€. μ΄ κΈ°λ₯μ μ¦μ μ¬μ©ν μμλ μ΅μ μ΄ μμΌλ©΄ λ©μ§ κ²μ λλ€.
λΆννλ λλ μ¬μ ν JS μΈκ³λ₯Ό νμνλ λ°©λ²μ λ°°μ°κ³ μμ΅λλ€.
# 111μ ν΅ν΄ μμ λμμ΅λλ€!
λ¨! λλ¨ν κ°μ¬ν©λλ€.
μ΄μ μμ λ¬Έμ κ° νλλ§ λ¨μ μμ΅λλ€. :) λ΄ μμ μ루μ μ κ°λ° ν μ§ν λμ SharePoint Serverμ REST APIμ λ λ€λ₯Έ λ¬Έμ κ° λ°μνμ΅λλ€. νλͺ©μ μμ νλ©΄ 200 κ°μ μλ΅μ΄ νμλ©λλ€. λ³Έλ¬Έ λ΄μ© μμ :)
μ¦, "NoResponse"νκ·Έλ‘ μλ΅νλ λ³Έλ¬Έ λ΄μ©μ΄μλ κ²½μ° λμμ μ μ¬μ μΌλ‘ μΌλ°ν ν μ μμ΅λκΉ? λ΄κ° μ°©κ°νμ§ μλλ€λ©΄ ν¨μΉλ νμ¬ 204 νΉμ μ¬λ‘λ§μ λ€λ£¬λ€.
@isopterix μλ²κ° Content-Length
λ₯Ό 0μΌλ‘ μ¬λ°λ₯΄κ² μ€μ νλ©΄ 200 κ°μ μλ΅μμλ μλν΄μΌνλ©°, κ·Έ μλλ νμΈνλ κ²μ
λλ€.
νμ μ κΈ°λν©λλ€.
λ΄μ©μ΄ λΉμ΄μλ μ±κ³΅μ μΈ μλ΅μ μ²λ¦¬ν©λκΉ? λ΄μ©μ΄μλ 200μ²λΌ?
μ. μ΄λ₯Ό μν΄ λ³ν© λ μμ νλ‘κ·Έλ¨μ 204 μν λλ Content-Length: 0
ν€λλ₯Ό νμΈνκ³ λΉ κ°μ²΄λ₯Ό λ°νν©λλ€.
Content-Length
ν€λκ°μλ 200 κ°μ λΉ μλ΅μ΄μλ κ²½μ° λ³Έλ¬Έμ΄μ΄ κ²μ¬λ₯Ό μν΄ κ΅¬λ¬Έ λΆμλμ§ μμΌλ―λ‘ μλνμ§ μμ΅λλ€.
@isopterix μ΄κ²μ΄ μλνλμ§ νμΈν μ μμ΅λκΉ? λλ 200 μνμ Content-Length: 0
μμ£Όλ λμ°λ³μ΄λ₯Ό μλνκ³ μμ΅λλ€. κ·Έλ¬λ μ¬μ ν Network error: Unexpected end of JSON input
λ°κ³ μμ΅λλ€. λ²μ 0.7.0μ μ¬μ©νκ³ μμ΅λλ€.
λ΄ λΈλΌμ°μ κ° μ€μ λ‘ ν€λλ₯Ό νμνλ λμ apollo-link-rest
λλ²κΉ
ν λ μλ΅ ν€λκ° λΉμ΄μλ κ²μ νμΈνμ΅λλ€. apollo-link-rest
λ μλ΅ κ°μ²΄μ ν€λλ₯Ό μ‘°μ / μ¬μ€μ ν©λκΉ?
Apollo-link-restλ @dljcollette μλ΅ ν€λλ₯Ό μ‘°μνμ§ μμ΅λλ€! λμμ΄λλ ν¬λ§
λλ κ°μ μ€λ₯λ₯Ό λ§λλ€
λ³Έλ¬Έμ΄ λΉμ΄μλ μν 200μ λν ν΄κ²° λ°©λ²μ΄ μμ΅λκΉ?
@thomaszdxsn μ΄λ₯Ό μμ©νλ μ μΌν λ°©λ²μ res.json()
λμ res.text()
μ¬μ©νκ³ JSON.parse()
ꡬ문 λΆμνκΈ° μ μ μ ν¨ν JSONμ νμΈνλ κ²μ
λλ€. μ¦, μ€νΈλ¦¬λ° JSON ꡬ문 λΆμμ΄ λμ¨ν΄ μ§λ―λ‘ μν ν κ°λ₯μ±μ΄ μμ΅λλ€.
κ°μ₯ μ’μ ν΄κ²°μ± μ APIλ₯Ό λ³κ²½νμ¬ λ³Έλ¬Έμ΄ λΉμ΄μμ λ μλ―Έ μ μ¬λ°λ₯Έ μν μ½λ 204λ₯Ό μ¬μ©νκ±°λ 200 μλ΅ λ³Έλ¬Έμ 무μΈκ°λ₯Ό λ°ννλ κ²μ λλ€. μλ΅ λ³Έλ¬Έμ μ ν¨ν JSON μΈ κ²μ΄ μμΌλ©΄ λΉ JSON μΈμ½λ© κ°μ²΄λ μλ ν κ²μ΄λΌκ³ μκ°ν©λλ€.
μ€μ λ‘ APIλ₯Ό λ³κ²½ν μμλ κ²½μ° μ¬μ©μ μ§μ fetch
ν¨μλ₯Ό apollo-link-rest
μ μ λ¬ν μ μμ΅λλ€. κ²°κ΅ ALRμ μ²λ¦¬νκΈ° μν΄ λ°ννκΈ° μ μ μλ΅μ κ²μ¬νκ³ λ³κ²½ν μ μμ΅λλ€. ν΄νΉμ΄ λ μ μμ§λ§ λΉμ μκ²λ ν¨κ³Όκ°μμ μ μμ΅λλ€.
λλ λ€μ APIκ° μλ΅μ Content-length: 0
ν€λλ₯Ό λ°ννλμ§ νμΈν©λλ€.
κ°μ₯ μ μ©ν λκΈ
λΉ λ³Έλ¬Έμ μ μ€νΈλ¦Ό GraphQL ν΄μμ΄ μλνλ €λ©΄
{}
λ₯Ό λ°νν΄μΌν©λλ€."λ νλμ΄ λͺ¨λ μ§μ λ μ μμ΅λκΉ?"λΌκ³ λ§νλ©΄ 204 μν μ½λλ₯Όλ³΄κ³ ν€λλ₯Όλ³΄κ³ μλ€λ λ»μ λκΉ?
Content-Length
κ° μ€μ λ‘ μ‘΄μ¬νκ³0
μμ λμ΄λ₯Ό λΉ λ³Έλ¬Έμ λ λ€λ₯Έ νμλ‘ μ·¨νκ³ κΈ°λ³Έκ°μ λ°ν ν μ μμ΅λλ€.μ΄μ μ
Content-Type
ν€λλ₯Ό μ μνμ§λ§json
μ΄μΈμ κ²μΌλ‘ μ€μ λμμ λ μνν΄μΌ ν μμ μ λν΄ μ νν μ μ μμ΅λλ€. μ΄ ν€λλ₯Ό ν΄μνλ €λ©΄ μ μ λbodySerializer
κ³Ό μ μ¬νresponseSerializer
κ΅¬μ± μ΅μ μ μ¬μ©νμ¬ μνν΄μΌ ν κ²μ λλ€. κ·Έκ²μ μλ§λ κ³Όμμ΄λ©° νΉν λΉ λ³Έλ¬Έ λ¬Έμ λ₯Ό ν΄κ²°νμ§ λͺ»ν κ²μ λλ€.204 λ° Content-Length ꡬνμ μννκ²λμ΄ κΈ°μ©λλ€.