2016-05-07 69 views
-3

實現POST以將JSON數據保存到本地文本文件的簡單方法是什麼?當我使用[FromBody]時,我一直得到空值,沒有它,它找不到POST資源。 基本上我想將原始數據保存到位於App_Data文件夾中的常規文本文件中。 謝謝。如何在web api中接收並保存JSON字符串

這裏是我的控制器

public HttpResponseMessage Post([FromBody]string jsonstring) 
     {   

      string json1 = HostingEnvironment.MapPath(@"~/App_Data/post.txt"); 
      string outp = jsonstring.ToString(); 
      File.WriteAllText(json1, outp); 

      return new HttpResponseMessage() 
     { 
      StatusCode = HttpStatusCode.Created 
     }; 

     } 

而且樣本的JSON數據,我嘗試後

{"system":{"programs":null,"info":null,"types":{"type1":"data1","type2":"data2",‌​"type3":"data3","type4":"data4","type5":"data5"},"name":"name1","name2":"name2","‌​sys":{"sys1":"info","sysv":"123"}},"files":{"file1":null,"file2":null,"file3":nul‌​l,"file4":"AA","file5":"11111","file6":null,"file7":"11131","fil38":null,"files5"‌​:null}} 

這是錯誤我在這行獲得:字符串OUTP = jsonstring.ToString( );

System.NullReferenceException was unhandled by user code 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=test 
    StackTrace: 
     at test.Controllers.testController.Post(String jsonstring) in c:\Users\test\test\Controllers\testController.cs:line 36 
     at lambda_method(Closure , Object , Object[]) 
     at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters) 
     at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) 
     at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c__DisplayClass5.<ExecuteAsync>b__4() 
     at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken) 
    InnerException: 

從小提琴手的原始代碼,但我得到了同樣的錯誤事件中,我只是把你好的字只有在身體..所以我不認爲這是JSON相關的錯誤

POST http://localhost:3281/api/test HTTP/1.1 
User-Agent: Fiddler 
Content-Type: application/json 
Host: localhost:3281 
Content-Length: 357 

{"system":{"programs":null,"info":null,"types":{"type1":"data1","type2":"data2",‌​"type3":"data3","type4":"data4","type5":"data5"},"name":"name1","name2":"name2","‌​sys":{"sys1":"info","sysv":"123"}},"files":{"file1":null,"file2":null,"file3":nul‌​l,"file4":"AA","file5":"11111","file6":null,"file7":"11131","fil38":null,"files5"‌​:null}} 
+0

請發表你的代碼的相關部分,所以我們可以嘗試看看有什麼不對。 – MattM

+0

你能用你的控制器中的代碼編輯你的問題嗎?聽起來控制器方法就是我們試圖解決的問題。請包括您使用[FromBody]。 – MattM

+0

嘗試將數據發佈到路由時,有很多事情可能會出錯。如果沒有至少一些服務器端代碼,我認爲我們不能說出發生了什麼。瞭解您如何發佈數據也是有幫助的,這樣我們就可以看到您提交請求的方式是否有問題。一般來說,雖然你應該能夠谷歌的WebAPI教程,將引導你通過這個。如果教程中存在令人困惑的部分,我們可以幫助填補空白。 – MattM

回答

0

假設你將數據作爲JSON對象發送而不是字符串,Post方法不能綁定對象(因爲方法需要一個字符串,而不是一個對象)。

此外,我相信你發佈的JSON是無效的JSON。嘗試發送更簡單的內容,只需在路由正常的情況下進行即可。確保您發送的JSON有效(我使用jsonlint.com進行測試)。

這裏是你可以發佈的內容的示例:

{ 
    "jsonstring": "foo" 
} 

我沒有測試過這一點,但是當你發佈此,jsonstring應該正確綁定到你的Post方法有參數,和值該字符串應該是「foo」。希望有所幫助。

+0

謝謝,但它不起作用。我發佈的示例json是有效的,它只是一個非常複雜的json數據,我只需要一些快速和骯髒的東西,而不是寫所有的模型和數據庫來實現它「正常」的方式。 – iit868

+0

當你使用我的例子,你會得到一個不同的錯誤? – MattM

+0

不,確切的說..我可能需要將數據作爲普通文本以某種方式對待,然後再嘗試保存它。 – iit868

0

基本上你的要求需要使用應用程序/ x-WWW窗體-urlencoded

POST http://localhost:3281/api/test HTTP/1.1 
User-Agent: Fiddler 
Content-Type: application/x-www-form-urlencoded 
Host: localhost:3281 
Content-Length: 357 
+0

謝謝,我曾嘗試將內容類型更改爲應用程序/ x-www-form-urlencoded,但無效。但在我的情況下,我不能更改客戶端發送其他應用程序/ JSON的內容類型。 – iit868

0

我找到了解決辦法

[HttpPost] 

    public async Task<HttpResponseMessage> Post(HttpRequestMessage request) 
    { 
     var jsonString = await request.Content.ReadAsStringAsync(); 

     string json1 = HostingEnvironment.MapPath(@"~/App_Data/Post.txt"); 

     File.WriteAllText(json1, jsonString); 

     return new HttpResponseMessage(HttpStatusCode.Created); 
    } 
相關問題