-X를 사용하면 컬에 의해 선택된 메소드 키워드를 변경할 수 있지만 컬의 동작은 수정되지 않습니다. 이것이 의미하는 바는 무엇입니까?

-X를 사용하면 컬에 의해 선택된 메소드 키워드를 변경할 수 있지만 컬의 동작은 수정되지 않습니다. 이것이 의미하는 바는 무엇입니까?

~에서https://curl.haxx.se/docs/httpscripting.html#More_on_changed_methods

다음 사항이 지적되어야 한다.컬은 요청된 작업에 따라 사용할 방법을 선택합니다.. -d는 POST를 수행하고, -I는 HEAD 등을 수행합니다.--request/-X 옵션을 사용하면 컬에 의해 선택된 메소드 키워드를 변경할 수 있지만 컬의 동작은 수정되지 않습니다. 예를 들어 -d "data"를 사용하여 POST를 수행하는 경우 -X를 사용하여 메서드를 PROPFIND로 수정할 수 있으며 컬은 여전히 ​​POST를 보내는 것으로 간주합니다. 다음과 같이 명령줄에 -X POST를 추가하면 일반적인 GET을 POST 방식으로 변경할 수 있습니다.

 curl -X POST http://example.org/

...하지만 컬은 여전히 ​​GET을 보내는 것처럼 생각하고 행동하므로 요청 본문 등을 보내지 않습니다.

  1. "curl이 요청하려는 작업에 따라 사용하는 방법을 선택합니다"에서 "작업"은 무엇을 의미합니까?
  2. "--request/-X 옵션을 사용하는 경우"는 무엇을 의미합니까?

    • "키워드 컬 선택 방법을 변경할 수 있습니다",

    • "그러나 당신은 컬의 행동을 수정하지 않을 것입니다"?

    서버가 요청을 처리하는 방법이 중요하지 않습니까? 이는 요청 메시지에 작성된 내용과 "curl이 선택한 메소드 키워드"에 따라 달라지는 것이 아닌가요?

    "컬의 행동"이란 무엇입니까? 그것은 무슨 상관이야? 요청 메시지(특히 요청 메시지의 HTTP 메소드)가 수정됩니까?

  3. 이것은 컬의 설계 오류입니까? 일관되지 않은 HTTP 메소드를 지정하도록 허용하는 목적은 무엇입니까?

    작업을 통해 암시적으로 HTTP 메서드를 지정할 수 있다면 -X를 통해 명시적으로 HTTP 메서드를 지정해야 하는 이유는 무엇입니까?

예를 들어, 인용문의 명령은 HTML 문서를 검색하는데, 이것이 GET이 수행하는 작업입니까?

$ curl --trace-ascii dump -X POST http://example.org/
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title>411 - Length Required</title>
    </head>
    <body>
        <h1>411 - Length Required</h1>
    </body>
</html>

이 명령으로 전송된 요청은 다음과 같습니다. HTTP 메소드는 서버에서 볼 수 있는 POST입니다.

== Info:   Trying 93.184.216.34...
== Info: TCP_NODELAY set
== Info: Connected to example.org (93.184.216.34) port 80 (#0)
=> Send header, 76 bytes (0x4c)
0000: POST / HTTP/1.1
0011: Host: example.org
0024: User-Agent: curl/7.58.0
003d: Accept: */*
004a: 
<= Recv header, 30 bytes (0x1e)
0000: HTTP/1.1 411 Length Required
<= Recv header, 25 bytes (0x19)
0000: Content-Type: text/html
<= Recv header, 21 bytes (0x15)
0000: Content-Length: 357
<= Recv header, 19 bytes (0x13)
0000: Connection: close
<= Recv header, 37 bytes (0x25)
0000: Date: Mon, 10 Feb 2020 12:23:42 GMT
<= Recv header, 25 bytes (0x19)
0000: Server: ECSF (nyb/1D33)
<= Recv header, 2 bytes (0x2)
0000: 
<= Recv data, 357 bytes (0x165)
0000: <?xml version="1.0" encoding="iso-8859-1"?>.<!DOCTYPE html PUBLI
0040: C "-//W3C//DTD XHTML 1.0 Transitional//EN".         "http://www.
0080: w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">.<html xmlns="http
00c0: ://www.w3.org/1999/xhtml" xml:lang="en" lang="en">..<head>...<ti
0100: tle>411 - Length Required</title>..</head>..<body>...<h1>411 - L
0140: ength Required</h1>..</body>.</html>.
== Info: Closing connection 0

감사해요.

답변1

"curl이 요청하려는 작업에 따라 사용하는 방법을 선택합니다"에서 "작업"은 무엇을 의미합니까?

바라보다HTTP 프로토콜 부분, 용어를 "정의"합니다.

HTTP는 클라이언트가 특정 작업을 요청하기 위해 서버에 보내는 일반 ASCII 텍스트 줄이며, 서버는 실제 요청된 콘텐츠를 클라이언트에 보내기 전에 몇 줄의 텍스트로 응답합니다.

작업은 데이터 검색(메서드에 해당 GET), 리소스 추가( PUT메서드), 기존 리소스에 데이터 전송( POST메서드) 등 HTTP 서버에서 요청한 모든 것입니다.

서버가 요청을 처리하는 방법이 중요하지 않습니까? 이는 요청 메시지에 작성된 내용과 "curl이 선택한 메소드 키워드"에 따라 달라지는 것이 아닌가요?

예, 하지만 전송된 전체 메시지는 선택한 방법에 설정된 기대치를 충족해야 합니다. 귀하의 예는 이를 보여줍니다. 메소드 curl에 대해 GET유효한 메시지가 생성되었지만 POST메소드를 지정하기 위해 메시지를 대체하고 생성된 메시지가 메소드에 대해 유효하지 않아 POST서버가 오류로 응답하게 됩니다.

-X옵션은 주변 동작을 변경하지 않고 메서드를 재정의합니다.

답변2

"curl이 요청하려는 작업에 따라 사용하는 방법을 선택합니다"에서 "작업"은 무엇을 의미합니까?

컬 기능을 수정하는 다양한 옵션을 의미하는 것 같습니다. 매뉴얼 페이지에서는 명시적으로 "작업"이라고 부르지 않은 것처럼 보이지만 "FOO 메소드를 사용하여 X 요청"이라고 말하면 적용되는 것 같습니다. -I/는 --head헤더만 필요하므로 , using HEAD, using 을 사용합니다 . 인용된 텍스트는 굵게 표시된 부분 다음 에 및 를 명시적으로 나타냅니다.--dataPOST--data --getGET-I-d

마지막 쌍이 중요합니다. GET데이터는 URL과 함께 전송됩니다. 즉, HTTP 요청의 콘텐츠로 전송됩니다 ...?data_here.POST

curl --data foo=bar http://host/path/to/foo.pl우리가 얻는 대로

POST /path/to/foo.pl HTTP/1.1
Content-Length: 7
Content-Type: application/x-www-form-urlencoded

foo=bar   

그리고curl --data foo=bar --get http://host/path/to/foo.pl

GET /path/to/foo.pl?foo=bar HTTP/1.1

"--request/-X 옵션을 사용하는 경우"란 무엇을 의미합니까? 컬에서 선택한 메서드 키워드를 변경할 수 있지만 컬의 동작은 수정되지 않습니다.

을 사용해 -X GET도 데이터가 이동하는 위치(또는 인코딩 방법)는 변경되지 않습니다. 를 사용하면 --data foo=bar -X GET여전히 curl실행 중이라고 생각하여 POST요청 본문에 데이터를 게시하고 간단히 메서드 이름을 바꿉니다(아래). 아마도 여기서는 작동하지 않을 것입니다. 그러나 요청 본문에 데이터가 필요한 메소드 -X XYZ인 경우 (예 : .XYZPOST

GET /path/to/foo.pl HTTP/1.1
Content-Length: 7
Content-Type: application/x-www-form-urlencoded

foo=bar  

관련 정보