我正在尝试通过Android SDK调用一个简单的API。
我已经创建了一个应用程序服务,由于我在将Android本机应用程序连接到该服务的后端时遇到一些困难,因此我首先尝试了一个简单的测试。
我已经通过门户使用以下代码创建了一个名为from queue import Empty
def do_multithreading(batches, counter, lock, proc):
"""Starts the multithreading"""
# Set the number of threads.
number_of_threads = 5
# Initializes the queue.
for batch in batches:
task_queue.put(batch)
# Starts the multithreading
for i in range(number_of_threads):
t = threading.Thread(target=manage_queue, args=[
task_queue, counter, lock, proc])
t.daemon = True
t.start()
task_queue.join()
def manage_queue(task_queue, counter, lock, proc):
while True:
try:
user = task_queue.get(False)
except Empty:
break
try:
get_tweet_objects(user, counter, lock, proc)
except Exception as exc:
print(exc)
finally:
task_queue.task_done()
def process_tasks(task_queue, counter, lock):
logger = multiprocessing.get_logger()
proc = os.getpid()
while True:
try:
user = task_queue.get(False)
except Empty:
break
try:
do_multithreading(user, counter, lock, proc)
except Exception as e:
logger.error(e)
logger.info(f'Process {proc} completed successfully')
return True
的{{1}},
Easy API
此api不需要身份验证(一切都定义为test_api1
)。
当我简单地通过浏览器调用它(通过转到module.exports = {
"get": function (req, res, next) {
res.status(200).type('text').send("1");
},
"post": function (req, res, next) {
res.status(200).type('text').send("2");
}
};
时),可以按预期在浏览器中看到anonymous
。
但是,当我尝试通过应用程序调用API时,出现错误。这是我用来调用API的代码:
https://*.azurewebsites.net/api/test_api1
1
是通过 private void testAPI() {
Log.d(LOG_TAG, "Running API");
ListenableFuture<JsonElement> res = this.azureClient.invokeApi("test_api1");
Futures.addCallback(res, new FutureCallback<JsonElement>() {
@Override
public void onSuccess(@Nullable JsonElement result) {
Log.d(LOG_TAG, "success");
if (result != null) {
Log.d(LOG_TAG, result.toString());
}
}
@Override
public void onFailure(Throwable t) {
Log.e(LOG_TAG, "failure", t);
}
});
}
通过以下方式启动的:
this.azureClient
当我运行该应用程序时,出现以下错误:
MainActivity
谢谢!
答案 0 :(得分:0)
这似乎是网络问题,并且由于与网络相关的问题,客户端无法解决此错误。但是,您可以做的是重试连接几次。在解决实际问题之前,这可能是一种解决方法。
示例代码:
for (int retries = 0; retries < 3; retries++) {
try {
final HttpClient client = createHttpClientWithDefaultSocketFactory(null, null);
final HttpResponse response = client.execute(get);
final int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
throw new IllegalStateException("GET Request on '" + get.getURI().toString() + "' resulted in " + statusCode);
} else {
return response.getEntity();
}
} catch (final java.net.SocketTimeoutException e) {
// connection timed out...let's try again
}
}
有效处理此问题的一种方法是定义一个连接超时,然后再使用try catch
块进行处理。...希望这将对以后遇到相同问题的任何人有所帮助。
HttpUrlConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(7000); //set the timeout in milliseconds
希望有帮助。