繁体   English   中英

来自 RestTemplate java 的 azure 逻辑应用程序的调用请求触发器 url

[英]calling request trigger url of azure logic app from RestTemplate java

我有带有请求触发器的 Azure 逻辑应用程序。 我想从我的 java 应用程序中触发这个逻辑应用程序。 所以,我试图从我的 java API 调用请求触发器 url。

如果我使用 DefaultHttpClient 但在 java 中使用 RestTemplate 调用它时得到 401,它工作正常。

DefaultHttpClient 代码:

try {
    DefaultHttpClient httpClient = new DefaultHttpClient();

    HttpGet getRequest = new HttpGet(
        "{url of azure logic app trigger}");

    //StringEntity input = new StringEntity("{\"qty\":100,\"name\":\"iPad 4\"}");
    //input.setContentType("application/json");
    //postRequest.setEntity(input);

    HttpResponse response = httpClient.execute(getRequest);

    BufferedReader br = new BufferedReader(
                    new InputStreamReader((response.getEntity().getContent())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        System.out.println(output);
    }


    httpClient.getConnectionManager().shutdown();
    return("Success");
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    return("Error");
} catch (UnsupportedOperationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    return("Error");
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    return("Error");
}

休息模板代码

@Service
public class SampleService {
@Autowired HttpClientService<String, String> httpClientService;
public String callURL() {
ResponseErrorHandler responseErrorHandler = new ResponseErrorHandler() {

    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        System.out.print(response.toString());
        return false;
    }

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        // TODO Auto-generated method stub
    }
};
UriComponentsBuilder builder = UriComponentsBuilder
        .fromUriString("{logic app url}")
        // Add query parameter
        .queryParam("api-version", {api-version})
        .queryParam("sp", {sp})
        .queryParam("sv", {sv})
        .queryParam("sig",{sig});

RequestDetailsDAO requestDetails = new RequestDetailsDAO(builder.build().toUri().toString(), HttpMethod.GET);
String response = httpClientService.execute(requestDetails, null, responseErrorHandler, String.class);
return response.toString();

HttpClientService.java

@Service
public class HttpClientService<T, V>  {
public RestTemplate restTemplate;

public HttpClientService(RestTemplateBuilder restTemplateBuilder) {
    this.restTemplate = restTemplateBuilder.setConnectTimeout(Duration.ofSeconds(5)).setReadTimeout(Duration.ofSeconds(5)).build();
}

public V execute(RequestDetailsDAO requestDetails, HttpEntity<T> entity, ResponseErrorHandler errorHandler,
                 Class<V> genericClass) {

    restTemplate.setErrorHandler(errorHandler);

    ResponseEntity<V> response = restTemplate.exchange(requestDetails.getUrl(), requestDetails.getRequestType(), entity, genericClass);
    return response.getBody();
}
}

请求详情DAO.java

public class RequestDetailsDAO {
private String url;
private HttpMethod requestType;

public RequestDetailsDAO(String url, HttpMethod requestTyp) {
    super();
    this.url = url;
    this.requestType = requestTyp;
}
public String getUrl() {
    return url;
}
public void setUrl(String url) {
    this.url = url;
}
public HttpMethod getRequestType() {
    return requestType;
}
public void setRequestType(HttpMethod requestType) {
    this.requestType = requestType;
}

@Override
public String toString() {
    return "RequestDetails [url=" + url + ", requestType=" + requestType + "]";
}
}

请尝试使用带有 RestTemplate 的简单独立代码并检查。 我提供了下面的小片段。

try {
    ResponseEntity<ResponseVO> response = restTemplate.exchange({uri of azure logic app trigger}, HttpMethod.GET, request, ResponseVO.class);
} catch (HttpStatusCodeException ex) {
    int statusCode = ex.getStatusCode().value();
    System.out.println("Status Code :"+statusCode);
    ResponseEntity<?> resEntity = ResponseEntity.status(ex.getRawStatusCode()).headers(ex.getResponseHeaders())
                .body(ex.getResponseBodyAsString())
}

这里的ResponseVO.class是要映射到object的Response,在这种情况下,您可以设置自己的class。 在这个 catch 块中,您可以找到异常详细信息。

因此,使用 RestTemplate 调用 LogicApp 似乎没有什么特别之处。 只是 RestTemplate 默认 URL 对参数中给出的 Uri 进行编码,而 DefaultHttpClient 没有 - 参考: apache vs resttemplate

在 LogicApp URL 的情况下,有这个“sp”参数已经是 URL 结束编码,当你从 LogicApp -“%2Ftriggers%2Fmanual%2Frun”复制它时,所以你需要解码并通过“/手动/触发” " 到 UriComponentsBuilder。 然后它就起作用了。

我的代码:

    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<Object> request = new HttpEntity<>(requestDto, headers);

    UriComponentsBuilder builder = UriComponentsBuilder
            .fromUriString("https://prod-123901.westeurope.logic.azure.com:443/workflows/<workflow_id>/triggers/manual/paths/invoke")
            .queryParam("api-version", "2016-10-01")
            .queryParam("sp", "/triggers/manual/run")
            .queryParam("sv", "1.0")
            .queryParam("sig", "<your_sig>");
    restTemplate.exchange(builder.build().toUri().toString(), HttpMethod.POST, request, Void.class);

更新:

requestDto 这里是您的自定义 dto object 进入 HTTP 主体,例如 object 的 ZA2F2ED4F8EBC2CBBDZC21:

public class RequestDto {
    private String id;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM