JavaScript HTTP 어댑터

improve this page | report issue

개요

HTTP 어댑터를 사용하여 GET 또는 POST HTTP 요청을 보내고 데이터를 응답 헤더와 본문에서 검색할 수 있습니다. HTTP 어댑터는 RESTful 및 SOAP 기반 서비스에서 작동하며 구조화된 HTTP 소스(예: RSS 피드)를 읽을 수 있습니다.

단순한 서버 측 JavaScript 코드를 사용하여 HTTP 어댑터를 쉽게 사용자 정의할 수 있습니다. 예를 들어, 필요한 경우 서버 측 필터링을 설정할 수 있습니다. 검색된 데이터는 XML, HTML, JSON 또는 일반 텍스트 형식으로 되어 있습니다.

어댑터는 어댑터 특성과 프로시저를 정의하기 위해 XML으로 구성됩니다.
선택적으로 수신한 레코드와 필드를 필터링하기 위해 XSL을 사용할 수도 있습니다.

전제조건: JavaScript 어댑터 학습서를 먼저 읽으십시오.

XML 파일

XML 파일은 설정과 메타데이터를 포함합니다.
어댑터 XML 파일을 편집하려면 다음을 수행해야 합니다.

  • 프로토콜을 HTTP 또는 HTTPS로 설정하십시오.
  • HTTP 도메인을 HTTP URL의 도메인 파트로 설정하십시오.
  • TCP 포트를 설정하십시오.

connectivity 요소 아래에 필수 프로시저를 선언하십시오.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<mfp:adapter name="JavaScriptHTTP"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mfp="http://www.ibm.com/mfp/integration"
	xmlns:http="http://www.ibm.com/mfp/integration/http">

	<displayName>JavaScriptHTTP</displayName>
	<description>JavaScriptHTTP</description>
	<connectivity>
		<connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
			<protocol>https</protocol>
			<domain>mobilefirstplatform.ibmcloud.com</domain>
			<port>443</port>
			<connectionTimeoutInMilliseconds>30000</connectionTimeoutInMilliseconds>
			<socketTimeoutInMilliseconds>30000</socketTimeoutInMilliseconds>
			<maxConcurrentConnectionsPerNode>50</maxConcurrentConnectionsPerNode>
		</connectionPolicy>
	</connectivity>

	<procedure name="getFeed"/>
	<procedure name="getFeedFiltered"/>
</mfp:adapter>
  • xsi:type: 필수. 이 속성 값은 http:HTTPConnectionPolicyType이어야 합니다.
  • cookiePolicy: 선택사항. 이 속성은 백엔드 애플리케이션에서 도착하는 쿠키를 HTTP 어댑터에서 처리하는 방법을 설정합니다. 올바른 값은 다음과 같습니다.
    • BEST_MATCH: 기본값
    • BROWSER_COMPATIBILITY
    • RFC_2109
    • RFC_2965
    • NETSCAPE
    • IGNORE_COOKIES
    이러한 값에 대한 자세한 정보는 Apache HTTP 구성요소 페이지를 참조하십시오.
  • maxRedirects: 선택사항. HTTP 어댑터가 따를 수 있는 최대 경로 재지정 수입니다. 이 속성은 인증 실패와 같은 몇 가지 오류로 인해 백엔드 애플리케이션이 순환 경로 재지정을 전송할 때 유용합니다. 이 속성이 0으로 설정되면, 어댑터는 경로 재지정을 따르려고 전혀 시도하지 않고 HTTP 302 응답이 사용자에게 리턴됩니다. 기본값은 10입니다.
  • protocol: 선택사항. 사용할 URL 프로토콜입니다. 유효값은 다음과 같습니다. http(기본값), https.
  • domain: 필수. 호스트 주소입니다.
  • port: 선택사항. 포트 주소입니다. 포트가 지정되지 않으면 기본 HTTP/S 포트가 사용됩니다(80/443).
  • sslCertificateAlias: 정규 HTTP 인증 및 단순 SSL 인증의 경우 선택적입니다. 상호 SSL 인증의 경우 필수입니다. 어댑터 개인용 SSL 키의 별명으로, 키 저장소의 올바른 SSL 인증서에 액세스하기 위해 HTTP 어댑터 키 관리자가 사용합니다. 키 저장소 설정 프로세스에 대한 자세한 정보는 HTTP 어댑터에서 SSL 사용 학습서를 참조하십시오.
  • sslCertificatePassword: 정규 HTTP 인증 및 단순 SSL 인증의 경우선택적입니다. 상호 SSL 인증의 경우 필수입니다. 어댑터 개인용 SSL 키의 비밀번호로, 키 저장소의 올바른 SSL 인증서에 액세스하기 위해 HTTP 어댑터 키 관리자가 사용합니다. 키 저장소 설정 프로세스에 대한 자세한 정보는 HTTP 어댑터에서 SSL 사용 학습서를 참조하십시오.
  • authentication: 선택사항. HTTP 어댑터의 인증 구성입니다. HTTP 어댑터는 두 가지 인증 프로토콜 중 하나를 사용할 수 있습니다. 다음과 같이, authentication< 요소를 정의하십시오.
    • Basic authentication
      <authentication>
          <basic/>
      </authentication>
    • Digest authentication
      <authentication>
          <digest/>
      </authentication>
    • 연결 정책은 serverIdentity 요소를 포함할 수 있습니다. 이 기능은 모든 인증 스키마에 적용됩니다. 예:
      <authentication>
          <basic/>
          <serverIdentity>
              <username></username>
              <password></password>
          </serverIdentity>
      </authentication>
  • proxy: 선택사항. proxy 요소는 백엔드 애플리케이션에 액세스할 때 사용하는 프록시 서버의 세부사항을 지정합니다. 프록시 세부사항에는 프로토콜 도메인 및 포트가 포함되어야 합니다. 프록시에서 인증이 필요한 경우 proxy 안에 중첩된 authentication 요소를 추가하십시오. 이 요소는 어댑터의 인증 프로토콜을 기술할 때 사용한 것과 구조가 동일합니다. 다음 예제는 기본 인증을 요구하고, 서버 ID를 사용하는 프록시를 보여줍니다.
    <connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
      <protocol>http</protocol>
      <domain>www.bbc.co.uk</domain>
      <proxy>
        <protocol>http</protocol>
        <domain>wl-proxy</domain>
        <port>8167</port>
        <authentication>
          <basic/>
          <serverIdentity>
            <username>${proxy.user}</username>
            <password>${proxy.password}</password>
          </serverIdentity>
        </authentication>
      </proxy>
    </connectionPolicy>
  • maxConcurrentConnectionsPerNode: 선택사항. MobileFirst Server가 백엔드에 대해 열 수 있는 최대 동시 연결 수를 정의합니다. Mobile Foundation은 애플리케이션으로부터의 수신 서비스 요청 수는 제한하지 않습니다. 이는 백엔드 서비스에 대한 동시 HTTP 연결 수만 제한합니다.

    동시 HTTP 연결 수의 기본값은 50입니다. 백엔드 서비스에서 허용된 최대 요청 수 및 어댑터에 대한 예상 동시 요청 수를 기반으로 이 기본값을 변경할 수 있습니다. 또한 수신되는 동시 요청 수를 제한하기 위해 백엔드 서비스를 구성할 수도 있습니다.

    2-노드 시스템이 있으며 이 시스템에 100개의 동시 요청이 로드될 것으로 예상되고 백엔드 서비스가 지원할 수 있는 동시 요청 수는 최대 80개라고 가정합니다. maxConcurrentConnectionsPerNode를 40으로 설정할 수 있습니다. 이 설정은 백엔드 서비스에 대한 동시 요청이 최대 80개가 넘지 않게 해줍니다.

    값을 늘리면 백엔드 애플리케이션에 더 많은 메모리가 필요합니다. 메모리 문제를 피하려면 너무 높은 값을 설정하지 마십시오. 그 대신, 초당 평균 및 최대 트랜잭션 수를 예측하고 해당 평균 지속기간을 평가하십시오. 그리고 나서, 이 예에 표시된 대로 필요한 동시 연결 수를 계산하고 5-10% 여분을 추가하십시오. 그런 다음, 백엔드를 모니터하고 이 값을 필요에 따라 조정하여 백엔드 애플리케이션이 모든 수신 요청을 처리할 수 있도록 하십시오.

    어댑터를 클러스터에 배치하는 경우, 이 속성 값을 클러스터 구성원 수로 나눈 최대 필수 로드 값으로 설정하십시오.

    백엔드 애플리케이션 크기 조정 방법에 대한 자세한 정보는 확장성 및 하드웨어 크기 조정 문서 및 첨부된 하드웨어 계산기 스프레드시트를 참조하십시오.
  • connectionTimeoutInMilliseconds: 선택사항. 백엔드 연결까지의 제한시간을 설정할 수 있습니다. 이 제한시간을 설정하는 것은 HTTP 요청 호출 뒤에 특정시간이 경과한 후 제한시간 예외가 발생하는 것을 보장하지 않습니다. invokeHTTP() 함수에서 이 매개변수에 다른 값을 전달하면 여기에서 정의된 값을 대체할 수 있습니다.
  • socketTimeoutInMilliseconds: 선택사항. 연결 패킷에서 시작하여 2개의 연속 패킷 사이의 제한시간(밀리초). 이 제한시간을 설정하는 것은 HTTP 요청 호출 뒤에 특정시간이 경과한 후 제한시간 예외가 발생하는 것을 보장하지 않습니다. invokeHttp() 함수에서 socketTimeoutInMilliseconds 매개변수에 다른 값을 전달하면 여기에서 정의된 값을 대체할 수 있습니다.

JavaScript 구현

서비스 URL이 프로시저 호출에 사용됩니다. URL의 일부 파트는 상수입니다(예: http://example.com/).
URL의 다른 파트는 매개변수화될 수 있습니다. 즉, 프로시저에 제공되는 매개변수값에 의해 런타임 시 대체될 수 있습니다.

다음 URL 파트는 매개변수화될 수 있습니다.

  • 경로 요소
  • 조회 문자열 매개변수
  • 단편

HTTP 요청을 호출하려면 MFP.Server.invokeHttp 메소드를 사용하십시오.
지정할 입력 매개변수 오브젝트를 제공하십시오.

  • HTTP 메소드: GET, POST, PUT, DELETE
  • 리턴되는 컨텐츠 유형: XML, JSON, HTML 또는 plain
  • 서비스 path
  • 조회 매개변수(선택사항)
  • 요청 본문(선택사항)
  • 변환 유형(선택사항)
function getFeed() {
  var input = {
      method : 'get',
      returnedContentType : 'xml',
      path : "feed.xml"
  };


  return MFP.Server.invokeHttp(input);
}

옵션의 전체 목록은 사용자 문서의 “MFP.Server.invokeHttp”에 대한 API 참조를 참조하십시오.

XSL

변환 필터링

또한 예를 들어 데이터를 필터링하기 위해 XSL 변환을 수신 데이터에 적용할 수 있습니다.
XSL 변환을 적용하려면 JavaScript 구현 파일의 옆에 filtered.xsl 파일을 작성하십시오.

그런 다음 프로시저 호출의 입력 매개변수에서 변환 옵션을 지정할 수 있습니다. 예:

function getFeedFiltered() {

  var input = {
      method : 'get',
      returnedContentType : 'xml',
      path : "feed.xml",
      transformation : {
        type : 'xslFile',
        xslFile : 'filtered.xsl'
      }
  };

  return MFP.Server.invokeHttp(input);
}

SOAP 기반 서비스 요청 작성

MFP.Server.invokeHttp API 메소드를 사용하여 SOAP 엔벨로프를 작성할 수 있습니다.
참고: JavaScript HTTP 어댑터에서 SOAP 기반 서비스를 호출하기 위해 E4X를 사용하여 요청 본문 내 SOAP XML 엔벨로프를 암호화할 수 있습니다.

var request =
		<soap:Envelope
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
			<soap:Body>
				<GetCitiesByCountry xmlns="http://www.webserviceX.NET">
					<CountryName>{countryName}</CountryName>
				</GetCitiesByCountry>
			</soap:Body>
		</soap:Envelope>;

그런 다음 MFP.Server.invokeHttp(options) 메소드는 SOAP 서비스에 대한 요청을 호출하는 데 사용됩니다.
Options 오브젝트는 다음 특성을 포함해야 합니다.

  • method 특성: 일반적으로 POST
  • returnedContentType 특성: 일반적으로 XML
  • path 특성: 서비스 경로
  • body 특성: content(문자열로서의 SOAP XML) 및 contentType
var input = {
	method: 'post',
	returnedContentType: 'xml',
	path: '/globalweather.asmx',
	body: {
		content: request.toString(),
		contentType: 'text/xml; charset=utf-8'
	}
};

var result = MFP.Server.invokeHttp(input);

SOAP 기반 서비스의 호출 결과

결과는 JSON 오브젝트로 랩핑됩니다.

{
	"statusCode" : 200,
	"errors" : [],
	"isSuccessful" : true,
	"statusReason" : "OK",
	"Envelope" : {
		"Body" : {
			"GetWeatherResponse" : {
				"xmlns" : "http://www.webserviceX.NET",
				"GetWeatherResult" : "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<CurrentWeather>\n  <Location>Shanghai / Hongqiao, China (ZSSS) 31-10N 121-26E 3M</Location>\n  <Time>Mar 07, 2016 - 01:30 AM EST / 2016.03.07 0630 UTC</Time>\n  <Wind> from the W (270 degrees) at 4 MPH (4 KT) (direction variable):0</Wind>\n  <Visibility> 4 mile(s):0</Visibility>\n  <Temperature> 69 F (21 C)</Temperature>\n  <DewPoint> 53 F (12 C)</DewPoint>\n  <RelativeHumidity> 56%</RelativeHumidity>\n  <Pressure> 29.94 in. Hg (1014 hPa)</Pressure>\n  <Status>Success</Status>\n</CurrentWeather>"
			}
		},
		"xsd" : "http://www.w3.org/2001/XMLSchema",
		"soap" : "http://schemas.xmlsoap.org/soap/envelope/",
		"xsi" : "http://www.w3.org/2001/XMLSchema-instance"
	},
	"responseHeaders" : {
		"X-AspNet-Version" : "4.0.30319",
		"Date" : "Mon, 07 Mar 2016 06:46:08 GMT",
		"Content-Length" : "1027",
		"Content-Type" : "text/xml; charset=utf-8",
		"Server" : "Microsoft-IIS/7.0",
		"X-Powered-By" : "ASP.NET",
		"Cache-Control" : "private, max-age=0",
		"X-RBT-Optimized-By" : "e8i-wx-sh4 (RiOS 8.6.2d-ibm1) SC"
	},
	"warnings" : [],
	"totalTime" : 654,
	"responseTime" : 651,
	"info" : []
}

Envelope 특성을 참고하십시오. 이 특성은 SOAP 기반 요청에 특정합니다.
Envelope 특성은 SOAP 기반 요청의 결과 컨텐츠를 포함합니다.

XML 컨텐츠에 액세스하려면 다음을 수행하십시오.

  • 클라이언트 측에서 jQuery는 결과 문자열을 랩핑하는 데 사용될 수 있으며 DOM 노드를 따를 수 있습니다.
var resourceRequest = new WLResourceRequest(
    "/adapters/JavaScriptSOAP/getWeatherInfo",
    WLResourceRequest.GET
);

resourceRequest.setQueryParameter("params", "['Washington', 'United States']");

resourceRequest.send().then(
    function(response) {
        var $result = $(response.invocationResult.Envelope.Body.GetWeatherResponse.GetWeatherResult);
		var weatherInfo = {
			location: $result.find('Location').text(),
			time: $result.find('Time').text(),
			wind: $result.find('Wind').text(),
			temperature: $result.find('Temperature').text(),
		};
    },
    function() {
        // ...
    }
)
  • 서버 측에서 결과 문자열로 XML 오브젝트를 작성하십시오. 그런 다음 노드는 특성으로 액세스될 수 있습니다.
var xmlDoc = new XML(result.Envelope.Body.GetWeatherResponse.GetWeatherResult);
var weatherInfo = {
	Location: xmlDoc.Location.toString(),
	Time: xmlDoc.Time.toString(),
	Wind: xmlDoc.Wind.toString(),
	Temperature: xmlDoc.Temperature.toString()
};

샘플 어댑터

어댑터 Maven 프로젝트를 다운로드하려면 클릭하십시오.

샘플 사용법

Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.
Last modified on June 29, 2020