将Python后端连接到Android APP

时间:2015-06-14 09:25:17

标签: python xamarin

如何使用python作为使用C#构建的Android应用程序的后端? Python后端是使用Flask框架编写的。 Android应用程序是使用xamarin构建的。

1 个答案:

答案 0 :(得分:2)

无论您的服务器或客户使用何种类型的技术,如果他们可以使用某种标准的“协议”进行相互通信。

有很多方法可以像套接字,xml,json等那样进行双方(客户端和服务器)的通信。他们只需要相互理解。

在您的特定情况下,我建议在服务器上构建REST或RESTful API(https://flask-restful.readthedocs.org/en/0.3.3/),并在客户端上构建REST客户端库。

有许多方法和库可以从C#调用REST API:

内置方法将使用HttpWebRequest,正如您在link上看到的那样:

private async Task<JsonValue> FetchWeatherAsync (string url)
{
    // Create an HTTP web request using the URL:
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create (new Uri (url));
    request.ContentType = "application/json";
    request.Method = "GET";

    // Send the request to the server and wait for the response:
    using (WebResponse response = await request.GetResponseAsync ())
    {
        // Get a stream representation of the HTTP web response:
        using (Stream stream = response.GetResponseStream ())
        {
            // Use this stream to build a JSON document object:
            JsonValue jsonDoc = await Task.Run (() => JsonObject.Load (stream));
            Console.Out.WriteLine("Response: {0}", jsonDoc.ToString ());

            // Return the JSON document:
            return jsonDoc;
        }
    }
}

但是如果你不想让你的应用到处都是废话(锅炉板代码),我不推荐它。

辅助库可以是,例如RESTSharp。它允许您轻松构建REST调用并将响应转换为您键入的对象。以下是示例:

var client = new RestClient("http://example.com");
// client.Authenticator = new HttpBasicAuthenticator(username, password);

var request = new RestRequest("resource/{id}", Method.POST);
request.AddParameter("name", "value"); // adds to POST or URL querystring based on Method
request.AddUrlSegment("id", "123"); // replaces matching token in request.Resource

// easily add HTTP Headers
request.AddHeader("header", "value");

// add files to upload (works with compatible verbs)
request.AddFile(path);

// execute the request
RestResponse response = client.Execute(request);
var content = response.Content; // raw content as string

// or automatically deserialize result
// return content type is sniffed but can be explicitly set via RestClient.AddHandler();
RestResponse<Person> response2 = client.Execute<Person>(request);
var name = response2.Data.Name;

// easy async support
client.ExecuteAsync(request, response => {
    Console.WriteLine(response.Content);
});

// async with deserialization
var asyncHandle = client.ExecuteAsync<Person>(request, response => {
    Console.WriteLine(response.Data.Name);
});

// abort the request on demand
asyncHandle.Abort();

您可以在google上搜索“C#REST客户端”并自行判断。但恕我直言,我曾经使用过的REST客户端代码更简单,更好用Refit。 为什么?只用一个接口定义API调用和响应。根本不需要编码!更重要的是,默认情况下,所有API调用都是异步的,这是移动应用程序响应所需的内容。来自作者的自述文件:

public interface IGitHubApi
{
    [Get("/users/{user}")]
    Task<User> GetUser(string user);
}

var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com");
var octocat = await gitHubApi.GetUser("octocat");

我在Xamarin Android / iOS项目中使用了这个库,效果很好。没问题。

希望有所帮助