VBA를 사용하여 Excel에서 서버로 HTTP POST 요청을 보내려면 어떻게해야합니까?


답변:


147
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send("")

또는 HTTP 요청을보다 강력하게 제어하기 위해 WinHttp.WinHttpRequest.5.1대신 사용할 수 있습니다 MSXML2.ServerXMLHTTP.


9
대신 "MSXML2.ServerXMLHTTP"의 "WinHttp.WinHttpRequest.5.1"사용할 수있는 HTTP 요청을보다 제어
매튜 머독

5
"POST"를 "PUT"으로 변경하여이를 사용하여 HTTP PUT을 발행 할 수도 있습니다. PUT의 내용은 .send () 메서드에 들어갑니다. 설정해야 할 추가 헤더는 User-Agent 예제에 사용 된 구문에 따라 수행 할 수도 있습니다.
radicand

7
Sub의 반환 값을 사용하지 않으면 매개 변수 주위에 괄호를 사용하지 마십시오. VBA 구문은 Sub 매개 변수 주위에 괄호를 사용할 수 없으므로 (함수에는 필요하지만)이 괄호는 실제로 연산자 우선 순위를 명확하게하는 데 사용되는 산술 괄호입니다. 오해의 소지가 있거나 불분명 한 것 외에도 인수가 객체 인 경우 런타임 오류가 발생할 수 있습니다. 명시 적으로 요청하지는 않았지만 일반적으로 HTTP 응답을 사용하려고합니다 objHTTP.responseText.
Leviathan

4
괄호가 실제로 더보다 할 @Leviathan : 그들은 VBA 런타임 만들 값으로 표현식을 평가 하고, 메소드로 ByVal로 전달 에 관계없이 메서드의 서명이 말한다 있는지의 ByRef여부. 그렇기 때문에 기본 멤버가없는 유형의 객체 변수와 함께 사용하면 런타임 오류가 발생합니다. 기본 멤버 있는 개체에서이를 사용 하면 실제 개체 대신 해당 기본 멤버의 값을 전달합니다.
Mathieu Guindon

1
백만 번 감사합니다. 다른 예에서는 볼 수 없었기 때문에 이유를 모르겠지만 "User-Agent"헤더는 나에게 매우 중요했습니다. 그렇지 않으면 본문이 요청에 전송되지 않았기 때문입니다.
redOctober3

51

Mac과 Windows 모두에서 작동하려면 QueryTable을 사용할 수 있습니다.

With ActiveSheet.QueryTables.Add(Connection:="URL;http://carbon.brighterplanet.com/flights.txt", Destination:=Range("A2"))
    .PostText = "origin_airport=MSN&destination_airport=ORD"
    .RefreshStyle = xlOverwriteCells
    .SaveData = True
    .Refresh
End With

노트:

  • 출력에 관해서 ... VBA 함수를 호출 한 동일한 셀에 결과를 반환 할 수 있는지 여부를 알 수 없습니다. 위의 예에서 결과는 A2에 기록됩니다.
  • 입력과 관련하여 ... 특정 셀을 변경할 때 결과를 새로 고치려면 해당 셀이 VBA 함수의 인수인지 확인하십시오.
  • VBA가없는 Mac 2008 용 Excel에서는 작동하지 않습니다. Mac 용 Excel 2011은 VBA를 다시 얻었습니다.

자세한 내용은 " Excel의 웹 서비스 사용 "에 대한 전체 요약을 볼 수 있습니다 .


3
+1 : Windows에서만 필요하지만 크로스 플랫폼 솔루션은 다른 사람에게 도움이 될 수 있습니다.
Matthew Murdoch

실제로 HTML 코드에 액세스 할 수 있다고 생각하지 않습니다. 실제 HTML 코드가 아닌 렌더링 된 웹 페이지에서만 정보를 얻을 수 있습니다.
user1493046

1
크로스 플랫폼 솔루션의 경우 +1, 요점 링크를 포함한 전체 요약의 경우 +1 (가능한 경우). 감사!!
airstrike

Windows와 Mac을 모두 지원해야했으며이 솔루션이 제대로 작동했습니다! PostText를 지정할 때 URL은 POST 요청을 처리하고 그렇지 않으면 GET 요청을 처리해야합니다.
amolk

1
결과를 Range 대신 변수로 출력 할 수 있습니까? Json 파싱을 수행해야합니다.
Stanislasdrg Reinstate Monica

42

Bill the Lizard 의 답변 외에도 :

대부분의 백엔드는 원시 게시물 데이터를 구문 분석합니다. 예를 들어 PHP에서는 $_POST게시물 데이터 내의 개별 변수가 저장 되는 배열 이 있습니다. 이 경우 추가 헤더를 사용해야합니다 "Content-type: application/x-www-form-urlencoded".

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHTTP.send ("var1=value1&var2=value2&var3=value3")

그렇지 않으면 변수에 대한 원시 게시물 데이터를 읽어야합니다 "$HTTP_RAW_POST_DATA".


1
중괄호와 함께이 요청을 게시하려고하는데 컴파일 오류가 발생했습니다 ... "{"request ": {"carName ":"Honda ","model ":"1A5 "}}"
피들

6

ServerXMLHTTP대한 참조를 추가하여 VBA 프로젝트에서 사용할 수 있습니다 MSXML.

  1. VBA 편집기를 엽니 다 (일반적으로 매크로를 편집하여)
  2. 사용 가능한 참조 목록으로 이동
  3. Microsoft XML 확인
  4. 확인을 클릭하십시오.

( VBA 프로젝트 내 MSXML 참조 에서 )

ServerXMLHTTP의 MSDN 문서는 모든 속성과 ServerXMLHTTP의 방법에 대한 자세한 내용이 있습니다.

간단히 말해 기본적으로 다음과 같이 작동합니다.

  1. 원격 서버에 연결하기위한 open 메소드 호출
  2. 요청을 보내 려면 send를 호출 하십시오.
  3. responseXML , responseText , responseStream 또는 responseBody 를 통해 응답을 읽으십시오.

1
이 링크는 VBA가 아닌 jscript를 사용합니다
John Henckel

1
@JohnHenckel에게 감사합니다. 해당 답변을 최신 상태로 유지하기 위해 몇 가지 사항을 변경했습니다.
Mark Biek

3

다른 사용자의 응답을 완료하려면 다음을 수행하십시오.

이를 위해 "WinHttp.WinHttpRequest.5.1" 개체를 만들었습니다 .

VBA를 사용하여 Excel에서 일부 데이터로 게시물 요청을 보내십시오.

Dim LoginRequest As Object
Set LoginRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
LoginRequest.Open "POST", "http://...", False
LoginRequest.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
LoginRequest.send ("key1=value1&key2=value2")

VBA를 사용하여 Excel에서 토큰 인증으로 요청을 보냅니다.

Dim TCRequestItem As Object
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
TCRequestItem.Open "GET", "http://...", False
TCRequestItem.setRequestHeader "Content-Type", "application/xml"
TCRequestItem.setRequestHeader "Accept", "application/xml"
TCRequestItem.setRequestHeader "Authorization", "Bearer " & token
TCRequestItem.send

데이비드, 일단 요청을 보내면 응답을 어떻게 읽습니까?
ps0604

응답은 안에 TCRequestItem Object있습니다. TCRequestItem.ResponseText다음 과 같이 읽을 수 있습니다.TCRequestItem.send
David Q

0

MSXML 라이브러리를 사용하기 전에 XMLHttpRequest 객체를 사용하기 전에이 작업을 수행했습니다 ( 여기 참조) .


1
파일을 찾을 수 없습니다.
SuShuang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.