我們的應用程序是基於java的web應用程序。 在這種情況下,我們無法直接訪問第三方api https://api.twilio.com 這必須通過代理完成。 誰能告訴我如何爲TwilioRestClient實現它?如何使用twilio在java代理中工作
2
A
回答
4
您可以使用TwilioRestClient
的.getHttpClient()
方法和設置代理的參數是這樣的:
final TwilioRestClient client = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN);
client.getHttpClient().getHostConfiguration().setProxy(PROXY_HOST, PROXY_PORT);
3
我知道這是你晚了,但我一直在它周圍的工作,因爲直接設置連接參數到Apache的HttpClient現在已被棄用。這一切都是通過建造者和工廠完成的。這是我用Apache httpcomponents 4.3.4完成的:
HttpHost proxy = new HttpHost(PROXY_HOST, PROXY_PORT, "http");
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
new UsernamePasswordCredentials(ACCOUNT_SID, ACCOUNT_TOKEN)
);
CloseableHttpClient httpClient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.setDefaultCredentialsProvider(credentialsProvider)
.build();
TwilioRestClient client = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN);
client.setHttpclient(httpClient);
//do your regular stuff with this client
希望它有幫助。
2
如果您使用上述7.0.0或最新的罐子Twilio也提供了自己的HttpClient,請按照下列步驟操作,
1)你需要創建一個擴展com.twilio.http.HttpClient
您customHttpProxy類import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import com.google.common.collect.Lists;
import com.twilio.Twilio;
import com.twilio.exception.ApiException;
import com.twilio.http.HttpClient;
import com.twilio.http.HttpMethod;
import com.twilio.http.Request;
import com.twilio.http.Response;
import XXXX.XXX.twilio.util.TwilioUtil;
public class CustomNetworkClient extends HttpClient {
private static final int CONNECTION_TIMEOUT = 5000;
private static final int SOCKET_TIMEOUT = 5000;
private static final int CONNECTIONS_PER_ROUTE = 10;
private org.apache.http.client.HttpClient client;
private String twilioRequestId;
private Float twilioResponseDuration;
/**
* Create a new HTTP Client.
* @throws Exception
*/
public CustomNetworkClient() throws Exception {
this.invokeHttpProxy();
}
/**
* Make a request.
*
* @param request request to make
* @return Response of the HTTP request
*/
public Response makeRequest(final Request request) {
twilioResponseDuration = null;
twilioRequestId = null;
RequestBuilder builder = RequestBuilder.create(request.getMethod().toString())
.setUri(request.constructURL().toString())
.setVersion(HttpVersion.HTTP_1_1)
.setCharset(StandardCharsets.UTF_8);
if (request.requiresAuthentication()) {
builder.addHeader(HttpHeaders.AUTHORIZATION, request.getAuthString());
}
HttpMethod method = request.getMethod();
if (method == HttpMethod.POST) {
builder.addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
for (Map.Entry<String, List<String>> entry : request.getPostParams().entrySet()) {
for (String value : entry.getValue()) {
builder.addParameter(entry.getKey(), value);
}
}
}
try {
HttpResponse response = client.execute(builder.build());
if (response.containsHeader("Twilio-Request-Id"))
twilioRequestId = response.getFirstHeader("Twilio-Request-Id").getValue();
if (response.containsHeader("Twilio-Request-Duration"))
twilioResponseDuration = new Float(response.getFirstHeader("Twilio-Request-Duration").getValue());
return new Response(
response.getEntity() == null ? null : response.getEntity().getContent(),
response.getStatusLine().getStatusCode()
);
} catch (IOException e) {
throw new ApiException(e.getMessage());
}
}
public String getTwilioRequestId() {
return twilioRequestId;
}
public Float getTwilioResponseDuration() {
return twilioResponseDuration;
}
public void invokeHttpProxy()throws Exception {
HttpHost proxy = new HttpHost("YOUR_PROXY_HOST", YOUR_PROXY_PORT, "http");
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
//Set up Twilio user credentials
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope("api.twilio.com", 443),
new UsernamePasswordCredentials(TwilioUtil.ACCOUNT_SID, TwilioUtil.AUTH_TOKEN));
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(CONNECTION_TIMEOUT)
.setSocketTimeout(SOCKET_TIMEOUT)
.build();
Collection<Header> headers = Lists.<Header>newArrayList(
new BasicHeader("X-Twilio-Client", "java-" + Twilio.VERSION),
new BasicHeader(HttpHeaders.USER_AGENT, "twilio-java/" + Twilio.VERSION + " (" + Twilio.JAVA_VERSION + ")"),
new BasicHeader(HttpHeaders.ACCEPT, "application/json"),
new BasicHeader(HttpHeaders.ACCEPT_ENCODING, "utf-8")
);
client = HttpClientBuilder.create().setRoutePlanner(routePlanner)
.setDefaultCredentialsProvider(credsProvider)
.setConnectionManager(new PoolingHttpClientConnectionManager())
.setDefaultRequestConfig(config)
.setDefaultHeaders(headers)
.setMaxConnPerRoute(CONNECTIONS_PER_ROUTE)
.build();
}
}
2)分別向Twilio和TwilioRestClient注入自定義類。
CustomNetworkClient newHttpClient = new CustomNetworkClient();
Twilio.init(TwilioUtil.ACCOUNT_SID, TwilioUtil.AUTH_TOKEN);
TwilioRestClient client = new TwilioRestClient.Builder(TwilioUtil.ACCOUNT_SID, TwilioUtil.AUTH_TOKEN).httpClient(newHttpClient)
.build();`enter code here`
Twilio.setRestClient(client);
希望這對您的傢伙有所幫助。
0
非常感謝前面的內容。我寫了一個更高雅類比ustomNetworkClient
import com.twilio.http.NetworkHttpClient;
import lombok.RequiredArgsConstructor;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
public class ProxyAuthenticateHttpClient extends NetworkHttpClient {
private ProxyAuthenticateHttpClient(HttpClientBuilder clientBuilder) {
super(clientBuilder);
}
@RequiredArgsConstructor
public static class Builder {
public ProxyAuthenticateHttpClient build() {
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
clientBuilder.useSystemProperties();
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(CONNECTION_TIMEOUT)
.setSocketTimeout(SOCKET_TIMEOUT)
.build();
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(proxyHost, proxyPort),
new UsernamePasswordCredentials(proxyUser, proxyPassword));
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setDefaultMaxPerRoute(10);
connectionManager.setMaxTotal(10*2);
clientBuilder
.setConnectionManager(connectionManager)
.setDefaultCredentialsProvider(credsProvider)
.setDefaultRequestConfig(config);
return new ProxyAuthenticateHttpClient(clientBuilder);
}
private final String proxyHost;
private final int proxyPort;
private final String proxyUser;
private final String proxyPassword;
private static final int CONNECTION_TIMEOUT = 10000;
private static final int SOCKET_TIMEOUT = 30500;
}
}
然後使用下面的代碼初始化Twilio,一切都OK
Twilio.init(username, password);
TwilioRestClient.Builder builder = new TwilioRestClient.Builder(username, password);
builder.httpClient(new ProxyAuthenticateHttpClient.Builder(proxyUser, proxyPort, proxyUser, proxyPassword).build());
Twilio.setRestClient(builder.build());
相關問題
- 1. 如何在scala中使用java代理
- 2. 如何在C#中使用Java代理?
- 3. Twilio網站如何工作?
- 4. 從代理髮送使用Twilio API-java的SMS
- 5. Nginx代理如何工作
- 6. http代理如何工作?
- 7. jQuery代理如何工作
- 8. Browsermob代理如何使它與硒網格工作? 【JAVA]
- 9. 如何使用Python向Twilio API提供代理信息
- 10. Web代理如何在內部工作?
- 11. 使用Twilio下載Twilio Recording作爲InputStream Java Sdk v7.x
- 12. 使用PHP不工作的Twilio AccessToken
- 13. 如何使我的代碼在使用Java中的Swing的GUI中工作?
- 14. 如何使代理在系統會話中工作?
- 15. 在java中如何工作?
- 16. twilio不在asp工作mvc
- 17. 所有的clojure代碼都在java代理中工作嗎?
- 18. 如何在Google AppEngine中使用GWT的Twilio(Java)
- 19. 如何在Angular 2中使用Twilio Client?
- 20. Twilio TaskRouter不工作
- 21. 引用在Java中如何工作?
- 22. 如何在Java應用程序中使用RabbitMQ代理
- 23. twilio-csharp在Mono中工作嗎?
- 24. 如何在drools工作臺中創建的規則中使用java代碼
- 25. 通過Twilio代理電話
- 26. 碼頭和Java代理不工作使用日誌記錄
- 27. Spring java配置EJB代理不工作
- 28. 在Firefox中使用Java HTTP代理
- 29. 在Java中使用SSL的HTTP代理
- 30. Java的動態代理如何實際工作?