복붙노트

[SPRING] 봄 통합 - HTTP 아웃 바운드 게이트웨이와 POST 매개 변수를 전송하는 방법

SPRING

봄 통합 - HTTP 아웃 바운드 게이트웨이와 POST 매개 변수를 전송하는 방법

나는 봄 통합과 HTTP 아웃 바운드 게이트웨이를 사용하여 정말 간단 HTTP의 POST 예를 함께 넣어 노력하고있어. 내가 곱슬 곱슬와 마찬가지로, 일부 POST 매개 변수와 HTTP의 POST 메시지를 보낼 수 있어야합니다 :

$ curl -d 'fName=Fred&sName=Bloggs' http://localhost

나는 인터페이스 메소드의 인수로 간단한 문자열을 보낼 경우합니다 (POST 매개 변수없이) 작업을 얻을 수 있지만, 나는 POJO의 각 속성이 POST 매개 변수가되는 POJO를 보내야합니다.

나는 다음과 같은 SI의 설정을 가지고 :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:int="http://www.springframework.org/schema/integration"
   xmlns:int-http="http://www.springframework.org/schema/integration/http"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http.xsd">

    <int:gateway id="requestGateway"
             service-interface="RequestGateway"
             default-request-channel="requestChannel"/>

    <int:channel id="requestChannel"/>

    <int-http:outbound-gateway request-channel="requestChannel"
                           url="http://localhost"
                           http-method="POST"
                           expected-response-type="java.lang.String"/>

</beans>

내 RequestGateway 인터페이스는 다음과 같습니다 :

public interface RequestGateway {
    String echo(Pojo request);
}

내 뽀조 클래스는 다음과 같습니다 :

public class Pojo {
    private String fName;
    private String sName;

    public Pojo(String fName, String sName) {
        this.fName = fName;
        this.sName = sName;
    }

    .... getters and setters
}

그리고 내 클래스는이 같은 모습을 모두 킥오프 :

public class HttpClientDemo {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("/si-email-context.xml");
        RequestGateway requestGateway = context.getBean("requestGateway", RequestGateway.class);

        Pojo pojo = new Pojo("Fred", "Bloggs");
        String reply = requestGateway.echo(pojo);
        System.out.println("Replied with: " + reply);
    }
}

나는 위 실행하면, 내가 얻을 :

org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [Pojo] and content type [application/x-java-serialized-object]

나는 이것에 대한 많은 검색 좀했지만, 아웃 바운드 게이트웨이와 HTTP의 POST 매개 변수를 전송의 예를 찾을 수 없습니다 (I는 HTTP 헤더를 설정하는 방법에 대한 많이 찾을 수 있지만, 내가 여기 할 노력하고있어이 아니다) HTTP-아웃 바운드에 게시 요청 매개 변수를 전달하는 방법을하지만 영업 이익은 내가하지 오전 자신의 POJO의 JSON 표현을 보내려고되면서 약간 다른 사용 사례 및 응답 회담입니다 : 내가 발견했던 유일한 것은 봄 통합했다 헤더를 설정에 대한 매개 변수를 게시하지.

이것에 어떤 도움을 아주 많이 주시면 감사하겠습니다; 감사 나단

해결법

  1. ==============================

    1.콘텐츠 유형에 관한 @ jra077에서 포인터 덕분에,이 내가 그것을 해결하는 방법입니다.

    콘텐츠 유형에 관한 @ jra077에서 포인터 덕분에,이 내가 그것을 해결하는 방법입니다.

    내 SI의 설정은 이제 다음과 같습니다 - 중요한 비트가 Content-Type 헤더를 추가했다 :

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:int="http://www.springframework.org/schema/integration"
       xmlns:int-http="http://www.springframework.org/schema/integration/http"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
        http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http.xsd">
    
        <int:gateway id="requestGateway"
                 service-interface="RequestGateway"
                 default-request-channel="requestChannel">
            <int:method name="sendConfirmationEmail">
                <int:header name="Content-Type" value="application/x-www-form-urlencoded"/>
            </int:method>
        </int:gateway>
    
        <int:channel id="requestChannel"/>
    
        <int-http:outbound-gateway request-channel="requestChannel"
                               url="http://localhost"
                               http-method="POST"
                               expected-response-type="java.lang.String"/>
    
    </beans>
    

    그리고 나는 그것이 오히려 POJO 이상의 인수가있어 같은 맵을 내 인터페이스를 변경 :

    public interface RequestGateway {
        String echo(Map<String, String> request);
    }
    

    POJO와 자체는 이전과 남아있다; 이지도를 생성하고 전달하도록하고 서비스를 호출하는 클래스가 변경됩니다 :

    public class HttpClientDemo {
    
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("/si-email-context.xml");
            RequestGateway requestGateway = context.getBean("requestGateway", RequestGateway.class);
    
            Pojo pojo = new Pojo("Fred", "Bloggs");
    
            Map<String, String> requestMap = new HashMap<String, String>();
            requestMap.put("fName", pojo.getFName());
            requestMap.put("sName", pojo.getSName());
    
            String reply = requestGateway.echo(requestMap);
            System.out.println("Replied with: " + reply);
        }
    }
    

    나는지도로 POJO를 변환하는 몇 가지 더 우아한 방법이 확신하지만, 당분간이 내 질문에 대답을 제공합니다.

    당신이 응용 프로그램에 콘텐츠 형식 / x-www-form-urlencoded를 설정할 필요가 HTTP 아웃 바운드 게이트웨이와 POST 매개 변수를 보내고 당신은 키의지도를 전달해야하기 / 값 쌍.

  2. from https://stackoverflow.com/questions/30500397/spring-integration-how-to-send-post-parameters-with-http-outbound-gateway by cc-by-sa and MIT license