C# HttpClient PostAsync 不适用于 django rest 框架

Posted

技术标签:

【中文标题】C# HttpClient PostAsync 不适用于 django rest 框架【英文标题】:C# HttpClient PostAsync won't work with django rest framework 【发布时间】:2017-02-26 13:44:30 【问题描述】:

在 Django (DRF) 中

在 test.views.py 中

class TestAPIView(APIView):

    permission_classes = (AllowAny,)
    def post(self, request, format=None):
        print(request.data)
        return Response(request.data)

在 test.urls.py 中

from django.conf.urls import url
from .views import TestAPIView

urlpatterns = [
    url(r'^test/$', view=TestAPIView.as_view()),
]

如您所见,我的测试 url 应该返回帖子数据。 并且在可浏览的 api 和 Unity WWW 中运行良好(类似于统一提供的 httpclient)。

但它不适用于 HttpClient PostAsync(或 SendAsync)

这是我的 C# 代码

在 Xamarin/C# 中

    Post newPost = new Post  Title = "asdfasfa", Content = "asdfasffasf" ;

    var content = JsonConvert.SerializeObject(newPost);

    Debug.WriteLine(content);

    var response = await _client.PostAsync("http://127.0.0.1:8000/test/", new StringContent(content));

    var responseString = await response.Content.ReadAsStringAsync();

    Debug.WriteLine(responseString);

以及来自控制台的结果......

在 C# 控制台中

注释的字符串是我写的。不是来自控制台

"Id":0,"Title":"asdfasfa","Content":"asdfasffasf" // <- this is the sent data.
Thread started:  #6
Thread started:  #16
Thread started:  #17
 // <- and the received data

还有……

在 Django(DRF) 控制台中

[26/Feb/2017 13:37:34] "POST /test/ HTTP/1.1" 200 2
<QueryDict: >

我的帖子数据哪里去了??? django 收到&lt;QueryDict: &gt;

而且这只发生在 httpclient 上。也许只有 django。 我用 => https://jsonplaceholder.typicode.com/posts 对其进行了测试 并且帖子创建工作正常。

可能是 Django 问题,可能是 C# 问题,我不知道... 请帮忙!

ps?。 HttpWebRequest 也可以正常工作。

【问题讨论】:

您是否将 8000 端口转发到您的 Django 主机,因为127.0.0.1 是设备/模拟器的本地主机(假设此代码在设备/模拟器上运行,因为您有它标记为 Xamarin).... 您需要使用您的服务器的 IP 或 FQDN。使用环回地址将连接到您的应用正在运行的 DEVICE/EMULATOR,而不是服务器 检查您发送到服务器的内容类型。由于您在没有指定 mediaType 构造函数参数的情况下使用 StringContent - 我猜它会是“text\plain”,但您正在尝试传递 json 数据,所以应该是“application\json” 这真的与地址/模拟器/互联网配置无关,因为它与 HttpWebRequest.+ 一起工作得很好,同时使用 RestSharp 我发现了一些有趣的东西。当我将数据作为 json 提供时,它不会收到,但是使用 addparameter(balbla),效果很好。我猜测它的媒体类型或一些问题,但尝试使用@Evk 的解决方案,仍然无法正常工作.. 然后确保在服务器端检查您在请求中收到的标头。 【参考方案1】:

我根本不懂C#,但根据其他帖子(httpclient call to webapi to post data not working 或HttpClient is not posting form data),您可能需要在StringContent 中设置更多信息:

StringContent(content, Encoding.UTF8, "application/json")

【讨论】:

以上是关于C# HttpClient PostAsync 不适用于 django rest 框架的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient postasync,带有自定义标头和应用程序/json,用于正文 C#

C# HttpClient PostAsync 将 204 变成 404

使用 HttpClient PostAsync 发送 C# NameValueCollection 问题

C# HttpClient PostAsync 不适用于 django rest 框架

如何在 C# 中将 HttpClient PostAsync() 与线程池一起使用?

如何使用 C# HttpClient PostAsync 显示上传进度